@@ -75,6 +75,8 @@ class XilinxVivadoToolchain:
75
75
"keep" : ("dont_touch" , "true" ),
76
76
"no_retiming" : ("dont_touch" , "true" ),
77
77
"async_reg" : ("async_reg" , "true" ),
78
+ "mr_ff" : ("mr_ff" , "true" ), # user-defined attribute
79
+ "mr_false_path" : ("mr_false_path" , "true" ), # user-defined attribute
78
80
"ars_ff1" : ("ars_ff1" , "true" ), # user-defined attribute
79
81
"ars_ff2" : ("ars_ff2" , "true" ), # user-defined attribute
80
82
"ars_false_path" : ("ars_false_path" , "true" ), # user-defined attribute
@@ -91,6 +93,8 @@ def __init__(self):
91
93
92
94
def _build_batch (self , platform , sources , build_name ):
93
95
tcl = []
96
+ tcl .append ("create_property -type bool mr_ff cell" )
97
+ tcl .append ("create_property -type bool mr_false_path net" )
94
98
tcl .append ("create_property -type bool ars_ff1 cell" )
95
99
tcl .append ("create_property -type bool ars_ff2 cell" )
96
100
tcl .append ("create_property -type bool ars_false_path net" )
@@ -155,6 +159,12 @@ def _convert_clocks(self, platform):
155
159
del self .false_paths
156
160
157
161
def _constrain (self , platform ):
162
+ # The asynchronous input to a MultiReg is a false path
163
+ platform .add_platform_command (
164
+ "set_false_path -quiet "
165
+ "-through [get_nets -hier -filter mr_false_path] "
166
+ "-to [get_cells -hier -filter mr_ff]"
167
+ )
158
168
# The asychronous reset input to the AsyncResetSynchronizer is a false
159
169
# path
160
170
platform .add_platform_command (
0 commit comments