mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	Use well-known constants in ID macro and make the constant values known at compile time
This commit is contained in:
		
							parent
							
								
									3d14108a96
								
							
						
					
					
						commit
						23af52c3c8
					
				
					 5 changed files with 294 additions and 172 deletions
				
			
		|  | @ -1,27 +1,27 @@ | ||||||
|  | // These must be in perfect ASCII order!!!
 | ||||||
|  | X($_AND_) | ||||||
|  | X($_OR_) | ||||||
|  | X($_XOR_) | ||||||
|  | X($add) | ||||||
|  | X($and) | ||||||
|  | X($logic_and) | ||||||
|  | X($logic_or) | ||||||
|  | X($mul) | ||||||
|  | X($or) | ||||||
|  | X($pmux) | ||||||
|  | X($reduce_and) | ||||||
|  | X($reduce_bool) | ||||||
|  | X($reduce_or) | ||||||
|  | X($reduce_xnor) | ||||||
|  | X($reduce_xor) | ||||||
|  | X($xor) | ||||||
| X(A) | X(A) | ||||||
| X(abc9_box) |  | ||||||
| X(abc9_box_id) |  | ||||||
| X(abc9_box_seq) |  | ||||||
| X(abc9_bypass) |  | ||||||
| X(abc9_carry) |  | ||||||
| X(abc9_flop) |  | ||||||
| X(abc9_keep) |  | ||||||
| X(abc9_lut) |  | ||||||
| X(abc9_mergeability) |  | ||||||
| X(abc9_scc_id) |  | ||||||
| X(abcgroup) |  | ||||||
| X(ABITS) | X(ABITS) | ||||||
| X(AD) | X(AD) | ||||||
|  | X(ADDEND_NEGATED) | ||||||
| X(ADDR) | X(ADDR) | ||||||
| X(allconst) |  | ||||||
| X(allseq) |  | ||||||
| X(ALOAD) | X(ALOAD) | ||||||
| X(ALOAD_POLARITY) | X(ALOAD_POLARITY) | ||||||
| X(always_comb) |  | ||||||
| X(always_ff) |  | ||||||
| X(always_latch) |  | ||||||
| X(anyconst) |  | ||||||
| X(anyseq) |  | ||||||
| X(ARGS) | X(ARGS) | ||||||
| X(ARGS_WIDTH) | X(ARGS_WIDTH) | ||||||
| X(ARST) | X(ARST) | ||||||
|  | @ -29,27 +29,21 @@ X(ARST_POLARITY) | ||||||
| X(ARST_VALUE) | X(ARST_VALUE) | ||||||
| X(A_SIGNED) | X(A_SIGNED) | ||||||
| X(A_WIDTH) | X(A_WIDTH) | ||||||
|  | X(A_WIDTHS) | ||||||
| X(B) | X(B) | ||||||
| X(BI) | X(BI) | ||||||
| X(BITS_USED) | X(BITS_USED) | ||||||
| X(blackbox) |  | ||||||
| X(B_SIGNED) |  | ||||||
| X(bugpoint_keep) |  | ||||||
| X(B_WIDTH) |  | ||||||
| X(BYTE) | X(BYTE) | ||||||
|  | X(B_SIGNED) | ||||||
|  | X(B_WIDTH) | ||||||
|  | X(B_WIDTHS) | ||||||
| X(C) | X(C) | ||||||
| X(cells_not_processed) |  | ||||||
| X(CE_OVER_SRST) | X(CE_OVER_SRST) | ||||||
| X(CFG_ABITS) | X(CFG_ABITS) | ||||||
| X(CFG_DBITS) | X(CFG_DBITS) | ||||||
| X(CFG_INIT) | X(CFG_INIT) | ||||||
| X(chain) |  | ||||||
| X(CI) | X(CI) | ||||||
| X(CLK) | X(CLK) | ||||||
| X(clkbuf_driver) |  | ||||||
| X(clkbuf_inhibit) |  | ||||||
| X(clkbuf_inv) |  | ||||||
| X(clkbuf_sink) |  | ||||||
| X(CLK_ENABLE) | X(CLK_ENABLE) | ||||||
| X(CLK_POLARITY) | X(CLK_POLARITY) | ||||||
| X(CLR) | X(CLR) | ||||||
|  | @ -62,12 +56,13 @@ X(CTRL_IN) | ||||||
| X(CTRL_IN_WIDTH) | X(CTRL_IN_WIDTH) | ||||||
| X(CTRL_OUT) | X(CTRL_OUT) | ||||||
| X(CTRL_OUT_WIDTH) | X(CTRL_OUT_WIDTH) | ||||||
|  | X(C_SIGNED) | ||||||
|  | X(C_WIDTHS) | ||||||
| X(D) | X(D) | ||||||
| X(DAT) | X(DAT) | ||||||
| X(DATA) | X(DATA) | ||||||
| X(DAT_DST_PEN) | X(DAT_DST_PEN) | ||||||
| X(DAT_DST_POL) | X(DAT_DST_POL) | ||||||
| X(defaultvalue) |  | ||||||
| X(DELAY) | X(DELAY) | ||||||
| X(DEPTH) | X(DEPTH) | ||||||
| X(DST) | X(DST) | ||||||
|  | @ -75,7 +70,6 @@ X(DST_EN) | ||||||
| X(DST_PEN) | X(DST_PEN) | ||||||
| X(DST_POL) | X(DST_POL) | ||||||
| X(DST_WIDTH) | X(DST_WIDTH) | ||||||
| X(dynports) |  | ||||||
| X(E) | X(E) | ||||||
| X(EDGE_EN) | X(EDGE_EN) | ||||||
| X(EDGE_POL) | X(EDGE_POL) | ||||||
|  | @ -83,82 +77,34 @@ X(EN) | ||||||
| X(EN_DST) | X(EN_DST) | ||||||
| X(EN_POLARITY) | X(EN_POLARITY) | ||||||
| X(EN_SRC) | X(EN_SRC) | ||||||
| X(enum_base_type) |  | ||||||
| X(enum_type) |  | ||||||
| X(equiv_merged) |  | ||||||
| X(equiv_region) |  | ||||||
| X(extract_order) |  | ||||||
| X(F) | X(F) | ||||||
| X(FLAVOR) | X(FLAVOR) | ||||||
| X(FORMAT) | X(FORMAT) | ||||||
| X(force_downto) |  | ||||||
| X(force_upto) |  | ||||||
| X(fsm_encoding) |  | ||||||
| X(fsm_export) |  | ||||||
| X(FULL) | X(FULL) | ||||||
| X(full_case) |  | ||||||
| X(G) | X(G) | ||||||
| X(gclk) |  | ||||||
| X(gentb_clock) |  | ||||||
| X(gentb_constant) |  | ||||||
| X(gentb_skip) |  | ||||||
| X(H) | X(H) | ||||||
| X(hdlname) |  | ||||||
| X(hierconn) |  | ||||||
| X(I) | X(I) | ||||||
| X(INIT) | X(INIT) | ||||||
| X(INIT_VALUE) | X(INIT_VALUE) | ||||||
| X(init) |  | ||||||
| X(initial_top) |  | ||||||
| X(interface_modport) |  | ||||||
| X(interfaces_replaced_in_module) |  | ||||||
| X(interface_type) |  | ||||||
| X(invertible_pin) |  | ||||||
| X(iopad_external_pin) |  | ||||||
| X(is_interface) |  | ||||||
| X(J) | X(J) | ||||||
| X(K) | X(K) | ||||||
| X(keep) |  | ||||||
| X(keep_hierarchy) |  | ||||||
| X(L) | X(L) | ||||||
| X(lib_whitebox) |  | ||||||
| X(localparam) |  | ||||||
| X(logic_block) |  | ||||||
| X(lram) |  | ||||||
| X(LUT) | X(LUT) | ||||||
| X(lut_keep) |  | ||||||
| X(M) | X(M) | ||||||
| X(maximize) |  | ||||||
| X(mem2reg) |  | ||||||
| X(MEMID) | X(MEMID) | ||||||
| X(minimize) |  | ||||||
| X(module_not_derived) |  | ||||||
| X(N) | X(N) | ||||||
|  | X(NADDENDS) | ||||||
| X(NAME) | X(NAME) | ||||||
| X(noblackbox) | X(NPRODUCTS) | ||||||
| X(nolatches) |  | ||||||
| X(nomem2init) |  | ||||||
| X(nomem2reg) |  | ||||||
| X(nomeminit) |  | ||||||
| X(nosync) |  | ||||||
| X(nowrshmsk) |  | ||||||
| X(no_ram) |  | ||||||
| X(no_rw_check) |  | ||||||
| X(O) | X(O) | ||||||
| X(OFFSET) | X(OFFSET) | ||||||
| X(onehot) |  | ||||||
| X(P) | X(P) | ||||||
| X(parallel_case) |  | ||||||
| X(parameter) |  | ||||||
| X(PORTID) | X(PORTID) | ||||||
| X(PRIORITY) | X(PRIORITY) | ||||||
| X(PRIORITY_MASK) | X(PRIORITY_MASK) | ||||||
| X(promoted_if) | X(PRODUCT_NEGATED) | ||||||
| X(Q) | X(Q) | ||||||
| X(R) | X(R) | ||||||
| X(ram_block) |  | ||||||
| X(ram_style) |  | ||||||
| X(ramstyle) |  | ||||||
| X(RD_ADDR) | X(RD_ADDR) | ||||||
| X(RD_ARST) | X(RD_ARST) | ||||||
| X(RD_ARST_VALUE) | X(RD_ARST_VALUE) | ||||||
|  | @ -176,19 +122,11 @@ X(RD_SRST_VALUE) | ||||||
| X(RD_TRANSPARENCY_MASK) | X(RD_TRANSPARENCY_MASK) | ||||||
| X(RD_TRANSPARENT) | X(RD_TRANSPARENT) | ||||||
| X(RD_WIDE_CONTINUATION) | X(RD_WIDE_CONTINUATION) | ||||||
| X(reg) |  | ||||||
| X(replaced_by_gclk) |  | ||||||
| X(reprocess_after) |  | ||||||
| X(rom_block) |  | ||||||
| X(rom_style) |  | ||||||
| X(romstyle) |  | ||||||
| X(S) | X(S) | ||||||
| X(SET) | X(SET) | ||||||
| X(SET_POLARITY) | X(SET_POLARITY) | ||||||
| X(single_bit_vector) |  | ||||||
| X(SIZE) | X(SIZE) | ||||||
| X(SRC) | X(SRC) | ||||||
| X(src) |  | ||||||
| X(SRC_DST_PEN) | X(SRC_DST_PEN) | ||||||
| X(SRC_DST_POL) | X(SRC_DST_POL) | ||||||
| X(SRC_EN) | X(SRC_EN) | ||||||
|  | @ -198,34 +136,24 @@ X(SRC_WIDTH) | ||||||
| X(SRST) | X(SRST) | ||||||
| X(SRST_POLARITY) | X(SRST_POLARITY) | ||||||
| X(SRST_VALUE) | X(SRST_VALUE) | ||||||
| X(sta_arrival) |  | ||||||
| X(STATE_BITS) | X(STATE_BITS) | ||||||
| X(STATE_NUM) | X(STATE_NUM) | ||||||
| X(STATE_NUM_LOG2) | X(STATE_NUM_LOG2) | ||||||
| X(STATE_RST) | X(STATE_RST) | ||||||
| X(STATE_TABLE) | X(STATE_TABLE) | ||||||
| X(smtlib2_module) |  | ||||||
| X(smtlib2_comb_expr) |  | ||||||
| X(submod) |  | ||||||
| X(syn_ramstyle) |  | ||||||
| X(syn_romstyle) |  | ||||||
| X(S_WIDTH) | X(S_WIDTH) | ||||||
| X(T) | X(T) | ||||||
| X(TABLE) | X(TABLE) | ||||||
| X(TAG) | X(TAG) | ||||||
| X(techmap_autopurge) | X(TRANSPARENCY_MASK) | ||||||
| X(_TECHMAP_BITS_CONNMAP_) | X(TRANSPARENT) | ||||||
| X(_TECHMAP_CELLNAME_) | X(TRANS_NUM) | ||||||
| X(_TECHMAP_CELLTYPE_) | X(TRANS_TABLE) | ||||||
| X(techmap_celltype) | X(TRG) | ||||||
| X(_TECHMAP_FAIL_) | X(TRG_ENABLE) | ||||||
| X(techmap_maccmap) | X(TRG_POLARITY) | ||||||
| X(_TECHMAP_REPLACE_) | X(TRG_WIDTH) | ||||||
| X(techmap_simplemap) | X(TYPE) | ||||||
| X(_techmap_special_) |  | ||||||
| X(techmap_wrap) |  | ||||||
| X(_TECHMAP_PLACEHOLDER_) |  | ||||||
| X(techmap_chtype) |  | ||||||
| X(T_FALL_MAX) | X(T_FALL_MAX) | ||||||
| X(T_FALL_MIN) | X(T_FALL_MIN) | ||||||
| X(T_FALL_TYP) | X(T_FALL_TYP) | ||||||
|  | @ -237,31 +165,12 @@ X(T_LIMIT2_TYP) | ||||||
| X(T_LIMIT_MAX) | X(T_LIMIT_MAX) | ||||||
| X(T_LIMIT_MIN) | X(T_LIMIT_MIN) | ||||||
| X(T_LIMIT_TYP) | X(T_LIMIT_TYP) | ||||||
| X(to_delete) |  | ||||||
| X(top) |  | ||||||
| X(TRANS_NUM) |  | ||||||
| X(TRANSPARENCY_MASK) |  | ||||||
| X(TRANSPARENT) |  | ||||||
| X(TRANS_TABLE) |  | ||||||
| X(TRG) |  | ||||||
| X(TRG_ENABLE) |  | ||||||
| X(TRG_POLARITY) |  | ||||||
| X(TRG_WIDTH) |  | ||||||
| X(T_RISE_MAX) | X(T_RISE_MAX) | ||||||
| X(T_RISE_MIN) | X(T_RISE_MIN) | ||||||
| X(T_RISE_TYP) | X(T_RISE_TYP) | ||||||
| X(TYPE) |  | ||||||
| X(U) | X(U) | ||||||
| X(unique) |  | ||||||
| X(unused_bits) |  | ||||||
| X(V) | X(V) | ||||||
| X(via_celltype) |  | ||||||
| X(wand) |  | ||||||
| X(whitebox) |  | ||||||
| X(WIDTH) | X(WIDTH) | ||||||
| X(wildcard_port_conns) |  | ||||||
| X(wiretype) |  | ||||||
| X(wor) |  | ||||||
| X(WORDS) | X(WORDS) | ||||||
| X(WR_ADDR) | X(WR_ADDR) | ||||||
| X(WR_CLK) | X(WR_CLK) | ||||||
|  | @ -273,17 +182,125 @@ X(WR_PORTS) | ||||||
| X(WR_PRIORITY_MASK) | X(WR_PRIORITY_MASK) | ||||||
| X(WR_WIDE_CONTINUATION) | X(WR_WIDE_CONTINUATION) | ||||||
| X(X) | X(X) | ||||||
| X(xprop_decoder) |  | ||||||
| X(Y) | X(Y) | ||||||
| X(Y_WIDTH) | X(Y_WIDTH) | ||||||
|  | X(_TECHMAP_BITS_CONNMAP_) | ||||||
|  | X(_TECHMAP_CELLNAME_) | ||||||
|  | X(_TECHMAP_CELLTYPE_) | ||||||
|  | X(_TECHMAP_FAIL_) | ||||||
|  | X(_TECHMAP_PLACEHOLDER_) | ||||||
|  | X(_TECHMAP_REPLACE_) | ||||||
|  | X(_techmap_special_) | ||||||
|  | X(abc9_box) | ||||||
|  | X(abc9_box_id) | ||||||
|  | X(abc9_box_seq) | ||||||
|  | X(abc9_bypass) | ||||||
|  | X(abc9_carry) | ||||||
|  | X(abc9_flop) | ||||||
|  | X(abc9_keep) | ||||||
|  | X(abc9_lut) | ||||||
|  | X(abc9_mergeability) | ||||||
|  | X(abc9_scc_id) | ||||||
|  | X(abcgroup) | ||||||
|  | X(allconst) | ||||||
|  | X(allseq) | ||||||
|  | X(always_comb) | ||||||
|  | X(always_ff) | ||||||
|  | X(always_latch) | ||||||
|  | X(anyconst) | ||||||
|  | X(anyseq) | ||||||
| X(area) | X(area) | ||||||
|  | X(blackbox) | ||||||
|  | X(bugpoint_keep) | ||||||
| X(capacitance) | X(capacitance) | ||||||
| X(NPRODUCTS) | X(cells_not_processed) | ||||||
| X(NADDENDS) | X(chain) | ||||||
| X(PRODUCT_NEGATED) | X(clkbuf_driver) | ||||||
| X(ADDEND_NEGATED) | X(clkbuf_inhibit) | ||||||
| X(A_WIDTHS) | X(clkbuf_inv) | ||||||
| X(B_WIDTHS) | X(clkbuf_sink) | ||||||
| X(C_WIDTHS) | X(defaultvalue) | ||||||
| X(C_SIGNED) | X(dynports) | ||||||
|  | X(enum_base_type) | ||||||
|  | X(enum_type) | ||||||
|  | X(equiv_merged) | ||||||
|  | X(equiv_region) | ||||||
|  | X(extract_order) | ||||||
|  | X(force_downto) | ||||||
|  | X(force_upto) | ||||||
|  | X(fsm_encoding) | ||||||
|  | X(fsm_export) | ||||||
|  | X(full_case) | ||||||
|  | X(gclk) | ||||||
|  | X(gentb_clock) | ||||||
|  | X(gentb_constant) | ||||||
|  | X(gentb_skip) | ||||||
|  | X(hdlname) | ||||||
|  | X(hierconn) | ||||||
|  | X(init) | ||||||
|  | X(initial_top) | ||||||
|  | X(interface_modport) | ||||||
|  | X(interface_type) | ||||||
|  | X(interfaces_replaced_in_module) | ||||||
|  | X(invertible_pin) | ||||||
|  | X(iopad_external_pin) | ||||||
|  | X(is_interface) | ||||||
|  | X(keep) | ||||||
|  | X(keep_hierarchy) | ||||||
|  | X(lib_whitebox) | ||||||
|  | X(localparam) | ||||||
|  | X(logic_block) | ||||||
|  | X(lram) | ||||||
|  | X(lut_keep) | ||||||
|  | X(maximize) | ||||||
|  | X(mem2reg) | ||||||
|  | X(minimize) | ||||||
|  | X(module_not_derived) | ||||||
|  | X(no_ram) | ||||||
|  | X(no_rw_check) | ||||||
|  | X(noblackbox) | ||||||
|  | X(nolatches) | ||||||
|  | X(nomem2init) | ||||||
|  | X(nomem2reg) | ||||||
|  | X(nomeminit) | ||||||
|  | X(nosync) | ||||||
|  | X(nowrshmsk) | ||||||
|  | X(onehot) | ||||||
|  | X(parallel_case) | ||||||
|  | X(parameter) | ||||||
|  | X(promoted_if) | ||||||
| X(raise_error) | X(raise_error) | ||||||
|  | X(ram_block) | ||||||
|  | X(ram_style) | ||||||
|  | X(ramstyle) | ||||||
|  | X(reg) | ||||||
|  | X(replaced_by_gclk) | ||||||
|  | X(reprocess_after) | ||||||
|  | X(rom_block) | ||||||
|  | X(rom_style) | ||||||
|  | X(romstyle) | ||||||
|  | X(single_bit_vector) | ||||||
|  | X(smtlib2_comb_expr) | ||||||
|  | X(smtlib2_module) | ||||||
|  | X(src) | ||||||
|  | X(sta_arrival) | ||||||
|  | X(submod) | ||||||
|  | X(syn_ramstyle) | ||||||
|  | X(syn_romstyle) | ||||||
|  | X(techmap_autopurge) | ||||||
|  | X(techmap_celltype) | ||||||
|  | X(techmap_chtype) | ||||||
|  | X(techmap_maccmap) | ||||||
|  | X(techmap_simplemap) | ||||||
|  | X(techmap_wrap) | ||||||
|  | X(to_delete) | ||||||
|  | X(top) | ||||||
|  | X(unique) | ||||||
|  | X(unused_bits) | ||||||
|  | X(via_celltype) | ||||||
|  | X(wand) | ||||||
|  | X(whitebox) | ||||||
|  | X(wildcard_port_conns) | ||||||
|  | X(wiretype) | ||||||
|  | X(wor) | ||||||
|  | X(xprop_decoder) | ||||||
|  |  | ||||||
|  | @ -29,6 +29,7 @@ | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| #include <optional> | #include <optional> | ||||||
|  | #include <string_view> | ||||||
| 
 | 
 | ||||||
