diff --git a/doc/OpenSTA.odt b/doc/OpenSTA.odt index 73934c94..29e9538a 100644 Binary files a/doc/OpenSTA.odt and b/doc/OpenSTA.odt differ diff --git a/doc/OpenSTA.pdf b/doc/OpenSTA.pdf index 452dd9f9..24beb4e9 100644 Binary files a/doc/OpenSTA.pdf and b/doc/OpenSTA.pdf differ diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index 254d9ef8..3c66a73d 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -1113,7 +1113,6 @@ public: Instance *instance, const Corner *corner, const MinMaxAll *min_max, - bool increment, bool pin_cap_included, bool keep_coupling_caps, float coupling_cap_factor, diff --git a/messages.txt b/messages.txt index a6edcdbe..d4424f32 100644 --- a/messages.txt +++ b/messages.txt @@ -1,19 +1,20 @@ +Warning: 705 duplicated 0001 DmpCeff.cc:1597 cell %s delay model not supported on SPF parasitics by DMP delay calculator 0002 Liberty.cc:748 cell %s/%s port %s not found in cell %s/%s. 0003 Liberty.cc:774 cell %s/%s %s -> %s timing group %s not found in cell %s/%s. -0004 Liberty.cc:1638 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with %s -> %s setup_%s check. -0005 Liberty.cc:1652 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function positive sense. -0006 Liberty.cc:1660 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative sense. +0004 Liberty.cc:1680 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with %s -> %s setup_%s check. +0005 Liberty.cc:1694 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function positive sense. +0006 Liberty.cc:1702 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative sense. 0007 LibertyExpr.cc:78 %s references unknown port %s. -0008 ConcreteNetwork.cc:1855 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. 0010 Genclks.cc:287 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: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. 0016 LibertyReader.cc:996 default_max_fanout is 0.0. -0017 Sta.cc:2083 '%s' is not a valid endpoint. -0018 Sta.cc:2007 '%s' is not a valid start point. +0017 Sta.cc:2094 '%s' is not a valid endpoint. +0018 Sta.cc:2018 '%s' is not a valid start point. 0021 SpefParse.yy:805 %d is not positive. 0022 SpefParse.yy:814 %.4f is not positive. 0023 SpefParse.yy:820 %.4f is not positive. @@ -161,7 +162,7 @@ 0166 LibertyReader.cc:2290 timing group from output port. 0167 LibertyReader.cc:2308 timing group from output port. 0168 LibertyReader.cc:2323 timing group from output port. -0179 SpefReader.cc:728 %s. +0179 SpefReader.cc:725 %s. 0190 VerilogReader.cc:1728 %s is not a verilog module. 0191 VerilogReader.cc:1733 %s is not a verilog module. 0201 StaTcl.i:129 no network has been linked. @@ -192,10 +193,10 @@ 0261 Search.cc:2869 max tag index exceeded 0262 Search.cc:3561 unexpected filter path 0263 Search.cc:3729 tns incr existing vertex -0264 Sta.cc:4132 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 -0266 Sta.cc:2080 '%s' is not a valid endpoint. -0267 Sta.cc:2004 '%s' is not a valid start point. +0266 Sta.cc:2091 '%s' is not a valid endpoint. +0267 Sta.cc:2015 '%s' is not a valid start point. 0272 StaTcl.i:4168 unknown common clk pessimism mode. 0273 StaTcl.i:5187 unknown clock sense 0300 Util.tcl:218 no commands match '$pattern'. @@ -294,8 +295,8 @@ 0428 Sta.tcl:861 set_assigned_transition transition is not a float. 0430 Sdf.tcl:46 -cond_use min_max cannot be used with analysis type single. 0432 Sdf.tcl:157 SDF -divider must be / or . -0433 Parasitics.tcl:47 path instance '$path' not found. -0434 Parasitics.tcl:65 -reduce_to must be pi_elmore or pi_pole_residue2. +0433 Parasitics.tcl:45 path instance '$path' not found. +0434 Parasitics.tcl:62 -reduce_to must be pi_elmore or pi_pole_residue2. 0435 DelayCalc.tcl:119 delay calculator $alg not found. 0436 Variables.tcl:45 sta_report_default_digits must be a positive integer. 0437 Variables.tcl:70 sta_crpr_mode must be pin or transition. @@ -485,3 +486,5 @@ 0702 LibertyWriter.cc:436 3 axis table models not supported. 0703 LibertyWriter.cc:576 %s/%s/%s timing arc type %s not supported. 0704 LibertyWriter.cc:289 %s/%s bundled ports not supported. +0705 LumpedCapDelayCalc.cc:168 gate delay input variable is NaN +0705 Liberty.cc:793 Liberty cell %s/%s for corner %s/%s not found diff --git a/parasitics/Parasitics.i b/parasitics/Parasitics.i index 6d178a06..2f923f86 100644 --- a/parasitics/Parasitics.i +++ b/parasitics/Parasitics.i @@ -38,7 +38,6 @@ read_spef_cmd(const char *filename, Instance *instance, const Corner *corner, const MinMaxAll *min_max, - bool increment, bool pin_cap_included, bool keep_coupling_caps, float coupling_cap_factor, @@ -48,9 +47,9 @@ read_spef_cmd(const char *filename, { cmdLinkedNetwork(); return Sta::sta()->readSpef(filename, instance, corner, min_max, - increment, pin_cap_included, - keep_coupling_caps, coupling_cap_factor, - reduce_to, delete_after_reduce, quiet); + pin_cap_included, keep_coupling_caps, + coupling_cap_factor, reduce_to, + delete_after_reduce, quiet); } void diff --git a/parasitics/Parasitics.tcl b/parasitics/Parasitics.tcl index b316d578..0022f371 100644 --- a/parasitics/Parasitics.tcl +++ b/parasitics/Parasitics.tcl @@ -21,7 +21,6 @@ define_cmd_args "read_spef" \ [-min]\ [-max]\ [-path path]\ - [-increment]\ [-pin_cap_included]\ [-keep_capacitive_coupling]\ [-coupling_reduction_factor factor]\ @@ -34,8 +33,7 @@ define_cmd_args "read_spef" \ proc_redirect read_spef { parse_key_args "read_spef" args \ keys {-path -coupling_reduction_factor -reduce_to -corner} \ - flags {-min -max -increment -pin_cap_included \ - -keep_capacitive_coupling \ + flags {-min -max -increment -pin_cap_included -keep_capacitive_coupling \ -delete_after_reduce -quiet -save} check_argc_eq1 "report_spef" $args @@ -49,7 +47,6 @@ proc_redirect read_spef { } set corner [parse_corner_or_all keys] set min_max [parse_min_max_all_flags flags] - set increment [info exists flags(-increment)] set coupling_reduction_factor 1.0 if [info exists keys(-coupling_reduction_factor)] { set coupling_reduction_factor $keys(-coupling_reduction_factor) @@ -69,7 +66,10 @@ proc_redirect read_spef { set quiet [info exists flags(-quiet)] set save [info exists flags(-save)] set filename [file nativename [lindex $args 0]] - return [read_spef_cmd $filename $instance $corner $min_max $increment \ + if { [info exists flags(-increment)] } { + sta_warn 706 "read_spef -increment is deprecated." + } + return [read_spef_cmd $filename $instance $corner $min_max \ $pin_cap_included $keep_coupling_caps $coupling_reduction_factor \ $reduce_to $delete_after_reduce $quiet] } diff --git a/parasitics/SpefReader.cc b/parasitics/SpefReader.cc index 7143f0cf..688a5054 100644 --- a/parasitics/SpefReader.cc +++ b/parasitics/SpefReader.cc @@ -45,7 +45,6 @@ bool readSpefFile(const char *filename, Instance *instance, ParasiticAnalysisPt *ap, - bool increment, bool pin_cap_included, bool keep_coupling_caps, float coupling_cap_factor, @@ -63,7 +62,7 @@ readSpefFile(const char *filename, // Use zlib to uncompress gzip'd files automagically. gzFile stream = gzopen(filename, "rb"); if (stream) { - SpefReader reader(filename, stream, instance, ap, increment, + SpefReader reader(filename, stream, instance, ap, pin_cap_included, keep_coupling_caps, coupling_cap_factor, reduce_to, delete_after_reduce, op_cond, corner, cnst_min_max, quiet, report, network, parasitics); @@ -83,7 +82,6 @@ SpefReader::SpefReader(const char *filename, gzFile stream, Instance *instance, ParasiticAnalysisPt *ap, - bool increment, bool pin_cap_included, bool keep_coupling_caps, float coupling_cap_factor, @@ -99,7 +97,6 @@ SpefReader::SpefReader(const char *filename, filename_(filename), instance_(instance), ap_(ap), - increment_(increment), pin_cap_included_(pin_cap_included), keep_coupling_caps_(keep_coupling_caps), reduce_to_(reduce_to), @@ -391,7 +388,7 @@ void SpefReader::rspfBegin(Net *net, SpefTriple *total_cap) { - if (net && !increment_) + if (net) parasitics_->deleteParasitics(net, ap_); // Net total capacitance is ignored. delete total_cap; @@ -407,19 +404,15 @@ SpefReader::rspfDrvrBegin(Pin *drvr_pin, SpefRspfPi *pi) { if (drvr_pin) { - // Incremental parasitics do not overwrite existing parasitics. - if (!(increment_ && - parasitics_->findPiElmore(drvr_pin, RiseFall::rise(), ap_))) { - float c2 = pi->c2()->value(triple_index_) * cap_scale_; - float rpi = pi->r1()->value(triple_index_) * res_scale_; - float c1 = pi->c1()->value(triple_index_) * cap_scale_; - // Delete pi model and elmore delays. - parasitics_->deleteParasitics(drvr_pin, ap_); - // Only one parasitic, save it under rise transition. - parasitic_ = parasitics_->makePiElmore(drvr_pin, - RiseFall::rise(), - ap_, c2, rpi, c1); - } + float c2 = pi->c2()->value(triple_index_) * cap_scale_; + float rpi = pi->r1()->value(triple_index_) * res_scale_; + float c1 = pi->c1()->value(triple_index_) * cap_scale_; + // Delete pi model and elmore delays. + parasitics_->deleteParasitics(drvr_pin, ap_); + // Only one parasitic, save it under rise transition. + parasitic_ = parasitics_->makePiElmore(drvr_pin, + RiseFall::rise(), + ap_, c2, rpi, c1); } delete pi; } @@ -447,8 +440,12 @@ SpefReader::dspfBegin(Net *net, SpefTriple *total_cap) { if (net) { - Net *parasitic_owner = net; - if (!network_->isTopInstance(instance_)) { + if (network_->isTopInstance(instance_)) { + parasitics_->deleteReducedParasitics(net, ap_); + parasitic_ = parasitics_->makeParasiticNetwork(net, pin_cap_included_, ap_); + } + else { + Net *parasitic_owner = net; NetTermIterator *term_iter = network_->termIterator(net); if (term_iter->hasNext()) { Term *term = term_iter->next(); @@ -456,19 +453,11 @@ SpefReader::dspfBegin(Net *net, parasitic_owner = network_->net(hpin); } delete term_iter; - } - // Incremental parasitics do not overwrite existing parasitics. - if (increment_) { parasitic_ = parasitics_->findParasiticNetwork(parasitic_owner, ap_); - if( parasitic_ == nullptr) + if (parasitic_ == nullptr) parasitic_ = parasitics_->makeParasiticNetwork(parasitic_owner, pin_cap_included_, ap_); } - else { - parasitics_->deleteReducedParasitics(parasitic_owner, ap_); - parasitic_ = parasitics_->makeParasiticNetwork(parasitic_owner, - pin_cap_included_, ap_); - } net_ = net; } else { diff --git a/parasitics/SpefReader.hh b/parasitics/SpefReader.hh index 06d37b61..e3191382 100644 --- a/parasitics/SpefReader.hh +++ b/parasitics/SpefReader.hh @@ -39,7 +39,6 @@ bool readSpefFile(const char *filename, Instance *instance, ParasiticAnalysisPt *ap, - bool increment, bool pin_cap_included, bool keep_coupling_caps, float coupling_cap_factor, diff --git a/parasitics/SpefReaderPvt.hh b/parasitics/SpefReaderPvt.hh index 66697db7..81c34103 100644 --- a/parasitics/SpefReaderPvt.hh +++ b/parasitics/SpefReaderPvt.hh @@ -49,7 +49,6 @@ public: gzFile stream, Instance *instance, ParasiticAnalysisPt *ap, - bool increment, bool pin_cap_included, bool keep_coupling_caps, float coupling_cap_factor, @@ -143,7 +142,6 @@ private: const char *filename_; Instance *instance_; const ParasiticAnalysisPt *ap_; - bool increment_; bool pin_cap_included_; bool keep_coupling_caps_; ReducedParasiticType reduce_to_; diff --git a/search/Sta.cc b/search/Sta.cc index 96d6f83c..f8ed0584 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -3827,7 +3827,6 @@ Sta::readSpef(const char *filename, Instance *instance, const Corner *corner, const MinMaxAll *min_max, - bool increment, bool pin_cap_included, bool keep_coupling_caps, float coupling_cap_factor, @@ -3845,9 +3844,9 @@ Sta::readSpef(const char *filename, ParasiticAnalysisPt *ap = corner->findParasiticAnalysisPt(cnst_min_max); const OperatingConditions *op_cond = sdc_->operatingConditions(cnst_min_max); - bool success = readSpefFile(filename, instance, ap, increment, - pin_cap_included, - keep_coupling_caps, coupling_cap_factor, + bool success = readSpefFile(filename, instance, ap, + pin_cap_included, keep_coupling_caps, + coupling_cap_factor, reduce_to, delete_after_reduce, op_cond, corner, cnst_min_max, quiet, report_, network_, parasitics_);