@@ -737,6 +737,13 @@ def MERGE_COMB_LOGIC(self, logic_b):
737737 self .wire_driven_by , logic_b .wire_driven_by
738738 )
739739
740+ # Delay
741+ if self .delay is not None and logic_b .delay is not None :
742+ if self .delay != logic_b .delay :
743+ raise Exception ("Mismatch delay!" )
744+ elif self .delay is None :
745+ self .delay = logic_b .delay
746+
740747 # NExt user inst name?
741748 if self .next_user_inst_name != logic_b .next_user_inst_name :
742749 if self .next_user_inst_name is None :
@@ -1415,6 +1422,8 @@ def CAN_BE_SLICED(self, parser_state):
14151422 return False
14161423 return True
14171424 def BODY_CAN_BE_SLICED (self , parser_state ):
1425+ if self .func_name in parser_state .func_fixed_latency :
1426+ return False
14181427 if not self .CAN_BE_SLICED (parser_state ):
14191428 return False
14201429 if self .uses_nonvolatile_state_regs :
@@ -9605,7 +9614,7 @@ def DEL_ALL_CACHES():
96059614 global _C_AST_REF_TOKS_TO_C_TYPE_cache
96069615 global _C_AST_NODE_COORD_STR_cache
96079616 global _C_AST_FUNC_DEF_TO_LOGIC_cache
9608- # global _GET_ZERO_CLK_PIPELINE_MAP_cache
9617+ # global _GET_ZERO_ADDED_CLKS_PIPELINE_MAP_cache
96099618
96109619 _other_partial_logic_cache = {}
96119620 _REF_TOKS_TO_OWN_BRANCH_REF_TOKS_cache = {}
@@ -9617,7 +9626,7 @@ def DEL_ALL_CACHES():
96179626 _C_AST_REF_TOKS_TO_C_TYPE_cache = {}
96189627 _C_AST_NODE_COORD_STR_cache = {}
96199628 _C_AST_FUNC_DEF_TO_LOGIC_cache = {}
9620- # _GET_ZERO_CLK_PIPELINE_MAP_cache = {}
9629+ # _GET_ZERO_ADDED_CLKS_PIPELINE_MAP_cache = {}
96219630
96229631
96239632_EXE_ABS_DIR = None
@@ -9675,6 +9684,7 @@ def __init__(self):
96759684 self .main_clk_group = {} # dict[main_inst_name]=clk_group_str
96769685 self .func_mult_style = {}
96779686 self .func_marked_wires = set ()
9687+ self .func_fixed_latency = {}
96789688 self .func_marked_blackbox = set ()
96799689 self .func_marked_no_add_io_regs = set ()
96809690 self .func_marked_debug = set ()
@@ -9737,6 +9747,7 @@ def DEEPCOPY(self):
97379747 rv .main_clk_group = dict (self .main_clk_group )
97389748 rv .func_mult_style = dict (self .func_mult_style )
97399749 rv .func_marked_wires = set (self .func_marked_wires )
9750+ rv .func_fixed_latency = dict (self .func_fixed_latency )
97409751 rv .func_marked_blackbox = set (self .func_marked_blackbox )
97419752 rv .func_marked_no_add_io_regs = set (self .func_marked_no_add_io_regs )
97429753 rv .func_marked_debug = set (self .func_marked_debug )
@@ -10198,32 +10209,32 @@ def PARSE_FILE(c_filename):
1019810209 sys .exit (- 1 )
1019910210
1020010211
10201- def WRITE_0CLK_FINAL_FILES (parser_state ):
10202- print ("Building map of combinatorial logic..." , flush = True )
10212+ def WRITE_0_ADDED_CLKS_FINAL_FILES (parser_state ):
10213+ print ("Building map of logic to be pipelined ..." , flush = True )
1020310214 SYN .PART_SET_TOOL (
1020410215 parser_state .part , allow_fail = True
1020510216 ) # Comb logic only might not have tool set
10206- ZeroClockTimingParamsLookupTable = SYN .GET_ZERO_CLK_TIMING_PARAMS_LOOKUP (
10217+ ZeroAddedClocksTimingParamsLookupTable = SYN .GET_ZERO_ADDED_CLKS_TIMING_PARAMS_LOOKUP (
1020710218 parser_state
1020810219 )
1020910220 multimain_timing_params = SYN .MultiMainTimingParams ()
10210- multimain_timing_params .TimingParamsLookupTable = ZeroClockTimingParamsLookupTable
10221+ multimain_timing_params .TimingParamsLookupTable = ZeroAddedClocksTimingParamsLookupTable
1021110222 # Write report of floating point module use - hi Victor!
1021210223 WRITE_FLOAT_MODULE_INSTANCES_REPORT (multimain_timing_params , parser_state )
1021310224 # Integers too..
1021410225 WRITE_INTEGER_MODULE_INSTANCES_REPORT (multimain_timing_params , parser_state )
1021510226 print (
10216- "Writing VHDL files for all functions (as combinatorial logic )..." , flush = True
10227+ "Writing VHDL files for all functions (before any added pipelining )..." , flush = True
1021710228 )
10218- SYN .WRITE_ALL_ZERO_CLK_VHDL (parser_state , ZeroClockTimingParamsLookupTable )
10229+ SYN .WRITE_ALL_ZERO_CLK_VHDL (parser_state , ZeroAddedClocksTimingParamsLookupTable )
1021910230 print (
1022010231 "Writing the constant struct+enum definitions as defined from C code..." ,
1022110232 flush = True ,
1022210233 )
1022310234 VHDL .WRITE_C_DEFINED_VHDL_STRUCTS_PACKAGE (parser_state )
1022410235 print ("Writing global wire definitions as parsed from C code..." , flush = True )
1022510236 VHDL .WRITE_GLOBAL_WIRES_VHDL_PACKAGE (parser_state )
10226- print ("Writing finalized comb. logic synthesis tool files ..." , flush = True )
10237+ print ("Writing output files before adding pipelining ..." , flush = True )
1022710238 SYN .WRITE_FINAL_FILES (multimain_timing_params , parser_state )
1022810239
1022910240
@@ -11568,6 +11579,13 @@ def APPEND_PRAGMA_INFO(parser_state):
1156811579 main_func = toks [1 ]
1156911580 parser_state .func_marked_wires .add (main_func )
1157011581
11582+ # FUNC_LATENCY
11583+ elif name == "FUNC_LATENCY" :
11584+ toks = pragma .string .split (" " )
11585+ func = toks [1 ]
11586+ latency = int (toks [2 ])
11587+ parser_state .func_fixed_latency [func ] = latency
11588+
1157111589 # FUNC_BLACKBOX
1157211590 elif name == "FUNC_BLACKBOX" :
1157311591 toks = pragma .string .split (" " )
0 commit comments