| YOSYS_NAMESPACE_BEGIN | YOSYS_NAMESPACE_BEGIN | ||||||
| 
 | 
 | ||||||
|  | @ -37,7 +38,7 @@ RTLIL::IdString::destruct_guard_t RTLIL::IdString::destruct_guard; | ||||||
| std::vector<char*> RTLIL::IdString::global_id_storage_; | std::vector<char*> RTLIL::IdString::global_id_storage_; | ||||||
| std::unordered_map<std::string_view, int> RTLIL::IdString::global_id_index_; | std::unordered_map<std::string_view, int> RTLIL::IdString::global_id_index_; | ||||||
| #ifndef YOSYS_NO_IDS_REFCNT | #ifndef YOSYS_NO_IDS_REFCNT | ||||||
| std::vector<int> RTLIL::IdString::global_refcount_storage_; | std::vector<uint32_t> RTLIL::IdString::global_refcount_storage_; | ||||||
| std::vector<int> RTLIL::IdString::global_free_idx_list_; | std::vector<int> RTLIL::IdString::global_free_idx_list_; | ||||||
| #endif | #endif | ||||||
| #ifdef YOSYS_USE_STICKY_IDS | #ifdef YOSYS_USE_STICKY_IDS | ||||||
|  | @ -45,10 +46,32 @@ int RTLIL::IdString::last_created_idx_[8]; | ||||||
| int RTLIL::IdString::last_created_idx_ptr_; | int RTLIL::IdString::last_created_idx_ptr_; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define X(_id) IdString RTLIL::ID::_id; | #define X(N) const RTLIL::IdString RTLIL::ID::N(RTLIL::StaticId::N); | ||||||
| #include "kernel/constids.inc" | #include "kernel/constids.inc" | ||||||
| #undef X | #undef X | ||||||
| 
 | 
 | ||||||
