genclk
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
48d6e00419
commit
9bdd01f01a
BIN
doc/OpenSTA.odt
BIN
doc/OpenSTA.odt
Binary file not shown.
BIN
doc/OpenSTA.pdf
BIN
doc/OpenSTA.pdf
Binary file not shown.
|
|
@ -105,8 +105,6 @@ public:
|
||||||
Clock *masterClk() const { return master_clk_; }
|
Clock *masterClk() const { return master_clk_; }
|
||||||
bool masterClkInfered() const { return master_clk_infered_; }
|
bool masterClkInfered() const { return master_clk_infered_; }
|
||||||
void setInferedMasterClk(Clock *master_clk);
|
void setInferedMasterClk(Clock *master_clk);
|
||||||
Pin *pllOut() const { return pll_out_; }
|
|
||||||
Pin *pllFdbk() const { return pll_fdbk_; }
|
|
||||||
int divideBy() const { return divide_by_; }
|
int divideBy() const { return divide_by_; }
|
||||||
int multiplyBy() const { return multiply_by_; }
|
int multiplyBy() const { return multiply_by_; }
|
||||||
float dutyCycle() const { return duty_cycle_; }
|
float dutyCycle() const { return duty_cycle_; }
|
||||||
|
|
@ -138,8 +136,6 @@ protected:
|
||||||
bool add_to_pins,
|
bool add_to_pins,
|
||||||
Pin *src_pin,
|
Pin *src_pin,
|
||||||
Clock *master_clk,
|
Clock *master_clk,
|
||||||
Pin *pll_out,
|
|
||||||
Pin *pll_fdbk,
|
|
||||||
int divide_by,
|
int divide_by,
|
||||||
int multiply_by,
|
int multiply_by,
|
||||||
float duty_cycle,
|
float duty_cycle,
|
||||||
|
|
@ -165,8 +161,6 @@ protected:
|
||||||
bool add_to_pins_;
|
bool add_to_pins_;
|
||||||
// Hierarchical pins in pins_ become driver pins through the pin.
|
// Hierarchical pins in pins_ become driver pins through the pin.
|
||||||
PinSet leaf_pins_;
|
PinSet leaf_pins_;
|
||||||
Pin *pll_out_;
|
|
||||||
Pin *pll_fdbk_;
|
|
||||||
float period_;
|
float period_;
|
||||||
FloatSeq *waveform_;
|
FloatSeq *waveform_;
|
||||||
bool waveform_valid_;
|
bool waveform_valid_;
|
||||||
|
|
|
||||||
|
|
@ -348,8 +348,6 @@ public:
|
||||||
bool add_to_pins,
|
bool add_to_pins,
|
||||||
Pin *src_pin,
|
Pin *src_pin,
|
||||||
Clock *master_clk,
|
Clock *master_clk,
|
||||||
Pin *pll_out,
|
|
||||||
Pin *pll_fdbk,
|
|
||||||
int divide_by,
|
int divide_by,
|
||||||
int multiply_by,
|
int multiply_by,
|
||||||
float duty_cycle,
|
float duty_cycle,
|
||||||
|
|
|
||||||
|
|
@ -277,8 +277,6 @@ public:
|
||||||
bool add_to_pins,
|
bool add_to_pins,
|
||||||
Pin *src_pin,
|
Pin *src_pin,
|
||||||
Clock *master_clk,
|
Clock *master_clk,
|
||||||
Pin *pll_out,
|
|
||||||
Pin *pll_fdbk,
|
|
||||||
int divide_by,
|
int divide_by,
|
||||||
int multiply_by,
|
int multiply_by,
|
||||||
float duty_cycle,
|
float duty_cycle,
|
||||||
|
|
|
||||||
319
messages.txt
319
messages.txt
|
|
@ -7,13 +7,12 @@
|
||||||
0007 LibertyExpr.cc:78 %s references unknown port %s.
|
0007 LibertyExpr.cc:78 %s references unknown port %s.
|
||||||
0008 ConcreteNetwork.cc:1857 cell type %s can not be linked.
|
0008 ConcreteNetwork.cc:1857 cell type %s can not be linked.
|
||||||
0009 CycleAccting.cc:87 No common period was found between clocks %s and %s.
|
0009 CycleAccting.cc:87 No common period was found between clocks %s and %s.
|
||||||
0010 Genclks.cc:287 no master clock found for generated clock %s.
|
0010 Genclks.cc:274 no master clock found for generated clock %s.
|
||||||
0011 Genclks.cc:329 generated clock %s is in the fanout of multiple clocks.
|
0013 Genclks.cc:938 generated clock %s source pin %s missing paths from master clock %s.
|
||||||
0013 Genclks.cc:987 generated clock %s source pin %s missing paths from master clock %s.
|
|
||||||
0015 Sim.cc:871 propagated logic value %c differs from constraint value of %c on pin %s.
|
0015 Sim.cc:871 propagated logic value %c differs from constraint value of %c on pin %s.
|
||||||
0016 LibertyReader.cc:996 default_max_fanout is 0.0.
|
0016 LibertyReader.cc:996 default_max_fanout is 0.0.
|
||||||
0017 Sta.cc:2094 '%s' is not a valid endpoint.
|
0017 Sta.cc:2091 '%s' is not a valid endpoint.
|
||||||
0018 Sta.cc:2018 '%s' is not a valid start point.
|
0018 Sta.cc:2015 '%s' is not a valid start point.
|
||||||
0021 SpefParse.yy:805 %d is not positive.
|
0021 SpefParse.yy:805 %d is not positive.
|
||||||
0022 SpefParse.yy:814 %.4f is not positive.
|
0022 SpefParse.yy:814 %.4f is not positive.
|
||||||
0023 SpefParse.yy:820 %.4f is not positive.
|
0023 SpefParse.yy:820 %.4f is not positive.
|
||||||
|
|
@ -166,7 +165,7 @@
|
||||||
0191 VerilogReader.cc:1733 %s is not a verilog module.
|
0191 VerilogReader.cc:1733 %s is not a verilog module.
|
||||||
0201 StaTcl.i:128 no network has been linked.
|
0201 StaTcl.i:128 no network has been linked.
|
||||||
0202 StaTcl.i:142 network does not support edits.
|
0202 StaTcl.i:142 network does not support edits.
|
||||||
0204 StaTcl.i:4181 POCV support requires compilation with SSTA=1.
|
0204 StaTcl.i:4179 POCV support requires compilation with SSTA=1.
|
||||||
0206 LibertyExpr.cc:171 %s %s.
|
0206 LibertyExpr.cc:171 %s %s.
|
||||||
0207 GraphDelayCalc1.cc:738 port not found in cell
|
0207 GraphDelayCalc1.cc:738 port not found in cell
|
||||||
0208 Graph.cc:793 arc_delay_annotated array bounds exceeded
|
0208 Graph.cc:793 arc_delay_annotated array bounds exceeded
|
||||||
|
|
@ -174,10 +173,10 @@
|
||||||
0210 Graph.cc:820 arc_delay_annotated array bounds exceeded
|
0210 Graph.cc:820 arc_delay_annotated array bounds exceeded
|
||||||
0211 SdcNetwork.cc:1026 inst path string lenth estimate busted
|
0211 SdcNetwork.cc:1026 inst path string lenth estimate busted
|
||||||
0212 SdcNetwork.cc:1098 inst path string lenth estimate exceeded
|
0212 SdcNetwork.cc:1098 inst path string lenth estimate exceeded
|
||||||
0213 Sdc.cc:4101 group path name and is_default are mutually exclusive.
|
0213 Sdc.cc:4098 group path name and is_default are mutually exclusive.
|
||||||
0214 WriteSdc.cc:1317 unknown exception type
|
0214 WriteSdc.cc:1307 unknown exception type
|
||||||
0215 WriteSdc.cc:1888 illegal set_logic value
|
0215 WriteSdc.cc:1878 illegal set_logic value
|
||||||
0216 WriteSdc.cc:1932 invalid set_case_analysis value
|
0216 WriteSdc.cc:1922 invalid set_case_analysis value
|
||||||
0228 Graph.cc:833 arc_delay_annotated array bounds exceeded
|
0228 Graph.cc:833 arc_delay_annotated array bounds exceeded
|
||||||
0251 PathEnumed.cc:126 enumerated path required time
|
0251 PathEnumed.cc:126 enumerated path required time
|
||||||
0252 PathEnumed.cc:135 enumerated path required time
|
0252 PathEnumed.cc:135 enumerated path required time
|
||||||
|
|
@ -186,18 +185,17 @@
|
||||||
0255 ReportPath.cc:289 unsupported path type
|
0255 ReportPath.cc:289 unsupported path type
|
||||||
0256 ReportPath.cc:310 unsupported path type
|
0256 ReportPath.cc:310 unsupported path type
|
||||||
0257 ReportPath.cc:349 unsupported path type
|
0257 ReportPath.cc:349 unsupported path type
|
||||||
0258 ReportPath.cc:2228 generated clock pll source path too short.
|
0259 ReportPath.cc:2378 unsupported path type
|
||||||
0259 ReportPath.cc:2392 unsupported path type
|
0260 Search.cc:2628 max tag group index exceeded
|
||||||
0260 Search.cc:2637 max tag group index exceeded
|
0261 Search.cc:2860 max tag index exceeded
|
||||||
0261 Search.cc:2869 max tag index exceeded
|
0262 Search.cc:3543 unexpected filter path
|
||||||
0262 Search.cc:3561 unexpected filter path
|
0263 Search.cc:3711 tns incr existing vertex
|
||||||
0263 Search.cc:3729 tns incr existing vertex
|
0264 Sta.cc:4147 corresponding timing arc set not found in equiv cells
|
||||||
0264 Sta.cc:4150 corresponding timing arc set not found in equiv cells
|
|
||||||
0265 TagGroup.cc:297 tag group missing tag
|
0265 TagGroup.cc:297 tag group missing tag
|
||||||
0266 Sta.cc:2091 '%s' is not a valid endpoint.
|
0266 Sta.cc:2088 '%s' is not a valid endpoint.
|
||||||
0267 Sta.cc:2015 '%s' is not a valid start point.
|
0267 Sta.cc:2012 '%s' is not a valid start point.
|
||||||
0272 StaTcl.i:4167 unknown common clk pessimism mode.
|
0272 StaTcl.i:4165 unknown common clk pessimism mode.
|
||||||
0273 StaTcl.i:5123 unknown clock sense
|
0273 StaTcl.i:5121 unknown clock sense
|
||||||
0300 Util.tcl:218 no commands match '$pattern'.
|
0300 Util.tcl:218 no commands match '$pattern'.
|
||||||
0301 Power.tcl:218 activity should be 0.0 to 1.0 or 2.0
|
0301 Power.tcl:218 activity should be 0.0 to 1.0 or 2.0
|
||||||
0302 Power.tcl:226 duty should be 0.0 to 1.0
|
0302 Power.tcl:226 duty should be 0.0 to 1.0
|
||||||
|
|
@ -209,60 +207,60 @@
|
||||||
0315 Cmds.tcl:856 $arg_name '$object_type' is not a net.
|
0315 Cmds.tcl:856 $arg_name '$object_type' is not a net.
|
||||||
0316 Cmds.tcl:861 $arg_name '$arg' not found.
|
0316 Cmds.tcl:861 $arg_name '$arg' not found.
|
||||||
0318 Search.tcl:1073 unknown path group '$name'.
|
0318 Search.tcl:1073 unknown path group '$name'.
|
||||||
0319 Sdc.tcl:279 $unit scale [format %.0e $scale] does not match library scale [format %.0e $unit_scale].
|
0319 Sdc.tcl:288 $unit scale [format %.0e $scale] does not match library scale [format %.0e $unit_scale].
|
||||||
0320 Sdc.tcl:480 current_design for other than top cell not supported.
|
0320 Sdc.tcl:496 current_design for other than top cell not supported.
|
||||||
0321 Sdc.tcl:517 patterns argument not supported with -of_objects.
|
0321 Sdc.tcl:533 patterns argument not supported with -of_objects.
|
||||||
0322 Sdc.tcl:552 instance '$pattern' not found.
|
0322 Sdc.tcl:568 instance '$pattern' not found.
|
||||||
0323 Sdc.tcl:613 clock '$pattern' not found.
|
0323 Sdc.tcl:629 clock '$pattern' not found.
|
||||||
0324 Sdc.tcl:640 positional arguments not supported with -of_objects.
|
0324 Sdc.tcl:656 positional arguments not supported with -of_objects.
|
||||||
0325 Sdc.tcl:666 library '$lib_name' not found.
|
0325 Sdc.tcl:682 library '$lib_name' not found.
|
||||||
0326 Sdc.tcl:678 cell '$cell_pattern' not found.
|
0326 Sdc.tcl:694 cell '$cell_pattern' not found.
|
||||||
0327 Sdc.tcl:725 library/cell/port '$pattern' not found.
|
0327 Sdc.tcl:741 library/cell/port '$pattern' not found.
|
||||||
0328 Sdc.tcl:745 port '$port_pattern' not found.
|
0328 Sdc.tcl:761 port '$port_pattern' not found.
|
||||||
0329 Sdc.tcl:750 library '$lib_name' not found.
|
0329 Sdc.tcl:766 library '$lib_name' not found.
|
||||||
0330 Sdc.tcl:760 -nocase ignored without -regexp.
|
0330 Sdc.tcl:776 -nocase ignored without -regexp.
|
||||||
0331 Sdc.tcl:786 library '$pattern' not found.
|
0331 Sdc.tcl:802 library '$pattern' not found.
|
||||||
0332 Sdc.tcl:849 patterns argument not supported with -of_objects.
|
0332 Sdc.tcl:865 patterns argument not supported with -of_objects.
|
||||||
0333 Sdc.tcl:873 net '$pattern' not found.
|
0333 Sdc.tcl:889 net '$pattern' not found.
|
||||||
0334 Sdc.tcl:902 patterns argument not supported with -of_objects.
|
0334 Sdc.tcl:918 patterns argument not supported with -of_objects.
|
||||||
0335 Sdc.tcl:939 pin '$pattern' not found.
|
0335 Sdc.tcl:955 pin '$pattern' not found.
|
||||||
0336 Sdc.tcl:996 patterns argument not supported with -of_objects.
|
0336 Sdc.tcl:1012 patterns argument not supported with -of_objects.
|
||||||
0337 Sdc.tcl:1010 port '$pattern' not found.
|
0337 Sdc.tcl:1026 port '$pattern' not found.
|
||||||
0338 Sdc.tcl:1108 non-increasing clock -waveform edge times.
|
0338 Sdc.tcl:1124 non-increasing clock -waveform edge times.
|
||||||
0339 Sdc.tcl:1111 -waveform time greater than two periods.
|
0339 Sdc.tcl:1127 -waveform time greater than two periods.
|
||||||
0341 Sdc.tcl:1469 extra positional argument $arg.
|
0341 Sdc.tcl:1461 extra positional argument $arg.
|
||||||
0342 Sdc.tcl:1502 -clock ignored for clock objects.
|
0342 Sdc.tcl:1494 -clock ignored for clock objects.
|
||||||
0343 Sdc.tcl:1548 set_sense -type data not supported.
|
0343 Sdc.tcl:1540 set_sense -type data not supported.
|
||||||
0344 Sdc.tcl:1563 set_clock_sense is deprecated as of SDC 2.1. Use set_sense -type clock.
|
0344 Sdc.tcl:1555 set_clock_sense is deprecated as of SDC 2.1. Use set_sense -type clock.
|
||||||
0345 Sdc.tcl:1575 -pulse argument not supported.
|
0345 Sdc.tcl:1567 -pulse argument not supported.
|
||||||
0346 Sdc.tcl:1584 -positive, -negative, -stop_propagation and -pulse are mutually exclusive.
|
0346 Sdc.tcl:1576 -positive, -negative, -stop_propagation and -pulse are mutually exclusive.
|
||||||
0347 Sdc.tcl:1597 hierarchical pin '[get_full_name $pin]' not supported.
|
0347 Sdc.tcl:1589 hierarchical pin '[get_full_name $pin]' not supported.
|
||||||
0348 Sdc.tcl:1805 -from/-to keywords ignored for lib_pin, port and pin arguments.
|
0348 Sdc.tcl:1797 -from/-to keywords ignored for lib_pin, port and pin arguments.
|
||||||
0349 Sdc.tcl:1467 unknown keyword argument $arg.
|
0349 Sdc.tcl:1459 unknown keyword argument $arg.
|
||||||
0350 Sdc.tcl:1953 -from, -through or -to required.
|
0350 Sdc.tcl:1945 -from, -through or -to required.
|
||||||
0351 Sdc.tcl:2032 -source_latency_included ignored with -reference_pin.
|
0351 Sdc.tcl:2024 -source_latency_included ignored with -reference_pin.
|
||||||
0352 Sdc.tcl:2035 -network_latency_included ignored with -reference_pin.
|
0352 Sdc.tcl:2027 -network_latency_included ignored with -reference_pin.
|
||||||
0353 Sdc.tcl:2054 $cmd not allowed on [pin_direction $pin] port '[get_full_name $pin]'.
|
0353 Sdc.tcl:2046 $cmd not allowed on [pin_direction $pin] port '[get_full_name $pin]'.
|
||||||
0354 Sdc.tcl:2056 $cmd relative to a clock defined on the same port/pin not allowed.
|
0354 Sdc.tcl:2048 $cmd relative to a clock defined on the same port/pin not allowed.
|
||||||
0355 Sdc.tcl:2099 '$args' ignored.
|
0355 Sdc.tcl:2091 '$args' ignored.
|
||||||
0356 Sdc.tcl:2229 '$args' ignored.
|
0356 Sdc.tcl:2221 '$args' ignored.
|
||||||
0357 Sdc.tcl:2276 virtual clock [get_name $clk] can not be propagated.
|
0357 Sdc.tcl:2268 virtual clock [get_name $clk] can not be propagated.
|
||||||
0358 Sdc.tcl:2425 -multiply_by ignored.
|
0358 Sdc.tcl:2417 -multiply_by ignored.
|
||||||
0359 Sdc.tcl:2428 -dont_scale ignored.
|
0359 Sdc.tcl:2420 -dont_scale ignored.
|
||||||
0360 Sdc.tcl:2431 -no_design_rule ignored.
|
0360 Sdc.tcl:2423 -no_design_rule ignored.
|
||||||
0361 Sdc.tcl:2472 -clock not supported.
|
0361 Sdc.tcl:2464 -clock not supported.
|
||||||
0362 Sdc.tcl:2475 -clock_fall not supported.
|
0362 Sdc.tcl:2467 -clock_fall not supported.
|
||||||
0363 Sdc.tcl:2521 -pin_load not allowed for net objects.
|
0363 Sdc.tcl:2513 -pin_load not allowed for net objects.
|
||||||
0364 Sdc.tcl:2524 -wire_load not allowed for net objects.
|
0364 Sdc.tcl:2516 -wire_load not allowed for net objects.
|
||||||
0365 Sdc.tcl:2527 -rise/-fall not allowed for net objects.
|
0365 Sdc.tcl:2519 -rise/-fall not allowed for net objects.
|
||||||
0366 Sdc.tcl:2660 -data_path, -clock_path, -rise, -fall ignored for ports and designs.
|
0366 Sdc.tcl:2652 -data_path, -clock_path, -rise, -fall ignored for ports and designs.
|
||||||
0367 Sdc.tcl:2730 derating factor greater than 2.0.
|
0367 Sdc.tcl:2722 derating factor greater than 2.0.
|
||||||
0368 Sdc.tcl:2767 -cell_delay and -cell_check flags ignored for net objects.
|
0368 Sdc.tcl:2759 -cell_delay and -cell_check flags ignored for net objects.
|
||||||
0369 Sdc.tcl:2826 no valid objects specified for $key.
|
0369 Sdc.tcl:2818 no valid objects specified for $key.
|
||||||
0370 Sdc.tcl:2859 no valid objects specified for $key
|
0370 Sdc.tcl:2851 no valid objects specified for $key
|
||||||
0371 Sdc.tcl:3020 set_wire_load_min_block_size not supported.
|
0371 Sdc.tcl:3012 set_wire_load_min_block_size not supported.
|
||||||
0372 NetworkEdit.tcl:80 connect_pins is deprecated. Use connect_pin.
|
0372 NetworkEdit.tcl:80 connect_pins is deprecated. Use connect_pin.
|
||||||
0373 Sdc.tcl:3170 define_corners must be called before read_liberty.
|
0373 Sdc.tcl:3162 define_corners must be called before read_liberty.
|
||||||
0400 Util.tcl:44 $cmd $key missing value.
|
0400 Util.tcl:44 $cmd $key missing value.
|
||||||
0401 Util.tcl:61 $cmd $key missing value.
|
0401 Util.tcl:61 $cmd $key missing value.
|
||||||
0402 Util.tcl:71 $cmd $arg is not a known keyword or flag.
|
0402 Util.tcl:71 $cmd $arg is not a known keyword or flag.
|
||||||
|
|
@ -372,81 +370,76 @@
|
||||||
0508 Search.tcl:794 -min and -max cannot both be specified.
|
0508 Search.tcl:794 -min and -max cannot both be specified.
|
||||||
0509 Search.tcl:814 pin '$pin_arg' is hierarchical.
|
0509 Search.tcl:814 pin '$pin_arg' is hierarchical.
|
||||||
0510 Search.tcl:880 -format $format not recognized.
|
0510 Search.tcl:880 -format $format not recognized.
|
||||||
0511 Sdc.tcl:64 cannot open '$filename'.
|
0511 Sdc.tcl:73 cannot open '$filename'.
|
||||||
0512 Sdc.tcl:119 incomplete command at end of file.
|
0512 Sdc.tcl:128 incomplete command at end of file.
|
||||||
0513 Sdc.tcl:203 hierarchy separator must be one of '$sdc_dividers'.
|
0513 Sdc.tcl:212 hierarchy separator must be one of '$sdc_dividers'.
|
||||||
0514 Sdc.tcl:250 unknown unit $unit '$suffix'.
|
0514 Sdc.tcl:259 unknown unit $unit '$suffix'.
|
||||||
0515 Sdc.tcl:323 unknown $unit unit '$suffix'.
|
0515 Sdc.tcl:332 unknown $unit unit '$suffix'.
|
||||||
0516 Sdc.tcl:586 unsupported instance -filter expression.
|
0516 Sdc.tcl:602 unsupported instance -filter expression.
|
||||||
0517 Sdc.tcl:971 unsupported pin -filter expression.
|
0517 Sdc.tcl:987 unsupported pin -filter expression.
|
||||||
0518 Sdc.tcl:1047 unsupported port -filter expression.
|
0518 Sdc.tcl:1063 unsupported port -filter expression.
|
||||||
0519 Sdc.tcl:1080 -add requires -name.
|
0519 Sdc.tcl:1096 -add requires -name.
|
||||||
0520 Sdc.tcl:1085 -name or port_pin_list must be specified.
|
0520 Sdc.tcl:1101 -name or port_pin_list must be specified.
|
||||||
0521 Sdc.tcl:1093 missing -period argument.
|
0521 Sdc.tcl:1109 missing -period argument.
|
||||||
0522 Sdc.tcl:1099 -waveform edge_list must have an even number of edge times.
|
0522 Sdc.tcl:1115 -waveform edge_list must have an even number of edge times.
|
||||||
0523 Sdc.tcl:1152 empty ports/pins/nets argument.
|
0523 Sdc.tcl:1168 empty ports/pins/nets argument.
|
||||||
0524 Sdc.tcl:1160 -add requires -name.
|
0524 Sdc.tcl:1176 -add requires -name.
|
||||||
0525 Sdc.tcl:1165 name or port_pin_list must be specified.
|
0525 Sdc.tcl:1181 name or port_pin_list must be specified.
|
||||||
0526 Sdc.tcl:1172 missing -source argument.
|
0526 Sdc.tcl:1188 missing -source argument.
|
||||||
0527 Sdc.tcl:1189 -master_clock argument empty.
|
0527 Sdc.tcl:1203 -master_clock argument empty.
|
||||||
0528 Sdc.tcl:1192 -add requireds -master_clock.
|
0528 Sdc.tcl:1206 -add requireds -master_clock.
|
||||||
0529 Sdc.tcl:1196 -multiply_by and -divide_by options are exclusive.
|
0529 Sdc.tcl:1210 -multiply_by and -divide_by options are exclusive.
|
||||||
0530 Sdc.tcl:1200 -divide_by is not an integer greater than one.
|
0530 Sdc.tcl:1214 -divide_by is not an integer greater than one.
|
||||||
0531 Sdc.tcl:1203 -combinational implies -divide_by 1.
|
0531 Sdc.tcl:1217 -combinational implies -divide_by 1.
|
||||||
0532 Sdc.tcl:1208 -multiply_by is not an integer greater than one.
|
0532 Sdc.tcl:1222 -multiply_by is not an integer greater than one.
|
||||||
0533 Sdc.tcl:1214 -duty_cycle is not a float between 0 and 100.
|
0533 Sdc.tcl:1228 -duty_cycle is not a float between 0 and 100.
|
||||||
0534 Sdc.tcl:1220 -edges only supported for three edges.
|
0534 Sdc.tcl:1234 -edges only supported for three edges.
|
||||||
0535 Sdc.tcl:1226 edges times are not monotonically increasing.
|
0535 Sdc.tcl:1240 edges times are not monotonically increasing.
|
||||||
0536 Sdc.tcl:1235 -edge_shift length does not match -edges length.
|
0536 Sdc.tcl:1249 -edge_shift length does not match -edges length.
|
||||||
0537 Sdc.tcl:1241 missing -multiply_by, -divide_by, -combinational or -edges argument.
|
0537 Sdc.tcl:1255 missing -multiply_by, -divide_by, -combinational or -edges argument.
|
||||||
0538 Sdc.tcl:1249 cannot specify -invert without -multiply_by, -divide_by or -combinational.
|
0538 Sdc.tcl:1263 cannot specify -invert without -multiply_by, -divide_by or -combinational.
|
||||||
0539 Sdc.tcl:1255 -duty_cycle requires -multiply_by value.
|
0539 Sdc.tcl:1269 -duty_cycle requires -multiply_by value.
|
||||||
0540 Sdc.tcl:1260 missing -pll_output argument.
|
0545 Sdc.tcl:1305 group_path command failed.
|
||||||
0541 Sdc.tcl:1263 missing -pll_feedback argument.
|
0546 Sdc.tcl:1312 positional arguments not supported.
|
||||||
0542 Sdc.tcl:1269 PLL output and feedback pins must be on the same instance.
|
0547 Sdc.tcl:1316 -from, -through or -to required.
|
||||||
0543 Sdc.tcl:1272 source pin must be on the same instance as the PLL output pin.
|
0548 Sdc.tcl:1322 -name and -default are mutually exclusive.
|
||||||
0544 Sdc.tcl:1275 PLL output must be one of the clock pins.
|
0549 Sdc.tcl:1324 -name or -default option is required.
|
||||||
0545 Sdc.tcl:1313 group_path command failed.
|
0550 Sdc.tcl:1365 cannot specify both -high and -low.
|
||||||
0546 Sdc.tcl:1320 positional arguments not supported.
|
0551 Sdc.tcl:1373 missing -setup or -hold argument.
|
||||||
0547 Sdc.tcl:1324 -from, -through or -to required.
|
0552 Sdc.tcl:1387 -high and -low only permitted for pins and instances.
|
||||||
0548 Sdc.tcl:1330 -name and -default are mutually exclusive.
|
0553 Sdc.tcl:1394 -high and -low only permitted for pins and instances.
|
||||||
0549 Sdc.tcl:1332 -name or -default option is required.
|
0554 Sdc.tcl:1437 one of -logically_exclusive, -physically_exclusive or -asynchronous is required.
|
||||||
0550 Sdc.tcl:1373 cannot specify both -high and -low.
|
0555 Sdc.tcl:1440 the keywords -logically_exclusive, -physically_exclusive and -asynchronous are mutually exclusive.
|
||||||
0551 Sdc.tcl:1381 missing -setup or -hold argument.
|
0556 Sdc.tcl:1508 -source '[get_full_name $pin]' is not a clock pin.
|
||||||
0552 Sdc.tcl:1395 -high and -low only permitted for pins and instances.
|
0557 Sdc.tcl:1515 -early/-late is only allowed with -source.
|
||||||
0553 Sdc.tcl:1402 -high and -low only permitted for pins and instances.
|
0558 Sdc.tcl:1544 set_sense -type clock|data
|
||||||
0554 Sdc.tcl:1445 one of -logically_exclusive, -physically_exclusive or -asynchronous is required.
|
0559 Sdc.tcl:1613 transition time can not be specified for virtual clocks.
|
||||||
0555 Sdc.tcl:1448 the keywords -logically_exclusive, -physically_exclusive and -asynchronous are mutually exclusive.
|
0560 Sdc.tcl:1634 missing uncertainty value.
|
||||||
0556 Sdc.tcl:1516 -source '[get_full_name $pin]' is not a clock pin.
|
0561 Sdc.tcl:1682 -from/-to must be used together.
|
||||||
0557 Sdc.tcl:1523 -early/-late is only allowed with -source.
|
0562 Sdc.tcl:1702 -rise, -fall options not allowed for single clock uncertainty.
|
||||||
0558 Sdc.tcl:1552 set_sense -type clock|data
|
0563 Sdc.tcl:1743 missing -from, -rise_from or -fall_from argument.
|
||||||
0559 Sdc.tcl:1621 transition time can not be specified for virtual clocks.
|
0564 Sdc.tcl:1755 missing -to, -rise_to or -fall_to argument.
|
||||||
0560 Sdc.tcl:1642 missing uncertainty value.
|
0565 Sdc.tcl:1827 -from/-to hierarchical instance not supported.
|
||||||
0561 Sdc.tcl:1690 -from/-to must be used together.
|
0566 Sdc.tcl:1859 pin '[get_full_name $inst]${hierarchy_separator}${port_name}' not found.
|
||||||
0562 Sdc.tcl:1710 -rise, -fall options not allowed for single clock uncertainty.
|
0567 Sdc.tcl:1900 pin '[get_name $cell]${hierarchy_separator}${port_name}' not found.
|
||||||
0563 Sdc.tcl:1751 missing -from, -rise_from or -fall_from argument.
|
0568 Sdc.tcl:2085 missing delay argument.
|
||||||
0564 Sdc.tcl:1763 missing -to, -rise_to or -fall_to argument.
|
0569 Sdc.tcl:2216 missing path multiplier argument.
|
||||||
0565 Sdc.tcl:1835 -from/-to hierarchical instance not supported.
|
0570 Sdc.tcl:2228 cannot use -start with -end.
|
||||||
0566 Sdc.tcl:1867 pin '[get_full_name $inst]${hierarchy_separator}${port_name}' not found.
|
0571 Sdc.tcl:2296 value must be 0, zero, 1, one, rise, rising, fall, or falling.
|
||||||
0567 Sdc.tcl:1908 pin '[get_name $cell]${hierarchy_separator}${port_name}' not found.
|
0572 Sdc.tcl:2354 cell '$lib_name:$cell_name' not found.
|
||||||
0568 Sdc.tcl:2093 missing delay argument.
|
0573 Sdc.tcl:2360 '$cell_name' not found.
|
||||||
0569 Sdc.tcl:2224 missing path multiplier argument.
|
0574 Sdc.tcl:2364 missing -lib_cell argument.
|
||||||
0570 Sdc.tcl:2236 cannot use -start with -end.
|
0575 Sdc.tcl:2372 port '$to_port_name' not found.
|
||||||
0571 Sdc.tcl:2304 value must be 0, zero, 1, one, rise, rising, fall, or falling.
|
0576 Sdc.tcl:2384 -pin argument required for cells with multiple outputs.
|
||||||
0572 Sdc.tcl:2362 cell '$lib_name:$cell_name' not found.
|
0577 Sdc.tcl:2399 port '$from_port_name' not found.
|
||||||
0573 Sdc.tcl:2368 '$cell_name' not found.
|
0578 Sdc.tcl:2606 port '[get_name $port]' is not an input.
|
||||||
0574 Sdc.tcl:2372 missing -lib_cell argument.
|
0579 Sdc.tcl:2968 operating condition '$op_cond_name' not found.
|
||||||
0575 Sdc.tcl:2380 port '$to_port_name' not found.
|
0580 Sdc.tcl:2986 operating condition '$op_cond_name' not found.
|
||||||
0576 Sdc.tcl:2392 -pin argument required for cells with multiple outputs.
|
0581 Sdc.tcl:3000 -analysis_type must be single, bc_wc or on_chip_variation.
|
||||||
0577 Sdc.tcl:2407 port '$from_port_name' not found.
|
0582 Sdc.tcl:3025 mode must be top, enclosed or segmented.
|
||||||
0578 Sdc.tcl:2614 port '[get_name $port]' is not an input.
|
0583 Sdc.tcl:3040 no wire load model specified.
|
||||||
0579 Sdc.tcl:2976 operating condition '$op_cond_name' not found.
|
0584 Sdc.tcl:3101 wire load selection group '$selection_name' not found.
|
||||||
0580 Sdc.tcl:2994 operating condition '$op_cond_name' not found.
|
0585 Sdc.tcl:3232 no default operating conditions found.
|
||||||
0581 Sdc.tcl:3008 -analysis_type must be single, bc_wc or on_chip_variation.
|
|
||||||
0582 Sdc.tcl:3033 mode must be top, enclosed or segmented.
|
|
||||||
0583 Sdc.tcl:3048 no wire load model specified.
|
|
||||||
0584 Sdc.tcl:3109 wire load selection group '$selection_name' not found.
|
|
||||||
0585 Sdc.tcl:3240 no default operating conditions found.
|
|
||||||
0586 NetworkEdit.tcl:50 unsupported object type $object_type.
|
0586 NetworkEdit.tcl:50 unsupported object type $object_type.
|
||||||
0587 NetworkEdit.tcl:119 unsupported object type $object_type.
|
0587 NetworkEdit.tcl:119 unsupported object type $object_type.
|
||||||
0588 NetworkEdit.tcl:135 unsupported object type $object_type.
|
0588 NetworkEdit.tcl:135 unsupported object type $object_type.
|
||||||
|
|
@ -459,15 +452,15 @@
|
||||||
0595 DelayNormal2.cc:378 unknown early/late value.
|
0595 DelayNormal2.cc:378 unknown early/late value.
|
||||||
0596 Sim.cc:205 unknown function operator
|
0596 Sim.cc:205 unknown function operator
|
||||||
0597 EstimateParasitics.cc:188 load pin not leaf or top level
|
0597 EstimateParasitics.cc:188 load pin not leaf or top level
|
||||||
0600 Sdc.tcl:1949 '$args' ignored.
|
0600 Sdc.tcl:1941 '$args' ignored.
|
||||||
0601 Sdc.tcl:2448 set_fanout_load not supported.
|
0601 Sdc.tcl:2440 set_fanout_load not supported.
|
||||||
0602 Sdc.tcl:2908 no valid objects specified for $key.
|
0602 Sdc.tcl:2900 no valid objects specified for $key.
|
||||||
0603 NetworkEdit.tcl:172 disconnect_pins is deprecated. Use disconnect_pin.
|
0603 NetworkEdit.tcl:172 disconnect_pins is deprecated. Use disconnect_pin.
|
||||||
0604 Sdc.tcl:272 unknown $unit prefix '$prefix'.
|
0604 Sdc.tcl:281 unknown $unit prefix '$prefix'.
|
||||||
0605 Sdc.tcl:3070 wire load model '$model_name' not found.
|
0605 Sdc.tcl:3062 wire load model '$model_name' not found.
|
||||||
0606 Sta.tcl:1130 get_property unsupported object type $object_type.
|
0606 Sta.tcl:1130 get_property unsupported object type $object_type.
|
||||||
0607 StaTcl.i:4417 unknown report path field %s
|
0607 StaTcl.i:4415 unknown report path field %s
|
||||||
0608 StaTcl.i:4429 unknown report path field %s
|
0608 StaTcl.i:4427 unknown report path field %s
|
||||||
0609 Search.tcl:427 -all_violators is deprecated. Use -violators
|
0609 Search.tcl:427 -all_violators is deprecated. Use -violators
|
||||||
0610 Search.tcl:507 -max_transition deprecated. Use -max_slew.
|
0610 Search.tcl:507 -max_transition deprecated. Use -max_slew.
|
||||||
0611 Search.tcl:512 -min_transition deprecated. Use -min_slew.
|
0611 Search.tcl:512 -min_transition deprecated. Use -min_slew.
|
||||||
|
|
@ -488,9 +481,11 @@
|
||||||
0705 Liberty.cc:793 Liberty cell %s/%s for corner %s/%s not found
|
0705 Liberty.cc:793 Liberty cell %s/%s for corner %s/%s not found
|
||||||
0706 Parasitics.tcl:70 read_spef -increment is deprecated.
|
0706 Parasitics.tcl:70 read_spef -increment is deprecated.
|
||||||
0710 LumpedCapDelayCalc.cc:168 gate delay input variable is NaN
|
0710 LumpedCapDelayCalc.cc:168 gate delay input variable is NaN
|
||||||
0800 VcdReader.cc:108 unhandled vcd command.
|
0800 VcdReader.cc:109 unhandled vcd command.
|
||||||
0801 VcdReader.cc:143 timescale syntax error.
|
0801 VcdReader.cc:145 timescale syntax error.
|
||||||
0802 VcdReader.cc:157 Unknown timescale unit.
|
0802 VcdReader.cc:159 Unknown timescale unit.
|
||||||
0804 VcdReader.cc:198 Variable syntax error.
|
0804 VcdReader.cc:200 Variable syntax error.
|
||||||
0805 Vcd.cc:170 Unknown variable %s ID %s
|
0805 Vcd.cc:172 Unknown variable %s ID %s
|
||||||
0806 ReadVcdActivities.cc:216 clock %s vcd period %s differs from clock definition %s
|
0806 ReadVcdActivities.cc:227 clock %s vcd period %s differs from SDC clock period %s
|
||||||
|
0807 Sdc.tcl:453 only one of -cells, -data_pins, -clock_pins, -async_pins, -output_pins are suppported.
|
||||||
|
0810 MakeTimingModel.cc:167 clock %s pin %s is inside model block.
|
||||||
|
|
|
||||||
|
|
@ -36,8 +36,6 @@ Clock::Clock(const char *name,
|
||||||
int index) :
|
int index) :
|
||||||
name_(stringCopy(name)),
|
name_(stringCopy(name)),
|
||||||
add_to_pins_(false),
|
add_to_pins_(false),
|
||||||
pll_out_(nullptr),
|
|
||||||
pll_fdbk_(nullptr),
|
|
||||||
period_(0.0),
|
period_(0.0),
|
||||||
waveform_(nullptr),
|
waveform_(nullptr),
|
||||||
waveform_valid_(false),
|
waveform_valid_(false),
|
||||||
|
|
@ -312,8 +310,6 @@ Clock::initGeneratedClk(PinSet *pins,
|
||||||
bool add_to_pins,
|
bool add_to_pins,
|
||||||
Pin *src_pin,
|
Pin *src_pin,
|
||||||
Clock *master_clk,
|
Clock *master_clk,
|
||||||
Pin *pll_out,
|
|
||||||
Pin *pll_fdbk,
|
|
||||||
int divide_by,
|
int divide_by,
|
||||||
int multiply_by,
|
int multiply_by,
|
||||||
float duty_cycle,
|
float duty_cycle,
|
||||||
|
|
@ -332,8 +328,6 @@ Clock::initGeneratedClk(PinSet *pins,
|
||||||
master_clk_ = master_clk;
|
master_clk_ = master_clk;
|
||||||
master_clk_infered_ = false;
|
master_clk_infered_ = false;
|
||||||
waveform_valid_ = false;
|
waveform_valid_ = false;
|
||||||
pll_out_= pll_out;
|
|
||||||
pll_fdbk_ = pll_fdbk;
|
|
||||||
divide_by_ = divide_by;
|
divide_by_ = divide_by;
|
||||||
multiply_by_ = multiply_by;
|
multiply_by_ = multiply_by;
|
||||||
duty_cycle_ = duty_cycle;
|
duty_cycle_ = duty_cycle;
|
||||||
|
|
|
||||||
|
|
@ -993,8 +993,6 @@ Sdc::makeGeneratedClock(const char *name,
|
||||||
bool add_to_pins,
|
bool add_to_pins,
|
||||||
Pin *src_pin,
|
Pin *src_pin,
|
||||||
Clock *master_clk,
|
Clock *master_clk,
|
||||||
Pin *pll_out,
|
|
||||||
Pin *pll_fdbk,
|
|
||||||
int divide_by,
|
int divide_by,
|
||||||
int multiply_by,
|
int multiply_by,
|
||||||
float duty_cycle,
|
float duty_cycle,
|
||||||
|
|
@ -1015,7 +1013,6 @@ Sdc::makeGeneratedClock(const char *name,
|
||||||
clock_name_map_[clk->name()] = clk;
|
clock_name_map_[clk->name()] = clk;
|
||||||
}
|
}
|
||||||
clk->initGeneratedClk(pins, add_to_pins, src_pin, master_clk,
|
clk->initGeneratedClk(pins, add_to_pins, src_pin, master_clk,
|
||||||
pll_out, pll_fdbk,
|
|
||||||
divide_by, multiply_by, duty_cycle,
|
divide_by, multiply_by, duty_cycle,
|
||||||
invert, combinational,
|
invert, combinational,
|
||||||
edges, edge_shifts, propagate_all_clks_,
|
edges, edge_shifts, propagate_all_clks_,
|
||||||
|
|
|
||||||
|
|
@ -433,16 +433,6 @@ WriteSdc::writeGeneratedClock(Clock *clk) const
|
||||||
gzprintf(stream_, " -master_clock ");
|
gzprintf(stream_, " -master_clock ");
|
||||||
writeGetClock(master);
|
writeGetClock(master);
|
||||||
}
|
}
|
||||||
Pin *pll_out = clk->pllOut();
|
|
||||||
if (pll_out) {
|
|
||||||
gzprintf(stream_, " -pll_out ");
|
|
||||||
writeGetPin(pll_out, true);
|
|
||||||
}
|
|
||||||
Pin *pll_fdbk = clk->pllFdbk();
|
|
||||||
if (pll_fdbk) {
|
|
||||||
gzprintf(stream_, " -pll_feedback ");
|
|
||||||
writeGetPin(pll_fdbk, false);
|
|
||||||
}
|
|
||||||
if (clk->combinational())
|
if (clk->combinational())
|
||||||
gzprintf(stream_, " -combinational");
|
gzprintf(stream_, " -combinational");
|
||||||
int divide_by = clk->divideBy();
|
int divide_by = clk->divideBy();
|
||||||
|
|
|
||||||
|
|
@ -51,8 +51,6 @@ public:
|
||||||
VertexSet *fanins() const { return fanins_; }
|
VertexSet *fanins() const { return fanins_; }
|
||||||
Level gclkLevel() const { return gclk_level_; }
|
Level gclkLevel() const { return gclk_level_; }
|
||||||
FilterPath *srcFilter() const { return src_filter_; }
|
FilterPath *srcFilter() const { return src_filter_; }
|
||||||
FilterPath *pllFilter() const { return pll_filter_; }
|
|
||||||
void setPllFilter(FilterPath *pll_filter);
|
|
||||||
void setLatchFdbkEdges(EdgeSet *fdbk_edges);
|
void setLatchFdbkEdges(EdgeSet *fdbk_edges);
|
||||||
bool foundLatchFdbkEdges() const { return found_latch_fdbk_edges_; }
|
bool foundLatchFdbkEdges() const { return found_latch_fdbk_edges_; }
|
||||||
void setFoundLatchFdbkEdges(bool found);
|
void setFoundLatchFdbkEdges(bool found);
|
||||||
|
|
@ -64,7 +62,6 @@ protected:
|
||||||
EdgeSet *fdbk_edges_;
|
EdgeSet *fdbk_edges_;
|
||||||
bool found_latch_fdbk_edges_;
|
bool found_latch_fdbk_edges_;
|
||||||
FilterPath *src_filter_;
|
FilterPath *src_filter_;
|
||||||
FilterPath *pll_filter_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
GenclkInfo::GenclkInfo(Clock *gclk,
|
GenclkInfo::GenclkInfo(Clock *gclk,
|
||||||
|
|
@ -76,8 +73,7 @@ GenclkInfo::GenclkInfo(Clock *gclk,
|
||||||
fanins_(fanins),
|
fanins_(fanins),
|
||||||
fdbk_edges_(nullptr),
|
fdbk_edges_(nullptr),
|
||||||
found_latch_fdbk_edges_(false),
|
found_latch_fdbk_edges_(false),
|
||||||
src_filter_(src_filter),
|
src_filter_(src_filter)
|
||||||
pll_filter_(nullptr)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -86,13 +82,6 @@ GenclkInfo::~GenclkInfo()
|
||||||
delete fanins_;
|
delete fanins_;
|
||||||
delete fdbk_edges_;
|
delete fdbk_edges_;
|
||||||
delete src_filter_;
|
delete src_filter_;
|
||||||
delete pll_filter_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GenclkInfo::setPllFilter(FilterPath *pll_filter)
|
|
||||||
{
|
|
||||||
pll_filter_ = pll_filter;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -217,8 +206,6 @@ Genclks::ensureInsertionDelays()
|
||||||
Clock *gclk = gclk_iter.next();
|
Clock *gclk = gclk_iter.next();
|
||||||
if (gclk->masterClk()) {
|
if (gclk->masterClk()) {
|
||||||
findInsertionDelays(gclk);
|
findInsertionDelays(gclk);
|
||||||
if (gclk->pllOut())
|
|
||||||
findPllDelays(gclk);
|
|
||||||
recordSrcPaths(gclk);
|
recordSrcPaths(gclk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -295,93 +282,57 @@ Genclks::ensureMaster(Clock *gclk)
|
||||||
if (master_clk == nullptr) {
|
if (master_clk == nullptr) {
|
||||||
int master_clk_count = 0;
|
int master_clk_count = 0;
|
||||||
bool found_master = false;
|
bool found_master = false;
|
||||||
if (gclk->pllOut()) {
|
Pin *src_pin = gclk->srcPin();
|
||||||
|
ClockSet *master_clks = sdc_->findClocks(src_pin);
|
||||||
|
ClockSet::Iterator master_iter(master_clks);
|
||||||
|
if (master_iter.hasNext()) {
|
||||||
|
while (master_iter.hasNext()) {
|
||||||
|
master_clk = master_iter.next();
|
||||||
|
// Master source pin can actually be a clock source pin.
|
||||||
|
if (master_clk != gclk) {
|
||||||
|
gclk->setInferedMasterClk(master_clk);
|
||||||
|
debugPrint(debug_, "genclk", 2, " %s master clk %s",
|
||||||
|
gclk->name(),
|
||||||
|
master_clk->name());
|
||||||
|
found_master = true;
|
||||||
|
master_clk_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found_master) {
|
||||||
// Search backward from generated clock source pin to a clock pin.
|
// Search backward from generated clock source pin to a clock pin.
|
||||||
GenClkMasterSearchPred pred(this);
|
GenClkMasterSearchPred pred(this);
|
||||||
BfsBkwdIterator iter(BfsIndex::other, &pred, this);
|
BfsBkwdIterator iter(BfsIndex::other, &pred, this);
|
||||||
seedSrcPins(gclk, iter);
|
seedSrcPins(gclk, iter);
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
Vertex *vertex = iter.next();
|
Vertex *vertex = iter.next();
|
||||||
Pin *pin = vertex->pin();
|
Pin *pin = vertex->pin();
|
||||||
if (sdc_->isLeafPinClock(pin)) {
|
if (sdc_->isLeafPinClock(pin)) {
|
||||||
ClockSet *master_clks = sdc_->findLeafPinClocks(pin);
|
ClockSet *master_clks = sdc_->findLeafPinClocks(pin);
|
||||||
if (master_clks) {
|
if (master_clks) {
|
||||||
ClockSet::Iterator master_iter(master_clks);
|
ClockSet::Iterator master_iter(master_clks);
|
||||||
while (master_iter.hasNext()) {
|
if (master_iter.hasNext()) {
|
||||||
master_clk = master_iter.next();
|
master_clk = master_iter.next();
|
||||||
// Master source pin can actually be a clock source pin.
|
// Master source pin can actually be a clock source pin.
|
||||||
if (master_clk != gclk) {
|
if (master_clk != gclk) {
|
||||||
gclk->setInferedMasterClk(master_clk);
|
gclk->setInferedMasterClk(master_clk);
|
||||||
debugPrint(debug_, "genclk", 2, " %s master clk %s",
|
debugPrint(debug_, "genclk", 2, " %s master clk %s",
|
||||||
gclk->name(),
|
gclk->name(),
|
||||||
master_clk->name());
|
master_clk->name());
|
||||||
found_master = true;
|
master_clk_count++;
|
||||||
master_clk_count++;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (found_master)
|
iter.enqueueAdjacentVertices(vertex);
|
||||||
break;
|
|
||||||
iter.enqueueAdjacentVertices(vertex);
|
|
||||||
}
|
}
|
||||||
if (master_clk_count > 1)
|
|
||||||
report_->warn(11, "generated clock %s is in the fanout of multiple clocks.",
|
|
||||||
gclk->name());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Pin *src_pin = gclk->srcPin();
|
|
||||||
ClockSet *master_clks = sdc_->findClocks(src_pin);
|
|
||||||
ClockSet::Iterator master_iter(master_clks);
|
|
||||||
if (master_iter.hasNext()) {
|
|
||||||
while (master_iter.hasNext()) {
|
|
||||||
master_clk = master_iter.next();
|
|
||||||
// Master source pin can actually be a clock source pin.
|
|
||||||
if (master_clk != gclk) {
|
|
||||||
gclk->setInferedMasterClk(master_clk);
|
|
||||||
debugPrint(debug_, "genclk", 2, " %s master clk %s",
|
|
||||||
gclk->name(),
|
|
||||||
master_clk->name());
|
|
||||||
found_master = true;
|
|
||||||
master_clk_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found_master) {
|
|
||||||
// Search backward from generated clock source pin to a clock pin.
|
|
||||||
GenClkMasterSearchPred pred(this);
|
|
||||||
BfsBkwdIterator iter(BfsIndex::other, &pred, this);
|
|
||||||
seedSrcPins(gclk, iter);
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
Vertex *vertex = iter.next();
|
|
||||||
Pin *pin = vertex->pin();
|
|
||||||
if (sdc_->isLeafPinClock(pin)) {
|
|
||||||
ClockSet *master_clks = sdc_->findLeafPinClocks(pin);
|
|
||||||
if (master_clks) {
|
|
||||||
ClockSet::Iterator master_iter(master_clks);
|
|
||||||
if (master_iter.hasNext()) {
|
|
||||||
master_clk = master_iter.next();
|
|
||||||
// Master source pin can actually be a clock source pin.
|
|
||||||
if (master_clk != gclk) {
|
|
||||||
gclk->setInferedMasterClk(master_clk);
|
|
||||||
debugPrint(debug_, "genclk", 2, " %s master clk %s",
|
|
||||||
gclk->name(),
|
|
||||||
master_clk->name());
|
|
||||||
master_clk_count++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
iter.enqueueAdjacentVertices(vertex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (master_clk_count > 1)
|
|
||||||
report_->warn(12,
|
|
||||||
"generated clock %s pin %s is in the fanout of multiple clocks.",
|
|
||||||
gclk->name(),
|
|
||||||
network_->pathName(src_pin));
|
|
||||||
}
|
}
|
||||||
|
if (master_clk_count > 1)
|
||||||
|
report_->warn(12,
|
||||||
|
"generated clock %s pin %s is in the fanout of multiple clocks.",
|
||||||
|
gclk->name(),
|
||||||
|
network_->pathName(src_pin));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1066,23 +1017,7 @@ Genclks::insertionDelay(const Clock *clk,
|
||||||
PathVertex src_path;
|
PathVertex src_path;
|
||||||
PathAnalysisPt *insert_ap = path_ap->insertionAnalysisPt(early_late);
|
PathAnalysisPt *insert_ap = path_ap->insertionAnalysisPt(early_late);
|
||||||
srcPath(clk, pin, rf, insert_ap, src_path);
|
srcPath(clk, pin, rf, insert_ap, src_path);
|
||||||
if (clk->pllFdbk()) {
|
if (!src_path.isNull())
|
||||||
const MinMax *min_max = path_ap->pathMinMax();
|
|
||||||
PathAnalysisPt *pll_ap = path_ap->insertionAnalysisPt(min_max->opposite());
|
|
||||||
Arrival pll_delay = pllDelay(clk, rf, pll_ap);
|
|
||||||
if (src_path.isNull())
|
|
||||||
return -pll_delay;
|
|
||||||
else {
|
|
||||||
PathRef prev;
|
|
||||||
src_path.prevPath(this, prev);
|
|
||||||
if (prev.isNull())
|
|
||||||
return -pll_delay;
|
|
||||||
else
|
|
||||||
// PLL delay replaces clkin->clkout delay.
|
|
||||||
return prev.arrival(this) - pll_delay;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!src_path.isNull())
|
|
||||||
return src_path.arrival(this);
|
return src_path.arrival(this);
|
||||||
else
|
else
|
||||||
return 0.0;
|
return 0.0;
|
||||||
|
|
@ -1090,170 +1025,6 @@ Genclks::insertionDelay(const Clock *clk,
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void
|
|
||||||
Genclks::findPllDelays(Clock *gclk)
|
|
||||||
{
|
|
||||||
debugPrint(debug_, "genclk", 2, "find gen clk %s pll delay",
|
|
||||||
gclk->name());
|
|
||||||
FilterPath *pll_filter = makePllFilter(gclk);
|
|
||||||
GenclkInfo *genclk_info = genclkInfo(gclk);
|
|
||||||
if (genclk_info) {
|
|
||||||
genclk_info->setPllFilter(pll_filter);
|
|
||||||
ClkTreeSearchPred srch_pred(this);
|
|
||||||
BfsFwdIterator pll_iter(BfsIndex::other, &srch_pred, this);
|
|
||||||
seedPllPin(gclk, pll_filter, pll_iter);
|
|
||||||
// Propagate arrivals to pll feedback pin level.
|
|
||||||
findPllArrivals(gclk, pll_iter);
|
|
||||||
sdc_->unrecordException(pll_filter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FilterPath *
|
|
||||||
Genclks::makePllFilter(const Clock *gclk)
|
|
||||||
{
|
|
||||||
PinSet *from_pins = new PinSet;
|
|
||||||
from_pins->insert(gclk->pllOut());
|
|
||||||
RiseFallBoth *rf = RiseFallBoth::riseFall();
|
|
||||||
ExceptionFrom *from = sdc_->makeExceptionFrom(from_pins,nullptr,nullptr,rf);
|
|
||||||
|
|
||||||
PinSet *to_pins = new PinSet;
|
|
||||||
to_pins->insert(gclk->pllFdbk());
|
|
||||||
ExceptionTo *to = sdc_->makeExceptionTo(to_pins, nullptr, nullptr, rf, rf);
|
|
||||||
|
|
||||||
return sdc_->makeFilterPath(from, nullptr, to);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Genclks::seedPllPin(const Clock *gclk,
|
|
||||||
FilterPath *pll_filter,
|
|
||||||
BfsFwdIterator &pll_iter)
|
|
||||||
{
|
|
||||||
Pin *pll_out_pin = gclk->pllOut();
|
|
||||||
Vertex *vertex = graph_->pinDrvrVertex(pll_out_pin);
|
|
||||||
if (vertex) {
|
|
||||||
debugPrint(debug_, "genclk", 2, " seed pllout pin %s",
|
|
||||||
network_->pathName(pll_out_pin));
|
|
||||||
TagGroupBldr tag_bldr(true, this);
|
|
||||||
tag_bldr.init(vertex);
|
|
||||||
copyGenClkSrcPaths(vertex, &tag_bldr);
|
|
||||||
for (auto path_ap : corners_->pathAnalysisPts()) {
|
|
||||||
for (auto tr : RiseFall::range()) {
|
|
||||||
Tag *tag = makeTag(gclk, gclk, pll_out_pin, tr, pll_filter, path_ap);
|
|
||||||
tag_bldr.setArrival(tag, 0.0, nullptr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
search_->setVertexArrivals(vertex, &tag_bldr);
|
|
||||||
pll_iter.enqueueAdjacentVertices(vertex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class PllEvalPred : public EvalPred
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit PllEvalPred(const StaState *sta);
|
|
||||||
// Override EvalPred::searchTo to allow eval at generated clk root.
|
|
||||||
virtual bool searchTo(const Vertex *to_vertex);
|
|
||||||
};
|
|
||||||
|
|
||||||
PllEvalPred::PllEvalPred(const StaState *sta) :
|
|
||||||
EvalPred(sta)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
PllEvalPred::searchTo(const Vertex *)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
class PllArrivalVisitor : public ArrivalVisitor
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
PllArrivalVisitor(const StaState *sta,
|
|
||||||
BfsFwdIterator &pll_iter);
|
|
||||||
virtual void visit(Vertex *vertex);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
BfsFwdIterator &pll_iter_;
|
|
||||||
};
|
|
||||||
|
|
||||||
PllArrivalVisitor::PllArrivalVisitor(const StaState *sta,
|
|
||||||
BfsFwdIterator &pll_iter) :
|
|
||||||
ArrivalVisitor(sta),
|
|
||||||
pll_iter_(pll_iter)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
PllArrivalVisitor::visit(Vertex *vertex)
|
|
||||||
{
|
|
||||||
Genclks *genclks = search_->genclks();
|
|
||||||
debugPrint(debug_, "genclk", 2, "find gen clk pll arrival %s",
|
|
||||||
vertex->name(sdc_network_));
|
|
||||||
tag_bldr_->init(vertex);
|
|
||||||
genclks->copyGenClkSrcPaths(vertex, tag_bldr_);
|
|
||||||
has_fanin_one_ = graph_->hasFaninOne(vertex);
|
|
||||||
visitFaninPaths(vertex);
|
|
||||||
pll_iter_.enqueueAdjacentVertices(vertex);
|
|
||||||
search_->setVertexArrivals(vertex, tag_bldr_);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Genclks::findPllArrivals(const Clock *gclk,
|
|
||||||
BfsFwdIterator &pll_iter)
|
|
||||||
{
|
|
||||||
Pin *fdbk_pin = gclk->pllFdbk();
|
|
||||||
Vertex *fdbk_vertex = graph_->pinLoadVertex(fdbk_pin);
|
|
||||||
Level fdbk_level = fdbk_vertex->level();
|
|
||||||
PllArrivalVisitor arrival_visitor(this, pll_iter);
|
|
||||||
PllEvalPred eval_pred(this);
|
|
||||||
arrival_visitor.init(true, &eval_pred);
|
|
||||||
while (pll_iter.hasNext(fdbk_level)) {
|
|
||||||
Vertex *vertex = pll_iter.next();
|
|
||||||
arrival_visitor.visit(vertex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Arrival
|
|
||||||
Genclks::pllDelay(const Clock *clk,
|
|
||||||
const RiseFall *rf,
|
|
||||||
const PathAnalysisPt *path_ap) const
|
|
||||||
{
|
|
||||||
Vertex *fdbk_vertex = graph_->pinLoadVertex(clk->pllFdbk());
|
|
||||||
GenclkInfo *genclk_info = genclkInfo(clk);
|
|
||||||
if (genclk_info) {
|
|
||||||
FilterPath *pll_filter = genclk_info->pllFilter();
|
|
||||||
VertexPathIterator fdbk_path_iter(fdbk_vertex, rf, path_ap, this);
|
|
||||||
while (fdbk_path_iter.hasNext()) {
|
|
||||||
Path *path = fdbk_path_iter.next();
|
|
||||||
if (matchesPllFilter(path, pll_filter))
|
|
||||||
return path->arrival(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return delay_zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
Genclks::matchesPllFilter(Path *path,
|
|
||||||
FilterPath *pll_filter) const
|
|
||||||
{
|
|
||||||
Tag *tag = path->tag(this);
|
|
||||||
const ExceptionStateSet *states = tag->states();
|
|
||||||
if (tag->isGenClkSrcPath()
|
|
||||||
&& states) {
|
|
||||||
ExceptionStateSet::ConstIterator state_iter(states);
|
|
||||||
while (state_iter.hasNext()) {
|
|
||||||
ExceptionState *state = state_iter.next();
|
|
||||||
ExceptionPath *except = state->exception();
|
|
||||||
if (except == pll_filter)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ClockPinPairLess::operator()(const ClockPinPair &pair1,
|
ClockPinPairLess::operator()(const ClockPinPair &pair1,
|
||||||
const ClockPinPair &pair2) const
|
const ClockPinPair &pair2) const
|
||||||
|
|
|
||||||
|
|
@ -78,9 +78,6 @@ public:
|
||||||
const PathAnalysisPt *path_ap,
|
const PathAnalysisPt *path_ap,
|
||||||
// Return value.
|
// Return value.
|
||||||
PathVertex &src_path) const;
|
PathVertex &src_path) const;
|
||||||
Arrival pllDelay(const Clock *clk,
|
|
||||||
const RiseFall *rf,
|
|
||||||
const PathAnalysisPt *path_ap) const;
|
|
||||||
Vertex *srcPathVertex(const Pin *pin) const;
|
Vertex *srcPathVertex(const Pin *pin) const;
|
||||||
Level clkPinMaxLevel(const Clock *clk) const;
|
Level clkPinMaxLevel(const Clock *clk) const;
|
||||||
void copyGenClkSrcPaths(Vertex *vertex,
|
void copyGenClkSrcPaths(Vertex *vertex,
|
||||||
|
|
@ -99,15 +96,6 @@ private:
|
||||||
const PathAnalysisPt *path_ap) const;
|
const PathAnalysisPt *path_ap) const;
|
||||||
bool matchesSrcFilter(Path *path,
|
bool matchesSrcFilter(Path *path,
|
||||||
const Clock *gclk) const;
|
const Clock *gclk) const;
|
||||||
void findPllDelays(Clock *gclk);
|
|
||||||
FilterPath *makePllFilter(const Clock *gclk);
|
|
||||||
bool matchesPllFilter(Path *path,
|
|
||||||
FilterPath *pll_filter) const;
|
|
||||||
void seedPllPin(const Clock *gclk,
|
|
||||||
FilterPath *pll_filter,
|
|
||||||
BfsFwdIterator &pll_iter);
|
|
||||||
void findPllArrivals(const Clock *gclk,
|
|
||||||
BfsFwdIterator &pll_iter);
|
|
||||||
void seedSrcPins(Clock *gclk,
|
void seedSrcPins(Clock *gclk,
|
||||||
FilterPath *src_filter,
|
FilterPath *src_filter,
|
||||||
BfsFwdIterator &insert_iter);
|
BfsFwdIterator &insert_iter);
|
||||||
|
|
|
||||||
|
|
@ -2218,22 +2218,8 @@ ReportPath::reportGenClkSrcPath1(Clock *clk,
|
||||||
reportClkSrcLatency(insertion, gclk_time, early_late);
|
reportClkSrcLatency(insertion, gclk_time, early_late);
|
||||||
}
|
}
|
||||||
PathExpanded src_expanded(&src_path, this);
|
PathExpanded src_expanded(&src_path, this);
|
||||||
if (clk->pllOut()) {
|
reportPath4(&src_path, src_expanded, skip_first_path, false,
|
||||||
reportPath4(&src_path, src_expanded, skip_first_path, true,
|
clk_used_as_data, gclk_time);
|
||||||
clk_used_as_data, gclk_time);
|
|
||||||
PathAnalysisPt *pll_ap=path_ap->insertionAnalysisPt(min_max->opposite());
|
|
||||||
Arrival pll_delay = search_->genclks()->pllDelay(clk, clk_rf, pll_ap);
|
|
||||||
size_t path_length = src_expanded.size();
|
|
||||||
if (path_length < 2)
|
|
||||||
report_->critical(258, "generated clock pll source path too short.");
|
|
||||||
PathRef *path0 = src_expanded.path(path_length - 2);
|
|
||||||
Arrival time0 = path0->arrival(this) + gclk_time;
|
|
||||||
PathRef *path1 = src_expanded.path(path_length - 1);
|
|
||||||
reportPathLine(path1, -pll_delay, time0 - pll_delay, "pll_delay");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
reportPath4(&src_path, src_expanded, skip_first_path, false,
|
|
||||||
clk_used_as_data, gclk_time);
|
|
||||||
if (!clk->isPropagated())
|
if (!clk->isPropagated())
|
||||||
reportLine("clock network delay (ideal)", 0.0,
|
reportLine("clock network delay (ideal)", 0.0,
|
||||||
src_path.arrival(this), min_max);
|
src_path.arrival(this), min_max);
|
||||||
|
|
|
||||||
|
|
@ -2097,15 +2097,6 @@ PathVisitor::visitFromPath(const Pin *from_pin,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
// PLL out to feedback path.
|
|
||||||
to_tag = search_->thruTag(from_tag, edge, to_rf, min_max, path_ap);
|
|
||||||
if (to_tag) {
|
|
||||||
arc_delay = search_->deratedDelay(from_vertex, arc, edge, true,
|
|
||||||
path_ap);
|
|
||||||
to_arrival = from_arrival + arc_delay;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (role->genericRole() == TimingRole::regClkToQ()) {
|
else if (role->genericRole() == TimingRole::regClkToQ()) {
|
||||||
|
|
@ -3497,15 +3488,6 @@ Search::ensureDownstreamClkPins()
|
||||||
for (Vertex *vertex : *graph_->regClkVertices())
|
for (Vertex *vertex : *graph_->regClkVertices())
|
||||||
iter.enqueue(vertex);
|
iter.enqueue(vertex);
|
||||||
|
|
||||||
// Enqueue PLL feedback pins.
|
|
||||||
VertexIterator vertex_iter(graph_);
|
|
||||||
while (vertex_iter.hasNext()) {
|
|
||||||
Vertex *vertex = vertex_iter.next();
|
|
||||||
Pin *pin = vertex->pin();
|
|
||||||
const LibertyPort *port = network_->libertyPort(pin);
|
|
||||||
if (port && port->isPllFeedbackPin())
|
|
||||||
iter.enqueue(vertex);
|
|
||||||
}
|
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
Vertex *vertex = iter.next();
|
Vertex *vertex = iter.next();
|
||||||
vertex->setHasDownstreamClkPin(true);
|
vertex->setHasDownstreamClkPin(true);
|
||||||
|
|
|
||||||
|
|
@ -1096,8 +1096,6 @@ Sta::makeGeneratedClock(const char *name,
|
||||||
bool add_to_pins,
|
bool add_to_pins,
|
||||||
Pin *src_pin,
|
Pin *src_pin,
|
||||||
Clock *master_clk,
|
Clock *master_clk,
|
||||||
Pin *pll_out,
|
|
||||||
Pin *pll_fdbk,
|
|
||||||
int divide_by,
|
int divide_by,
|
||||||
int multiply_by,
|
int multiply_by,
|
||||||
float duty_cycle,
|
float duty_cycle,
|
||||||
|
|
@ -1109,7 +1107,6 @@ Sta::makeGeneratedClock(const char *name,
|
||||||
{
|
{
|
||||||
sdc_->makeGeneratedClock(name, pins, add_to_pins,
|
sdc_->makeGeneratedClock(name, pins, add_to_pins,
|
||||||
src_pin, master_clk,
|
src_pin, master_clk,
|
||||||
pll_out, pll_fdbk,
|
|
||||||
divide_by, multiply_by, duty_cycle,
|
divide_by, multiply_by, duty_cycle,
|
||||||
invert, combinational,
|
invert, combinational,
|
||||||
edges, edge_shifts, comment);
|
edges, edge_shifts, comment);
|
||||||
|
|
|
||||||
34
tcl/Sdc.tcl
34
tcl/Sdc.tcl
|
|
@ -445,6 +445,13 @@ proc all_registers { args } {
|
||||||
set edge_triggered 1
|
set edge_triggered 1
|
||||||
set level_sensitive 1
|
set level_sensitive 1
|
||||||
}
|
}
|
||||||
|
if { [expr [info exists flags(-cells)] \
|
||||||
|
+ [info exists flags(-data_pins)] \
|
||||||
|
+ [info exists flags(-clock_pins)] \
|
||||||
|
+ [info exists flags(-async_pins)] \
|
||||||
|
+ [info exists flags(-output_pins)]] > 1 } {
|
||||||
|
sta_error 807 "only one of -cells, -data_pins, -clock_pins, -async_pins, -output_pins are suppported."
|
||||||
|
}
|
||||||
if [info exists flags(-cells)] {
|
if [info exists flags(-cells)] {
|
||||||
return [find_register_instances $clks $clk_rf \
|
return [find_register_instances $clks $clk_rf \
|
||||||
$edge_triggered $level_sensitive]
|
$edge_triggered $level_sensitive]
|
||||||
|
|
@ -1139,13 +1146,12 @@ define_cmd_args "create_generated_clock" \
|
||||||
[-divide_by divisor | -multiply_by multiplier]\
|
[-divide_by divisor | -multiply_by multiplier]\
|
||||||
[-duty_cycle duty_cycle] [-invert] [-edges edge_list]\
|
[-duty_cycle duty_cycle] [-invert] [-edges edge_list]\
|
||||||
[-edge_shift edge_shift_list] [-combinational] [-add]\
|
[-edge_shift edge_shift_list] [-combinational] [-add]\
|
||||||
[-pll_output pll_out_pin] [-pll_feedback pll_fdbk_pin]\
|
|
||||||
[-comment comment] port_pin_list}
|
[-comment comment] port_pin_list}
|
||||||
|
|
||||||
proc create_generated_clock { args } {
|
proc create_generated_clock { args } {
|
||||||
parse_key_args "create_generated_clock" args keys \
|
parse_key_args "create_generated_clock" args keys \
|
||||||
{-name -source -master_clock -divide_by -multiply_by \
|
{-name -source -master_clock -divide_by -multiply_by \
|
||||||
-duty_cycle -edges -edge_shift -pll_output -pll_feedback -comment} \
|
-duty_cycle -edges -edge_shift -comment} \
|
||||||
flags {-invert -combinational -add}
|
flags {-invert -combinational -add}
|
||||||
|
|
||||||
check_argc_eq1 "create_generated_clock" $args
|
check_argc_eq1 "create_generated_clock" $args
|
||||||
|
|
@ -1187,8 +1193,6 @@ proc create_generated_clock { args } {
|
||||||
set duty_cycle 0
|
set duty_cycle 0
|
||||||
set edges {}
|
set edges {}
|
||||||
set edge_shifts {}
|
set edge_shifts {}
|
||||||
set pll_out "NULL"
|
|
||||||
set pll_feedback "NULL"
|
|
||||||
|
|
||||||
set combinational [info exists flags(-combinational)]
|
set combinational [info exists flags(-combinational)]
|
||||||
|
|
||||||
|
|
@ -1264,31 +1268,9 @@ proc create_generated_clock { args } {
|
||||||
sta_error 539 "-duty_cycle requires -multiply_by value."
|
sta_error 539 "-duty_cycle requires -multiply_by value."
|
||||||
}
|
}
|
||||||
|
|
||||||
if { [info exists keys(-pll_feedback)] || [info exists keys(-pll_output)] } {
|
|
||||||
if {![info exists keys(-pll_output)] } {
|
|
||||||
sta_error 540 "missing -pll_output argument."
|
|
||||||
}
|
|
||||||
if { ![info exists keys(-pll_feedback)] } {
|
|
||||||
sta_error 541 "missing -pll_feedback argument."
|
|
||||||
}
|
|
||||||
set pll_feedback [get_pin_error "-pll_feedback" $keys(-pll_feedback)]
|
|
||||||
set pll_out [get_pin_error "-pll_output" $keys(-pll_output)]
|
|
||||||
set pll_inst [$pll_out instance]
|
|
||||||
if { [$pll_feedback instance] != $pll_inst } {
|
|
||||||
sta_error 542 "PLL output and feedback pins must be on the same instance."
|
|
||||||
}
|
|
||||||
if { [$source_pin instance] != $pll_inst } {
|
|
||||||
sta_error 543 "source pin must be on the same instance as the PLL output pin."
|
|
||||||
}
|
|
||||||
if { [lsearch $pins $pll_out] == -1 } {
|
|
||||||
sta_error 544 "PLL output must be one of the clock pins."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
set comment [parse_comment_key keys]
|
set comment [parse_comment_key keys]
|
||||||
|
|
||||||
make_generated_clock $name $pins $add $source_pin $master_clk \
|
make_generated_clock $name $pins $add $source_pin $master_clk \
|
||||||
$pll_out $pll_feedback \
|
|
||||||
$divide_by $multiply_by $duty_cycle $invert $combinational \
|
$divide_by $multiply_by $duty_cycle $invert $combinational \
|
||||||
$edges $edge_shifts $comment
|
$edges $edge_shifts $comment
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2990,8 +2990,6 @@ make_generated_clock(const char *name,
|
||||||
bool add_to_pins,
|
bool add_to_pins,
|
||||||
Pin *src_pin,
|
Pin *src_pin,
|
||||||
Clock *master_clk,
|
Clock *master_clk,
|
||||||
Pin *pll_out,
|
|
||||||
Pin *pll_fdbk,
|
|
||||||
int divide_by,
|
int divide_by,
|
||||||
int multiply_by,
|
int multiply_by,
|
||||||
float duty_cycle,
|
float duty_cycle,
|
||||||
|
|
@ -3003,7 +3001,7 @@ make_generated_clock(const char *name,
|
||||||
{
|
{
|
||||||
cmdLinkedNetwork();
|
cmdLinkedNetwork();
|
||||||
Sta::sta()->makeGeneratedClock(name, pins, add_to_pins,
|
Sta::sta()->makeGeneratedClock(name, pins, add_to_pins,
|
||||||
src_pin, master_clk, pll_out, pll_fdbk,
|
src_pin, master_clk,
|
||||||
divide_by, multiply_by, duty_cycle, invert,
|
divide_by, multiply_by, duty_cycle, invert,
|
||||||
combinational, edges, edge_shifts,
|
combinational, edges, edge_shifts,
|
||||||
comment);
|
comment);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue