49 const char *str =
id.c_str();
51 if (*str ==
'$' && may_rename && !
norename)
54 if (str[0] !=
'\\' || str[1] !=
'_' || str[2] == 0)
57 for (
int i = 2; str[i] != 0; i++) {
58 if (str[i] ==
'_' && str[i+1] == 0)
60 if (str[i] <
'0' || str[i] >
'9')
64 int num = atoi(str+2);
77 for (
auto it = module->
wires_.begin(); it != module->
wires_.end(); it++)
80 for (
auto it = module->
cells_.begin(); it != module->
cells_.end(); it++) {
98 const char *str = internal_id.
c_str();
99 bool do_escape =
false;
104 return std::string(buffer);
110 if (
'0' <= *str && *str <=
'9')
113 for (
int i = 0; str[i]; i++)
115 if (
'0' <= str[i] && str[i] <=
'9')
117 if (
'a' <= str[i] && str[i] <=
'z')
119 if (
'A' <= str[i] && str[i] <=
'Z')
128 return "\\" + std::string(str) +
" ";
129 return std::string(str);
154 void dump_const(std::ostream &f,
const RTLIL::Const &data,
int width = -1,
int offset = 0,
bool no_decimal =
false,
bool set_signed =
false)
157 width = data.
bits.size() - offset;
159 if (width == 32 && !no_decimal) {
161 for (
int i = offset+width-1; i >= offset; i--) {
168 val |= 1 << (i - offset);
170 f <<
stringf(
"32'%sd%d", set_signed ?
"s" :
"", val);
173 f <<
stringf(
"%d'%sb", width, set_signed ?
"s" :
"");
176 for (
int i = offset+width-1; i >= offset; i--) {
178 switch (data.
bits[i]) {
191 for (
size_t i = 0; i < str.size(); i++) {
194 else if (str[i] ==
'\t')
196 else if (str[i] < 32)
197 f <<
stringf(
"\\%03o", str[i]);
198 else if (str[i] ==
'"')
200 else if (str[i] ==
'\\')
216 }
else if (chunk.
width == 1) {
240 for (
auto it = sig.
chunks().rbegin(); it != sig.
chunks().rend(); it++) {
241 if (it != sig.
chunks().rbegin())
249 void dump_attributes(std::ostream &f, std::string indent, std::map<RTLIL::IdString, RTLIL::Const> &attributes,
char term =
'\n')
253 for (
auto it = attributes.begin(); it != attributes.end(); it++) {
273 if (wire->
width != 1)
278 std::string range =
"";
279 if (wire->
width != 1) {
286 f <<
stringf(
"%s" "input%s %s;\n", indent.c_str(), range.c_str(),
id(wire->
name).c_str());
288 f <<
stringf(
"%s" "output%s %s;\n", indent.c_str(), range.c_str(),
id(wire->
name).c_str());
290 f <<
stringf(
"%s" "inout%s %s;\n", indent.c_str(), range.c_str(),
id(wire->
name).c_str());
292 f <<
stringf(
"%s" "reg%s %s;\n", indent.c_str(), range.c_str(),
id(wire->
name).c_str());
294 f <<
stringf(
"%s" "wire%s %s;\n", indent.c_str(), range.c_str(),
id(wire->
name).c_str());
301 f <<
stringf(
"%s" "reg [%d:0] %s [%d:0];\n", indent.c_str(), memory->
width-1,
id(memory->
name).c_str(), memory->
size-1);
306 if (gen_signed && cell->
parameters.count(
"\\" + port +
"_SIGNED") > 0 && cell->
parameters[
"\\" + port +
"_SIGNED"].as_bool()) {
320 goto no_special_reg_name;
324 if (wire->
name[0] !=
'\\')
325 goto no_special_reg_name;
327 std::string cell_name = wire->
name.
str();
329 size_t pos = cell_name.find(
'[');
330 if (pos != std::string::npos)
331 cell_name = cell_name.substr(0, pos) +
"_reg" + cell_name.substr(pos);
333 cell_name = cell_name +
"_reg";
335 if (wire->
width != 1)
338 if (active_module && active_module->
count_id(cell_name) > 0)
339 goto no_special_reg_name;
341 return id(cell_name);
346 return id(cell->
name).c_str();
352 f <<
stringf(
"%s" "assign ", indent.c_str());
354 f <<
stringf(
" = %s ", op.c_str());
362 f <<
stringf(
"%s" "assign ", indent.c_str());
366 f <<
stringf(
" %s ", op.c_str());
374 if (cell->
type ==
"$_NOT_") {
375 f <<
stringf(
"%s" "assign ", indent.c_str());
385 if (cell->
type.
in(
"$_AND_",
"$_NAND_",
"$_OR_",
"$_NOR_",
"$_XOR_",
"$_XNOR_")) {
386 f <<
stringf(
"%s" "assign ", indent.c_str());
389 if (cell->
type.
in(
"$_NAND_",
"$_NOR_",
"$_XNOR_"))
393 if (cell->
type.
in(
"$_AND_",
"$_NAND_"))
395 if (cell->
type.
in(
"$_OR_",
"$_NOR_"))
397 if (cell->
type.
in(
"$_XOR_",
"$_XNOR_"))
402 if (cell->
type.
in(
"$_NAND_",
"$_NOR_",
"$_XNOR_"))
408 if (cell->
type ==
"$_MUX_") {
409 f <<
stringf(
"%s" "assign ", indent.c_str());
422 if (cell->
type.
in(
"$_AOI3_",
"$_OAI3_")) {
423 f <<
stringf(
"%s" "assign ", indent.c_str());
427 f <<
stringf(cell->
type ==
"$_AOI3_" ?
" & " :
" | ");
429 f <<
stringf(cell->
type ==
"$_AOI3_" ?
") |" :
") &");
437 if (cell->
type.
in(
"$_AOI4_",
"$_OAI4_")) {
438 f <<
stringf(
"%s" "assign ", indent.c_str());
442 f <<
stringf(cell->
type ==
"$_AOI4_" ?
" & " :
" | ");
444 f <<
stringf(cell->
type ==
"$_AOI4_" ?
") |" :
") &");
448 f <<
stringf(cell->
type ==
"$_AOI4_" ?
" & " :
" | ");
456 std::string reg_name =
cellname(cell);
459 if (!out_is_reg_wire)
460 f <<
stringf(
"%s" "reg %s;\n", indent.c_str(), reg_name.c_str());
463 f <<
stringf(
"%s" "always @(%sedge ", indent.c_str(), cell->
type[6] ==
'P' ?
"pos" :
"neg");
465 if (cell->
type[7] !=
'_') {
466 f <<
stringf(
" or %sedge ", cell->
type[7] ==
'P' ?
"pos" :
"neg");
471 if (cell->
type[7] !=
'_') {
472 f <<
stringf(
"%s" " if (%s", indent.c_str(), cell->
type[7] ==
'P' ?
"" :
"!");
475 f <<
stringf(
"%s" " %s <= %c;\n", indent.c_str(), reg_name.c_str(), cell->
type[8]);
476 f <<
stringf(
"%s" " else\n", indent.c_str());
479 f <<
stringf(
"%s" " %s <= ", indent.c_str(), reg_name.c_str());
483 if (!out_is_reg_wire) {
484 f <<
stringf(
"%s" "assign ", indent.c_str());
486 f <<
stringf(
" = %s;\n", reg_name.c_str());
494 char pol_c = cell->
type[8], pol_s = cell->
type[9], pol_r = cell->
type[10];
496 std::string reg_name =
cellname(cell);
499 if (!out_is_reg_wire)
500 f <<
stringf(
"%s" "reg %s;\n", indent.c_str(), reg_name.c_str());
503 f <<
stringf(
"%s" "always @(%sedge ", indent.c_str(), pol_c ==
'P' ?
"pos" :
"neg");
505 f <<
stringf(
" or %sedge ", pol_s ==
'P' ?
"pos" :
"neg");
507 f <<
stringf(
" or %sedge ", pol_r ==
'P' ?
"pos" :
"neg");
511 f <<
stringf(
"%s" " if (%s", indent.c_str(), pol_r ==
'P' ?
"" :
"!");
514 f <<
stringf(
"%s" " %s <= 0;\n", indent.c_str(), reg_name.c_str());
516 f <<
stringf(
"%s" " else if (%s", indent.c_str(), pol_s ==
'P' ?
"" :
"!");
519 f <<
stringf(
"%s" " %s <= 1;\n", indent.c_str(), reg_name.c_str());
521 f <<
stringf(
"%s" " else\n", indent.c_str());
522 f <<
stringf(
"%s" " %s <= ", indent.c_str(), reg_name.c_str());
526 if (!out_is_reg_wire) {
527 f <<
stringf(
"%s" "assign ", indent.c_str());
529 f <<
stringf(
" = %s;\n", reg_name.c_str());
535 #define HANDLE_UNIOP(_type, _operator) \
536 if (cell->type ==_type) { dump_cell_expr_uniop(f, indent, cell, _operator); return true; }
537 #define HANDLE_BINOP(_type, _operator) \
538 if (cell->type ==_type) { dump_cell_expr_binop(f, indent, cell, _operator); return true; }
583 if (cell->
type ==
"$mux")
585 f <<
stringf(
"%s" "assign ", indent.c_str());
598 if (cell->
type ==
"$pmux" || cell->
type ==
"$pmux_safe")
600 int width = cell->
parameters[
"\\WIDTH"].as_int();
602 std::string func_name =
cellname(cell);
604 f <<
stringf(
"%s" "function [%d:0] %s;\n", indent.c_str(), width-1, func_name.c_str());
605 f <<
stringf(
"%s" " input [%d:0] a;\n", indent.c_str(), width-1);
606 f <<
stringf(
"%s" " input [%d:0] b;\n", indent.c_str(), s_width*width-1);
607 f <<
stringf(
"%s" " input [%d:0] s;\n", indent.c_str(), s_width-1);
611 f <<
stringf(
"%s" " (* parallel_case *)\n", indent.c_str());
612 f <<
stringf(
"%s" " casez (s)", indent.c_str());
613 if (cell->
type !=
"$pmux_safe")
614 f <<
stringf(
noattr ?
" // synopsys parallel_case\n" :
"\n");
616 for (
int i = 0; i < s_width; i++)
618 f <<
stringf(
"%s" " %d'b", indent.c_str(), s_width);
620 for (
int j = s_width-1; j >= 0; j--)
621 f <<
stringf(
"%c", j == i ?
'1' : cell->
type ==
"$pmux_safe" ?
'0' :
'?');
624 f <<
stringf(
"%s" " %s = b[%d:%d];\n", indent.c_str(), func_name.c_str(), (i+1)*width-1, i*width);
627 f <<
stringf(
"%s" " default:\n", indent.c_str());
628 f <<
stringf(
"%s" " %s = a;\n", indent.c_str(), func_name.c_str());
630 f <<
stringf(
"%s" " endcase\n", indent.c_str());
631 f <<
stringf(
"%s" "endfunction\n", indent.c_str());
633 f <<
stringf(
"%s" "assign ", indent.c_str());
635 f <<
stringf(
" = %s(", func_name.c_str());
645 if (cell->
type ==
"$slice")
647 f <<
stringf(
"%s" "assign ", indent.c_str());
655 if (cell->
type ==
"$concat")
657 f <<
stringf(
"%s" "assign ", indent.c_str());
667 if (cell->
type ==
"$dff" || cell->
type ==
"$adff")
670 bool pol_clk, pol_arst =
false;
672 sig_clk = cell->
getPort(
"\\CLK");
673 pol_clk = cell->
parameters[
"\\CLK_POLARITY"].as_bool();
675 if (cell->
type ==
"$adff") {
676 sig_arst = cell->
getPort(
"\\ARST");
677 pol_arst = cell->
parameters[
"\\ARST_POLARITY"].as_bool();
681 std::string reg_name =
cellname(cell);
684 if (!out_is_reg_wire)
685 f <<
stringf(
"%s" "reg [%d:0] %s;\n", indent.c_str(), cell->
parameters[
"\\WIDTH"].as_int()-1, reg_name.c_str());
687 f <<
stringf(
"%s" "always @(%sedge ", indent.c_str(), pol_clk ?
"pos" :
"neg");
689 if (cell->
type ==
"$adff") {
690 f <<
stringf(
" or %sedge ", pol_arst ?
"pos" :
"neg");
695 if (cell->
type ==
"$adff") {
696 f <<
stringf(
"%s" " if (%s", indent.c_str(), pol_arst ?
"" :
"!");
699 f <<
stringf(
"%s" " %s <= ", indent.c_str(), reg_name.c_str());
702 f <<
stringf(
"%s" " else\n", indent.c_str());
705 f <<
stringf(
"%s" " %s <= ", indent.c_str(), reg_name.c_str());
709 if (!out_is_reg_wire) {
710 f <<
stringf(
"%s" "assign ", indent.c_str());
712 f <<
stringf(
" = %s;\n", reg_name.c_str());
732 f <<
stringf(
"%s" "%s", indent.c_str(),
id(cell->
type,
false).c_str());
739 f <<
stringf(
"\n%s .%s(", indent.c_str(),
id(it->first).c_str());
741 dump_const(f, it->second, -1, 0, !is_signed, is_signed);
744 f <<
stringf(
"\n%s" ")", indent.c_str());
747 std::string cell_name =
cellname(cell);
748 if (cell_name !=
id(cell->
name))
749 f <<
stringf(
" %s /* %s */ (", cell_name.c_str(),
id(cell->
name).c_str());
751 f <<
stringf(
" %s (", cell_name.c_str());
753 bool first_arg =
true;
754 std::set<RTLIL::IdString> numbered_ports;
755 for (
int i = 1;
true; i++) {
757 snprintf(str, 16,
"$%d", i);
759 if (it->first != str)
764 f <<
stringf(
"\n%s ", indent.c_str());
766 numbered_ports.insert(it->first);
767 goto found_numbered_port;
770 found_numbered_port:;
773 if (numbered_ports.count(it->first))
778 f <<
stringf(
"\n%s .%s(", indent.c_str(),
id(it->first).c_str());
779 if (it->second.size() > 0)
783 f <<
stringf(
"\n%s" ");\n", indent.c_str());
788 f <<
stringf(
"%s" "assign ", indent.c_str());
801 if (!omit_trailing_begin && number_of_stmts >= 2)
802 f <<
stringf(
"%s" "begin\n", indent.c_str());
804 for (
auto it = cs->
actions.begin(); it != cs->
actions.end(); it++) {
805 if (it->first.size() == 0)
807 f <<
stringf(
"%s ", indent.c_str());
817 if (!omit_trailing_begin && number_of_stmts == 0)
818 f <<
stringf(
"%s /* empty */;\n", indent.c_str());
820 if (omit_trailing_begin || number_of_stmts >= 2)
821 f <<
stringf(
"%s" "end\n", indent.c_str());
827 f <<
stringf(
"%s" "begin\n", indent.c_str());
828 for (
auto it = sw->
cases.begin(); it != sw->
cases.end(); it++) {
829 if ((*it)->compare.size() == 0)
832 f <<
stringf(
"%s" "end\n", indent.c_str());
836 f <<
stringf(
"%s" "casez (", indent.c_str());
840 for (
auto it = sw->
cases.begin(); it != sw->
cases.end(); it++) {
841 f <<
stringf(
"%s ", indent.c_str());
842 if ((*it)->compare.size() == 0)
845 for (
size_t i = 0; i < (*it)->compare.size(); i++) {
855 f <<
stringf(
"%s" "endcase\n", indent.c_str());
861 for (
auto it2 = (*it)->cases.begin(); it2 != (*it)->cases.end(); it2++)
864 for (
auto it = cs->
actions.begin(); it != cs->
actions.end(); it++) {
865 for (
auto &c : it->first.chunks())
875 for (
auto it = proc->
syncs.begin(); it != proc->
syncs.end(); it++)
876 for (
auto it2 = (*it)->actions.begin(); it2 != (*it)->actions.end(); it2++) {
877 for (
auto &c : it2->first.chunks())
884 f <<
stringf(
"%s" "always @* begin\n", indent.c_str());
887 std::string backup_indent = indent;
889 for (
size_t i = 0; i < proc->
syncs.size(); i++)
892 indent = backup_indent;
895 f <<
stringf(
"%s" "always @* begin\n", indent.c_str());
897 f <<
stringf(
"%s" "always @(", indent.c_str());
905 std::string ends = indent +
"end\n";
912 ends = indent +
"end\n" + ends;
917 for (
size_t j = 0; j < proc->
syncs.size(); j++) {
923 ends = indent +
"end\n" + ends;
929 for (
auto it = sync->
actions.begin(); it != sync->
actions.end(); it++) {
930 if (it->first.size() == 0)
932 f <<
stringf(
"%s ", indent.c_str());
939 f <<
stringf(
"%s", ends.c_str());
955 std::set<std::pair<RTLIL::Wire*,int>> reg_bits;
956 for (
auto &it : module->
cells_)
967 for (
int i = 0; i < chunk.
width; i++)
968 reg_bits.insert(std::pair<RTLIL::Wire*,int>(chunk.
wire, chunk.
offset+i));
971 for (
auto &it : module->
wires_)
974 for (
int i = 0; i < wire->
width; i++)
975 if (reg_bits.count(std::pair<RTLIL::Wire*,int>(wire, i)) == 0)
976 goto this_wire_aint_reg;
984 f <<
stringf(
"%s" "module %s(", indent.c_str(),
id(module->
name,
false).c_str());
985 bool keep_running =
true;
986 for (
int port_id = 1; keep_running; port_id++) {
987 keep_running =
false;
988 for (
auto it = module->
wires_.begin(); it != module->
wires_.end(); it++) {
990 if (wire->
port_id == port_id) {
1001 for (
auto it = module->
wires_.begin(); it != module->
wires_.end(); it++)
1004 for (
auto it = module->
memories.begin(); it != module->
memories.end(); it++)
1007 for (
auto it = module->
cells_.begin(); it != module->
cells_.end(); it++)
1014 dump_conn(f, indent +
" ", it->first, it->second);
1016 f <<
stringf(
"%s" "endmodule\n", indent.c_str());
1017 active_module =
NULL;
1026 log(
" write_verilog [options] [filename]\n");
1028 log(
"Write the current design to a verilog file.\n");
1030 log(
" -norename\n");
1031 log(
" without this option all internal object names (the ones with a dollar\n");
1032 log(
" instead of a backslash prefix) are changed to short names in the\n");
1033 log(
" format '_<number>_'.\n");
1036 log(
" with this option no attributes are included in the output\n");
1038 log(
" -attr2comment\n");
1039 log(
" with this option attributes are included as comments in the output\n");
1042 log(
" without this option all internal cells are converted to verilog\n");
1043 log(
" expressions.\n");
1045 log(
" -blackboxes\n");
1046 log(
" usually modules with the 'blackbox' attribute are ignored. with\n");
1047 log(
" this option set only the modules with the 'blackbox' attribute\n");
1048 log(
" are written to the output file.\n");
1050 log(
" -selected\n");
1051 log(
" only write selected modules. modules must be selected entirely or\n");
1052 log(
" not at all.\n");
1064 bool blackboxes =
false;
1065 bool selected =
false;
1072 reg_ct.insert(
"$_DFF_N_");
1073 reg_ct.insert(
"$_DFF_P_");
1075 reg_ct.insert(
"$_DFF_NN0_");
1076 reg_ct.insert(
"$_DFF_NN1_");
1077 reg_ct.insert(
"$_DFF_NP0_");
1078 reg_ct.insert(
"$_DFF_NP1_");
1079 reg_ct.insert(
"$_DFF_PN0_");
1080 reg_ct.insert(
"$_DFF_PN1_");
1081 reg_ct.insert(
"$_DFF_PP0_");
1082 reg_ct.insert(
"$_DFF_PP1_");
1084 reg_ct.insert(
"$_DFFSR_NNN_");
1085 reg_ct.insert(
"$_DFFSR_NNP_");
1086 reg_ct.insert(
"$_DFFSR_NPN_");
1087 reg_ct.insert(
"$_DFFSR_NPP_");
1088 reg_ct.insert(
"$_DFFSR_PNN_");
1089 reg_ct.insert(
"$_DFFSR_PNP_");
1090 reg_ct.insert(
"$_DFFSR_PPN_");
1091 reg_ct.insert(
"$_DFFSR_PPP_");
1094 for (argidx = 1; argidx < args.size(); argidx++) {
1095 std::string arg = args[argidx];
1096 if (arg ==
"-norename") {
1100 if (arg ==
"-noattr") {
1104 if (arg ==
"-attr2comment") {
1108 if (arg ==
"-noexpr") {
1112 if (arg ==
"-blackboxes") {
1116 if (arg ==
"-selected") {
1125 for (
auto it = design->
modules_.begin(); it != design->
modules_.end(); it++) {
1126 if (it->second->get_bool_attribute(
"\\blackbox") != blackboxes)
1133 log(
"Dumping module `%s'.\n", it->first.c_str());
const char * yosys_version_str
const char * c_str() const
std::string stringf(const char *fmt,...)
std::set< RTLIL::IdString > reg_wires
void dump_wire(std::ostream &f, std::string indent, RTLIL::Wire *wire)
bool selected_module(RTLIL::IdString mod_name) const
bool dump_cell_expr(std::ostream &f, std::string indent, RTLIL::Cell *cell)
virtual void execute(std::ostream *&f, std::string filename, std::vector< std::string > args, RTLIL::Design *design)
void log_header(const char *format,...)
const std::vector< RTLIL::SigSig > & connections() const
std::map< RTLIL::IdString, RTLIL::Wire * > wires_
RTLIL_ATTRIBUTE_MEMBERS std::vector< RTLIL::CaseRule * > cases
std::map< RTLIL::IdString, RTLIL::Memory * > memories
void dump_module(std::ostream &f, std::string indent, RTLIL::Module *module)
bool is_reg_wire(RTLIL::SigSpec sig, std::string ®_name)
void log_error(const char *format,...)
std::string cellname(RTLIL::Cell *cell)
void dump_conn(std::ostream &f, std::string indent, const RTLIL::SigSpec &left, const RTLIL::SigSpec &right)
std::map< RTLIL::IdString, RTLIL::Const > parameters
bool in(T first, Args...rest)
void dump_sigspec(std::ostream &f, const RTLIL::SigSpec &sig)
void dump_cell_expr_uniop(std::ostream &f, std::string indent, RTLIL::Cell *cell, std::string op)
void dump_sigchunk(std::ostream &f, const RTLIL::SigChunk &chunk, bool no_decimal=false)
void dump_process(std::ostream &f, std::string indent, RTLIL::Process *proc, bool find_regs=false)
void extra_args(std::ostream *&f, std::string &filename, std::vector< std::string > args, size_t argidx)
#define PRIVATE_NAMESPACE_BEGIN
RTLIL_ATTRIBUTE_MEMBERS bool hasPort(RTLIL::IdString portname) const
const RTLIL::SigSpec & getPort(RTLIL::IdString portname) const
void reset_auto_counter(RTLIL::Module *module)
int GetSize(RTLIL::Wire *wire)
void dump_cell(std::ostream &f, std::string indent, RTLIL::Cell *cell)
#define HANDLE_BINOP(_type, _operator)
std::string decode_string() const
#define log_assert(_assert_expr_)
bool is_fully_const() const
void dump_proc_switch(std::ostream &f, std::string indent, RTLIL::SwitchRule *sw)
RTLIL::SigChunk as_chunk() const
bool selected_whole_module(RTLIL::IdString mod_name) const
void dump_const(std::ostream &f, const RTLIL::Const &data, int width=-1, int offset=0, bool no_decimal=false, bool set_signed=false)
USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN bool attr2comment
#define PRIVATE_NAMESPACE_END
VerilogBackend VerilogBackend
std::vector< RTLIL::SigSig > actions
static const char * id2cstr(const RTLIL::IdString &str)
void log_cmd_error(const char *format,...)
std::map< RTLIL::IdString, RTLIL::Process * > processes
void case_body_find_regs(RTLIL::CaseRule *cs)
std::string substr(size_t pos=0, size_t len=std::string::npos) const
#define USING_YOSYS_NAMESPACE
virtual size_t count_id(RTLIL::IdString id)
std::map< RTLIL::IdString, RTLIL::Module * > modules_
std::map< RTLIL::IdString, int > auto_name_map
std::map< RTLIL::IdString, RTLIL::Cell * > cells_
void dump_cell_expr_port(std::ostream &f, RTLIL::Cell *cell, std::string port, bool gen_signed=true)
std::set< RTLIL::IdString > reg_ct
void log(const char *format,...)
std::vector< RTLIL::SyncRule * > syncs
#define HANDLE_UNIOP(_type, _operator)
USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN bool norename
RTLIL::Module * active_module
void reset_auto_counter_id(RTLIL::IdString id, bool may_rename)
std::vector< RTLIL::State > bits
std::vector< RTLIL::SigSig > actions
void dump_memory(std::ostream &f, std::string indent, RTLIL::Memory *memory)
USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN bool noexpr
std::string id(RTLIL::IdString internal_id, bool may_rename=true)
void dump_attributes(std::ostream &f, std::string indent, std::map< RTLIL::IdString, RTLIL::Const > &attributes, char term= '\n')
std::vector< RTLIL::SwitchRule * > switches
void dump_cell_expr_binop(std::ostream &f, std::string indent, RTLIL::Cell *cell, std::string op)
const std::map< RTLIL::IdString, RTLIL::SigSpec > & connections() const
std::vector< RTLIL::State > data
void dump_case_body(std::ostream &f, std::string indent, RTLIL::CaseRule *cs, bool omit_trailing_begin=false)
USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN bool noattr
const std::vector< RTLIL::SigChunk > & chunks() const
RTLIL_ATTRIBUTE_MEMBERS RTLIL::CaseRule root_case