|  | static void populate(std::string_view name) | ||||||
|  | { | ||||||
|  | 	if (name[1] == '$') { | ||||||
|  | 		// Skip prepended '\'
 | ||||||
|  | 		name = name.substr(1); | ||||||
|  | 	} | ||||||
|  | 	RTLIL::IdString::global_id_index_.insert({name, GetSize(RTLIL::IdString::global_id_storage_)}); | ||||||
|  | 	RTLIL::IdString::global_id_storage_.push_back(const_cast<char*>(name.data())); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void RTLIL::IdString::prepopulate() | ||||||
|  | { | ||||||
|  | 	int size = static_cast<short>(RTLIL::StaticId::STATIC_ID_END); | ||||||
|  | 	global_id_storage_.reserve(size); | ||||||
|  | 	RTLIL::IdString::global_id_storage_.push_back(const_cast<char*>("")); | ||||||
|  | 	global_id_index_.reserve(size); | ||||||
|  | 	global_refcount_storage_.resize(size, 1); | ||||||
|  | #define X(N) populate("\\" #N); | ||||||
|  | #include "kernel/constids.inc" | ||||||
|  | #undef X | ||||||
|  | } | ||||||
|  | 
 | ||||||
| dict<std::string, std::string> RTLIL::constpad; | dict<std::string, std::string> RTLIL::constpad; | ||||||
| 
 | 
 | ||||||
| const pool<IdString> &RTLIL::builtin_ff_cell_types() { | const pool<IdString> &RTLIL::builtin_ff_cell_types() { | ||||||
|  |  | ||||||
							
								
								
									
										132
									
								
								kernel/rtlil.h
									
										
									
									
									
								
							
							
						
						
									
										132
									
								
								kernel/rtlil.h
									
										
									
									
									
								
							|  | @ -83,6 +83,14 @@ namespace RTLIL | ||||||
| 		SB_EXCL_BB_CMDERR = 15 // call log_cmd_error on black boxed module
 | 		SB_EXCL_BB_CMDERR = 15 // call log_cmd_error on black boxed module
 | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
|  | 	enum class StaticId : short { | ||||||
|  | 		STATIC_ID_BEGIN = 0, | ||||||
|  | #define X(N) N, | ||||||
|  | #include "kernel/constids.inc" | ||||||
|  | #undef X | ||||||
|  | 		STATIC_ID_END, | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
| 	struct Const; | 	struct Const; | ||||||
| 	struct AttrObject; | 	struct AttrObject; | ||||||
| 	struct NamedObject; | 	struct NamedObject; | ||||||
|  | @ -105,8 +113,18 @@ namespace RTLIL | ||||||
| 	struct Process; | 	struct Process; | ||||||
| 	struct Binding; | 	struct Binding; | ||||||
| 	struct IdString; | 	struct IdString; | ||||||
|  | 	struct StaticIdString; | ||||||
| 
 | 
 | ||||||
| 	typedef std::pair<SigSpec, SigSpec> SigSig; | 	typedef std::pair<SigSpec, SigSpec> SigSig; | ||||||
|  | 
 | ||||||
|  | 	struct StaticIdString { | ||||||
|  | 		constexpr StaticIdString(StaticId id, const IdString &id_str) : id_str(id_str), id(id) {} | ||||||
|  | 		constexpr inline operator const IdString &() const { return id_str; } | ||||||
|  | 		constexpr inline int index() const { return static_cast<short>(id); } | ||||||
|  | 
 | ||||||
|  | 		const IdString &id_str; | ||||||
|  | 		const StaticId id; | ||||||
|  | 	}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct RTLIL::IdString | struct RTLIL::IdString | ||||||
|  | @ -127,7 +145,13 @@ struct RTLIL::IdString | ||||||
| 	static std::vector<char*> global_id_storage_; | 	static std::vector<char*> global_id_storage_; | ||||||
| 	static std::unordered_map<std::string_view, int> global_id_index_; | 	static std::unordered_map<std::string_view, int> global_id_index_; | ||||||
| #ifndef YOSYS_NO_IDS_REFCNT | #ifndef YOSYS_NO_IDS_REFCNT | ||||||
| 	static std::vector<int> global_refcount_storage_; | 	// For prepopulated IdStrings, the refcount is meaningless since they
 | ||||||
|  | 	// are never freed even if the refcount is zero. For code efficiency
 | ||||||
|  | 	// we increment the refcount of prepopulated IdStrings like any other string,
 | ||||||
|  | 	// but we never decrement the refcount or check whether it's zero.
 | ||||||
|  | 	// So, make this unsigned because refcounts of preopulated IdStrings may overflow
 | ||||||
|  | 	// and overflow of signed integers is undefined behavior.
 | ||||||
|  | 	static std::vector<uint32_t> global_refcount_storage_; | ||||||
| 	static std::vector<int> global_free_idx_list_; | 	static std::vector<int> global_free_idx_list_; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | @ -144,7 +168,7 @@ struct RTLIL::IdString | ||||||
| 			if (global_id_storage_.at(idx) == nullptr) | 			if (global_id_storage_.at(idx) == nullptr) | ||||||
| 				log("#X# DB-DUMP index %d: FREE\n", idx); | 				log("#X# DB-DUMP index %d: FREE\n", idx); | ||||||
| 			else | 			else | ||||||
| 				log("#X# DB-DUMP index %d: '%s' (ref %d)\n", idx, global_id_storage_.at(idx), global_refcount_storage_.at(idx)); | 				log("#X# DB-DUMP index %d: '%s' (ref %u)\n", idx, global_id_storage_.at(idx), global_refcount_storage_.at(idx)); | ||||||
| 		} | 		} | ||||||
| 	#endif | 	#endif | ||||||
| 	} | 	} | ||||||
|  | @ -166,15 +190,13 @@ struct RTLIL::IdString | ||||||
| 
 | 
 | ||||||
| 	static inline int get_reference(int idx) | 	static inline int get_reference(int idx) | ||||||
| 	{ | 	{ | ||||||
| 		if (idx) { |  | ||||||
| 	#ifndef YOSYS_NO_IDS_REFCNT | 	#ifndef YOSYS_NO_IDS_REFCNT | ||||||
| 			global_refcount_storage_[idx]++; | 		global_refcount_storage_[idx]++; | ||||||
| 	#endif | 	#endif | ||||||
| 	#ifdef YOSYS_XTRACE_GET_PUT | 	#ifdef YOSYS_XTRACE_GET_PUT | ||||||
| 			if (yosys_xtrace) | 		if (yosys_xtrace && idx >= static_cast<short>(StaticId::STATIC_ID_END)) | ||||||
| 				log("#X# GET-BY-INDEX '%s' (index %d, refcount %d)\n", global_id_storage_.at(idx), idx, global_refcount_storage_.at(idx)); | 			log("#X# GET-BY-INDEX '%s' (index %d, refcount %u)\n", global_id_storage_.at(idx), idx, global_refcount_storage_.at(idx)); | ||||||
| 	#endif | 	#endif | ||||||
| 		} |  | ||||||
| 		return idx; | 		return idx; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -182,9 +204,6 @@ struct RTLIL::IdString | ||||||
| 	{ | 	{ | ||||||
| 		log_assert(destruct_guard_ok); | 		log_assert(destruct_guard_ok); | ||||||
| 
 | 
 | ||||||
| 		if (!p[0]) |  | ||||||
| 			return 0; |  | ||||||
| 
 |  | ||||||
| 		auto it = global_id_index_.find((char*)p); | 		auto it = global_id_index_.find((char*)p); | ||||||
| 		if (it != global_id_index_.end()) { | 		if (it != global_id_index_.end()) { | ||||||
| 	#ifndef YOSYS_NO_IDS_REFCNT | 	#ifndef YOSYS_NO_IDS_REFCNT | ||||||
|  | @ -192,11 +211,17 @@ struct RTLIL::IdString | ||||||
| 	#endif | 	#endif | ||||||
| 	#ifdef YOSYS_XTRACE_GET_PUT | 	#ifdef YOSYS_XTRACE_GET_PUT | ||||||
| 			if (yosys_xtrace) | 			if (yosys_xtrace) | ||||||
| 				log("#X# GET-BY-NAME '%s' (index %d, refcount %d)\n", global_id_storage_.at(it->second), it->second, global_refcount_storage_.at(it->second)); | 				log("#X# GET-BY-NAME '%s' (index %d, refcount %u)\n", global_id_storage_.at(it->second), it->second, global_refcount_storage_.at(it->second)); | ||||||
| 	#endif | 	#endif | ||||||
| 			return it->second; | 			return it->second; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if (global_id_index_.empty()) | ||||||
|  | 			prepopulate(); | ||||||
|  | 
 | ||||||
|  | 		if (!p[0]) | ||||||
|  | 			return 0; | ||||||
|  | 
 | ||||||
| 		log_assert(p[0] == '$' || p[0] == '\\'); | 		log_assert(p[0] == '$' || p[0] == '\\'); | ||||||
| 		log_assert(p[1] != 0); | 		log_assert(p[1] != 0); | ||||||
| 		for (const char *c = p; *c; c++) | 		for (const char *c = p; *c; c++) | ||||||
|  | @ -238,7 +263,7 @@ struct RTLIL::IdString | ||||||
| 
 | 
 | ||||||
| 	#ifdef YOSYS_XTRACE_GET_PUT | 	#ifdef YOSYS_XTRACE_GET_PUT | ||||||
| 		if (yosys_xtrace) | 		if (yosys_xtrace) | ||||||
| 			log("#X# GET-BY-NAME '%s' (index %d, refcount %d)\n", global_id_storage_.at(idx), idx, global_refcount_storage_.at(idx)); | 			log("#X# GET-BY-NAME '%s' (index %d, refcount %u)\n", global_id_storage_.at(idx), idx, global_refcount_storage_.at(idx)); | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	#ifdef YOSYS_USE_STICKY_IDS | 	#ifdef YOSYS_USE_STICKY_IDS | ||||||
|  | @ -258,21 +283,20 @@ struct RTLIL::IdString | ||||||
| 	{ | 	{ | ||||||
| 		// put_reference() may be called from destructors after the destructor of
 | 		// put_reference() may be called from destructors after the destructor of
 | ||||||
| 		// global_refcount_storage_ has been run. in this case we simply do nothing.
 | 		// global_refcount_storage_ has been run. in this case we simply do nothing.
 | ||||||
| 		if (!destruct_guard_ok || !idx) | 		if (idx < static_cast<short>(StaticId::STATIC_ID_END) || !destruct_guard_ok) | ||||||
| 			return; | 			return; | ||||||
| 
 | 
 | ||||||
| 	#ifdef YOSYS_XTRACE_GET_PUT | 	#ifdef YOSYS_XTRACE_GET_PUT | ||||||
| 		if (yosys_xtrace) { | 		if (yosys_xtrace) { | ||||||
| 			log("#X# PUT '%s' (index %d, refcount %d)\n", global_id_storage_.at(idx), idx, global_refcount_storage_.at(idx)); | 			log("#X# PUT '%s' (index %d, refcount %u)\n", global_id_storage_.at(idx), idx, global_refcount_storage_.at(idx)); | ||||||
| 		} | 		} | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 		int &refcount = global_refcount_storage_[idx]; | 		uint32_t &refcount = global_refcount_storage_[idx]; | ||||||
| 
 | 
 | ||||||
| 		if (--refcount > 0) | 		if (--refcount > 0) | ||||||
| 			return; | 			return; | ||||||
| 
 | 
 | ||||||
| 		log_assert(refcount == 0); |  | ||||||
| 		free_reference(idx); | 		free_reference(idx); | ||||||
| 	} | 	} | ||||||
| 	static inline void free_reference(int idx) | 	static inline void free_reference(int idx) | ||||||
|  | @ -281,6 +305,7 @@ struct RTLIL::IdString | ||||||
| 			log("#X# Removed IdString '%s' with index %d.\n", global_id_storage_.at(idx), idx); | 			log("#X# Removed IdString '%s' with index %d.\n", global_id_storage_.at(idx), idx); | ||||||
| 			log_backtrace("-X- ", yosys_xtrace-1); | 			log_backtrace("-X- ", yosys_xtrace-1); | ||||||
| 		} | 		} | ||||||
|  | 		log_assert(idx >= static_cast<short>(StaticId::STATIC_ID_END)); | ||||||
| 
 | 
 | ||||||
| 		global_id_index_.erase(global_id_storage_.at(idx)); | 		global_id_index_.erase(global_id_storage_.at(idx)); | ||||||
| 		free(global_id_storage_.at(idx)); | 		free(global_id_storage_.at(idx)); | ||||||
|  | @ -300,6 +325,7 @@ struct RTLIL::IdString | ||||||
| 	inline IdString(const IdString &str) : index_(get_reference(str.index_)) { } | 	inline IdString(const IdString &str) : index_(get_reference(str.index_)) { } | ||||||
| 	inline IdString(IdString &&str) : index_(str.index_) { str.index_ = 0; } | 	inline IdString(IdString &&str) : index_(str.index_) { str.index_ = 0; } | ||||||
| 	inline IdString(const std::string &str) : index_(get_reference(str.c_str())) { } | 	inline IdString(const std::string &str) : index_(get_reference(str.c_str())) { } | ||||||
|  | 	inline IdString(StaticId id) : index_(static_cast<short>(id)) {} | ||||||
| 	inline ~IdString() { put_reference(index_); } | 	inline ~IdString() { put_reference(index_); } | ||||||
| 
 | 
 | ||||||
| 	inline void operator=(const IdString &rhs) { | 	inline void operator=(const IdString &rhs) { | ||||||
|  | @ -331,6 +357,8 @@ struct RTLIL::IdString | ||||||
| 
 | 
 | ||||||
| 	inline bool operator==(const IdString &rhs) const { return index_ == rhs.index_; } | 	inline bool operator==(const IdString &rhs) const { return index_ == rhs.index_; } | ||||||
| 	inline bool operator!=(const IdString &rhs) const { return index_ != rhs.index_; } | 	inline bool operator!=(const IdString &rhs) const { return index_ != rhs.index_; } | ||||||
|  | 	inline bool operator==(const StaticIdString &rhs) const; | ||||||
|  | 	inline bool operator!=(const StaticIdString &rhs) const; | ||||||
| 
 | 
 | ||||||
| 	// The methods below are just convenience functions for better compatibility with std::string.
 | 	// The methods below are just convenience functions for better compatibility with std::string.
 | ||||||
| 
 | 
 | ||||||
|  | @ -416,12 +444,16 @@ struct RTLIL::IdString | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool in(const IdString &rhs) const { return *this == rhs; } | 	bool in(const IdString &rhs) const { return *this == rhs; } | ||||||
|  | 	bool in(const StaticIdString &rhs) const { return *this == rhs; } | ||||||
| 	bool in(const char *rhs) const { return *this == rhs; } | 	bool in(const char *rhs) const { return *this == rhs; } | ||||||
| 	bool in(const std::string &rhs) const { return *this == rhs; } | 	bool in(const std::string &rhs) const { return *this == rhs; } | ||||||
| 	inline bool in(const pool<IdString> &rhs) const; | 	inline bool in(const pool<IdString> &rhs) const; | ||||||
| 	inline bool in(const pool<IdString> &&rhs) const; | 	inline bool in(const pool<IdString> &&rhs) const; | ||||||
| 
 | 
 | ||||||
| 	bool isPublic() const { return begins_with("\\"); } | 	bool isPublic() const { return begins_with("\\"); } | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	static void prepopulate(); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| namespace hashlib { | namespace hashlib { | ||||||
|  | @ -449,12 +481,76 @@ inline bool RTLIL::IdString::in(const pool<IdString> &rhs) const { return rhs.co | ||||||
| [[deprecated]] | [[deprecated]] | ||||||
| inline bool RTLIL::IdString::in(const pool<IdString> &&rhs) const { return rhs.count(*this) != 0; } | inline bool RTLIL::IdString::in(const pool<IdString> &&rhs) const { return rhs.count(*this) != 0; } | ||||||
| 
 | 
 | ||||||
|  | inline bool RTLIL::IdString::operator==(const RTLIL::StaticIdString &rhs) const { | ||||||
|  | 	return index_ == rhs.index(); | ||||||
|  | } | ||||||
|  | inline bool RTLIL::IdString::operator!=(const RTLIL::StaticIdString &rhs) const { | ||||||
|  | 	return index_ != rhs.index(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| namespace RTLIL { | namespace RTLIL { | ||||||
| 	namespace ID { | 	namespace ID { | ||||||
| #define X(_id) extern IdString _id; | #define X(_id) extern const IdString _id; | ||||||
| #include "kernel/constids.inc" | #include "kernel/constids.inc" | ||||||
| #undef X | #undef X | ||||||
| 	}; | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct IdTableEntry { | ||||||
|  | 	const std::string_view name; | ||||||
|  | 	const RTLIL::StaticIdString static_id; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | constexpr IdTableEntry IdTable[] = { | ||||||
|  | #define X(_id) {#_id, RTLIL::StaticIdString(RTLIL::StaticId::_id, RTLIL::ID::_id)}, | ||||||
|  | #include "kernel/constids.inc" | ||||||
|  | #undef X | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | constexpr int lookup_well_known_id(std::string_view name) | ||||||
|  | { | ||||||
|  | 	int low = 0; | ||||||
|  | 	int high = sizeof(IdTable) / sizeof(IdTable[0]); | ||||||
|  | 	while (high - low >= 2) { | ||||||
|  | 		int mid = (low + high) / 2; | ||||||
|  | 		if (name < IdTable[mid].name) | ||||||
|  | 			high = mid; | ||||||
|  | 		else | ||||||
|  | 			low = mid; | ||||||
|  | 	} | ||||||
|  | 	if (IdTable[low].name == name) | ||||||
|  | 		return low; | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Create a statically allocated IdString object, using for example ID::A or ID($add).
 | ||||||
|  | //
 | ||||||
|  | // Recipe for Converting old code that is using conversion of strings like ID::A and
 | ||||||
|  | // "$add" for creating IdStrings: Run below SED command on the .cc file and then use for
 | ||||||
|  | // example "meld foo.cc foo.cc.orig" to manually compile errors, if necessary.
 | ||||||
|  | //
 | ||||||
|  | //  sed -i.orig -r 's/"\\\\([a-zA-Z0-9_]+)"/ID(\1)/g; s/"(\$[a-zA-Z0-9_]+)"/ID(\1)/g;' <filename>
 | ||||||
|  | //
 | ||||||
|  | typedef const RTLIL::IdString &IDMacroHelperFunc(); | ||||||
|  | 
 | ||||||
|  | template <int IdTableIndex> struct IDMacroHelper { | ||||||
|  | 	static constexpr RTLIL::StaticIdString eval(IDMacroHelperFunc) { | ||||||
|  | 		return IdTable[IdTableIndex].static_id; | ||||||
|  | 	} | ||||||
|  | }; | ||||||
|  | template <> struct IDMacroHelper<-1> { | ||||||
|  | 	static constexpr const RTLIL::IdString &eval(IDMacroHelperFunc func) { | ||||||
|  | 		return func(); | ||||||
|  | 	} | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #define ID(_id) IDMacroHelper<lookup_well_known_id(#_id)>::eval([]() -> const RTLIL::IdString & { \ | ||||||
|  | 		const char *p = "\\" #_id, *q = p[1] == '$' ? p+1 : p; \ | ||||||
|  | 		static const YOSYS_NAMESPACE_PREFIX RTLIL::IdString id(q); \ | ||||||
|  | 		return id; \ | ||||||
|  |         }) | ||||||
|  | 
 | ||||||
|  | namespace RTLIL { | ||||||
| 	extern dict<std::string, std::string> constpad; | 	extern dict<std::string, std::string> constpad; | ||||||
| 
 | 
 | ||||||
| 	const pool<IdString> &builtin_ff_cell_types(); | 	const pool<IdString> &builtin_ff_cell_types(); | ||||||
|  |  | ||||||
|  | @ -211,10 +211,6 @@ void yosys_setup() | ||||||
| 	init_share_dirname(); | 	init_share_dirname(); | ||||||
| 	init_abc_executable_name(); | 	init_abc_executable_name(); | ||||||
| 
 | 
 | ||||||
| #define X(_id) RTLIL::ID::_id = "\\" # _id; |  | ||||||
| #include "kernel/constids.inc" |  | ||||||
| #undef X |  | ||||||
| 
 |  | ||||||
| 	Pass::init_register(); | 	Pass::init_register(); | ||||||
| 	yosys_design = new RTLIL::Design; | 	yosys_design = new RTLIL::Design; | ||||||
| 	yosys_celltypes.setup(); | 	yosys_celltypes.setup(); | ||||||
|  |  | ||||||
|  | @ -206,13 +206,13 @@ namespace RTLIL { | ||||||
| 	struct Module; | 	struct Module; | ||||||
| 	struct Design; | 	struct Design; | ||||||
| 	struct Monitor; | 	struct Monitor; | ||||||
|     struct Selection; | 	struct Selection; | ||||||
| 	struct SigChunk; | 	struct SigChunk; | ||||||
| 	enum State : unsigned char; | 	enum State : unsigned char; | ||||||
| 
 | 
 | ||||||
| 	typedef std::pair<SigSpec, SigSpec> SigSig; | 	typedef std::pair<SigSpec, SigSpec> SigSig; | ||||||
| 
 | 
 | ||||||
|     namespace ID {} | 	namespace ID {} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| namespace AST { | namespace AST { | ||||||
|  | @ -277,16 +277,6 @@ RTLIL::IdString new_id_suffix(std::string file, int line, std::string func, std: | ||||||
| #define NEW_ID_SUFFIX(suffix) \ | #define NEW_ID_SUFFIX(suffix) \ | ||||||
| 	YOSYS_NAMESPACE_PREFIX new_id_suffix(__FILE__, __LINE__, __FUNCTION__, suffix) | 	YOSYS_NAMESPACE_PREFIX new_id_suffix(__FILE__, __LINE__, __FUNCTION__, suffix) | ||||||
| 
 | 
 | ||||||
| // Create a statically allocated IdString object, using for example ID::A or ID($add).
 |  | ||||||
| //
 |  | ||||||
| // Recipe for Converting old code that is using conversion of strings like ID::A and
 |  | ||||||
| // "$add" for creating IdStrings: Run below SED command on the .cc file and then use for
 |  | ||||||
| // example "meld foo.cc foo.cc.orig" to manually compile errors, if necessary.
 |  | ||||||
| //
 |  | ||||||
| //  sed -i.orig -r 's/"\\\\([a-zA-Z0-9_]+)"/ID(\1)/g; s/"(\$[a-zA-Z0-9_]+)"/ID(\1)/g;' <filename>
 |  | ||||||
| //
 |  | ||||||
| #define ID(_id) ([]() -> const RTLIL::IdString & { const char *p = "\\" #_id, *q = p[1] == '$' ? p+1 : p; \ |  | ||||||
|         static const YOSYS_NAMESPACE_PREFIX RTLIL::IdString id(q); return id; })() |  | ||||||
| namespace ID = RTLIL::ID; | namespace ID = RTLIL::ID; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue