diff --git a/README.md b/README.md index 1af697b9..2edc943a 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ https://github.com/parallaxsw/OpenSTA.git. Any forks from this code base have not passed extensive regression testing which is not publicly available. -## Build +## Build from source OpenSTA is built with CMake. @@ -187,6 +187,25 @@ If you make changes to `CMakeLists.txt` you may need to clean out existing CMake cached variable values by deleting all of the files in the build directory. +## Build with Docker + +An alternative way to build and run OpenSTA is with +[Docker](https://www.docker.com). After installing Docker, the +following command builds a Docker image. + +``` +cd OpenSTA +docker build --file Dockerfile.ubuntu_22.04 --tag OpenSTA . +``` + +To run a docker container using the OpenSTA image, use the -v option +to docker to mount direcories with data to use and -i to run +interactively. + +``` +docker run -i -v $HOME:/data OpenSTA +``` + ## Bug Reports Use the Issues tab on the github repository to report bugs. diff --git a/doc/messages.txt b/doc/messages.txt index 51a22fdf..97d1a06a 100644 --- a/doc/messages.txt +++ b/doc/messages.txt @@ -1,47 +1,33 @@ -Warning: 0000 duplicated -Warning: 0000 duplicated -Warning: 0000 duplicated -Warning: 0000 duplicated -Warning: 0000 duplicated -Warning: 0000 duplicated -Warning: 304 duplicated -0000 LibertyReader.cc:2151 statetable input port %s not found. -0000 LibertyReader.cc:4008 table row must have 3 groups separated by ':'. -0000 LibertyReader.cc:4013 table row has %zu input values but %zu are required. -0000 LibertyReader.cc:4020 table row has %zu current values but %zu are required. -0000 LibertyReader.cc:4027 table row has %zu next values but %zu are required. -0000 LibertyReader.cc:4073 table input value '%s' not recognized. -0000 LibertyReader.cc:4092 table internal value '%s' not recognized. 0100 CmdArgs.tcl:108 unsupported object type $object_type. -0101 CmdArgs.tcl:166 object '$obj' not found. -0102 CmdArgs.tcl:414 $corner_arg is not the name of process corner. -0103 CmdArgs.tcl:420 -corner keyword required with multi-corner analysis. -0104 CmdArgs.tcl:434 $corner_name is not the name of process corner. -0105 CmdArgs.tcl:439 missing -corner arg. -0106 CmdArgs.tcl:450 $corner_name is not the name of process corner. -0107 CmdArgs.tcl:467 $corner_name is not the name of process corner. -0108 CmdArgs.tcl:502 both -min and -max specified. -0109 CmdArgs.tcl:516 both -min and -max specified. -0110 CmdArgs.tcl:543 only one of -early and -late can be specified. -0111 CmdArgs.tcl:549 -early or -late must be specified. -0112 CmdArgs.tcl:556 both -early and -late specified. -0113 CmdArgs.tcl:571 $arg_name must be a single library. -0114 CmdArgs.tcl:577 $arg_name type '$object_type' is not a library. -0115 CmdArgs.tcl:582 library '$arg' not found. -0116 CmdArgs.tcl:599 $arg_name must be a single lib cell. -0123 CmdArgs.tcl:686 $arg_name must be a single instance. -0124 CmdArgs.tcl:692 $arg_name type '$object_type' is not an instance. -0125 CmdArgs.tcl:697 instance '$arg' not found. -0126 CmdArgs.tcl:716 $arg_name type '$object_type' is not an instance. -0127 CmdArgs.tcl:723 instance '$arg' not found. -0131 CmdArgs.tcl:784 $arg_name type '$object_type' is not a pin or port. -0132 CmdArgs.tcl:791 pin '$arg' not found. -0133 CmdArgs.tcl:811 $arg_name type '$object_type' is not a port. -0139 CmdArgs.tcl:892 unsupported object type $object_type. -0141 CmdArgs.tcl:913 $arg_name '$object_type' is not a net. -0142 CmdArgs.tcl:937 unsupported object type $object_type. -0143 CmdArgs.tcl:918 $arg_name '$arg' not found. -0144 CmdArgs.tcl:409 corner object type '$object_type' is not a corner. +0101 CmdArgs.tcl:165 object '$obj' not found. +0102 CmdArgs.tcl:413 $corner_arg is not the name of process corner. +0103 CmdArgs.tcl:419 -corner keyword required with multi-corner analysis. +0104 CmdArgs.tcl:433 $corner_name is not the name of process corner. +0105 CmdArgs.tcl:438 missing -corner arg. +0106 CmdArgs.tcl:449 $corner_name is not the name of process corner. +0107 CmdArgs.tcl:466 $corner_name is not the name of process corner. +0108 CmdArgs.tcl:501 both -min and -max specified. +0109 CmdArgs.tcl:515 both -min and -max specified. +0110 CmdArgs.tcl:542 only one of -early and -late can be specified. +0111 CmdArgs.tcl:548 -early or -late must be specified. +0112 CmdArgs.tcl:555 both -early and -late specified. +0113 CmdArgs.tcl:570 $arg_name must be a single library. +0114 CmdArgs.tcl:576 $arg_name type '$object_type' is not a library. +0115 CmdArgs.tcl:581 library '$arg' not found. +0116 CmdArgs.tcl:598 $arg_name must be a single lib cell. +0123 CmdArgs.tcl:685 $arg_name must be a single instance. +0124 CmdArgs.tcl:691 $arg_name type '$object_type' is not an instance. +0125 CmdArgs.tcl:696 instance '$arg' not found. +0126 CmdArgs.tcl:715 $arg_name type '$object_type' is not an instance. +0127 CmdArgs.tcl:722 instance '$arg' not found. +0131 CmdArgs.tcl:783 $arg_name type '$object_type' is not a pin or port. +0132 CmdArgs.tcl:790 pin '$arg' not found. +0133 CmdArgs.tcl:810 $arg_name type '$object_type' is not a port. +0139 CmdArgs.tcl:891 unsupported object type $object_type. +0141 CmdArgs.tcl:912 $arg_name '$object_type' is not a net. +0142 CmdArgs.tcl:936 unsupported object type $object_type. +0143 CmdArgs.tcl:917 $arg_name '$arg' not found. +0144 CmdArgs.tcl:408 corner object type '$object_type' is not a corner. 0160 CmdUtil.tcl:44 no commands match '$pattern'. 0161 CmdUtil.tcl:89 Usage: $cmd $cmd_args($cmd) 0162 CmdUtil.tcl:91 Usage: $cmd argument error @@ -94,18 +80,18 @@ Warning: 304 duplicated 0253 NetworkEdit.tcl:192 unsupported object type $object_type. 0266 VertexVisitor.cc:32 VertexPinCollector::copy not supported. 0267 WriteSpice.cc:1217 out of memory -0268 VerilogWriter.cc:223 unknown port direction +0268 VerilogWriter.cc:258 unknown port direction 0272 Parasitics.tcl:41 read_spef -quiet is deprecated. 0273 Parasitics.tcl:45 read_spef -reduce_to is deprecated. Use -reduce instead. 0274 Parasitics.tcl:50 read_spef -delete_after_reduce is deprecated. 0275 Parasitics.tcl:54 read_spef -save is deprecated. 0276 Parasitics.tcl:62 path instance '$path' not found. -0280 PathEnum.cc:570 diversion path not found +0280 PathEnum.cc:572 diversion path not found 0301 Power.tcl:234 activity should be 0.0 to 1.0 or 2.0 0302 Power.tcl:242 duty should be 0.0 to 1.0 0303 Power.tcl:257 activity cannot be set on clock ports. 0304 Power.tcl:40 No liberty libraries have been read. -0304 Power.tcl:286 read_power_activities is deprecated. Use read_vcd. +0305 Power.tcl:286 read_power_activities is deprecated. Use read_vcd. 0320 Property.tcl:32 $cmd object is null. 0321 Property.tcl:37 $cmd $type_key must be specified with object name argument. 0322 Property.tcl:77 get_property unsupported object type $object_type. @@ -120,7 +106,7 @@ Warning: 304 duplicated 0331 Sdc.tcl:856 object '$pattern' is not a net. 0332 Sdc.tcl:936 object '$pattern' is not a pin. 0333 Sdc.tcl:993 object '$pattern' is not a port. -0334 Sdc.tcl:2848 object '$pattern' is not a liberty cell. +0334 Sdc.tcl:2848 object '$cell_name' is not a liberty cell. 0340 Sdc.tcl:73 cannot open '$filename'. 0341 Sdc.tcl:128 incomplete command at end of file. 0342 Sdc.tcl:212 hierarchy separator must be one of '$sdc_dividers'. @@ -275,8 +261,8 @@ Warning: 304 duplicated 0522 Search.tcl:791 -min and -max cannot both be specified. 0523 Search.tcl:811 pin '$pin_arg' is hierarchical. 0524 Search.tcl:867 -format $format not recognized. -0526 Search.tcl:1013 specify one of -setup and -hold. -0527 Search.tcl:1063 unknown path group '$name'. +0526 Search.tcl:1015 specify one of -setup and -hold. +0527 Search.tcl:1065 unknown path group '$name'. 0540 Sta.tcl:158 -from/-to arguments not supported with -of_objects. 0560 Util.tcl:44 $cmd $key missing value. 0561 Util.tcl:61 $cmd $key missing value. @@ -317,184 +303,190 @@ Warning: 304 duplicated 1110 Liberty.cc:763 cell %s/%s port %s not found in cell %s/%s. 1111 Liberty.cc:789 cell %s/%s %s -> %s timing group %s not found in cell %s/%s. 1112 Liberty.cc:808 Liberty cell %s/%s for corner %s/%s not found. -1113 Liberty.cc:1822 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with %s -> %s setup_%s check. -1114 Liberty.cc:1763 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function positive sense. -1115 Liberty.cc:1771 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative sense. +1113 Liberty.cc:1824 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with %s -> %s setup_%s check. +1114 Liberty.cc:1765 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function positive sense. +1115 Liberty.cc:1773 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative sense. 1116 Liberty.cc:362 unsupported slew degradation table axes 1117 Liberty.cc:378 unsupported slew degradation table axes 1118 Liberty.cc:383 unsupported slew degradation table order 1119 Liberty.cc:413 unsupported slew degradation table axes -1120 Liberty.cc:1977 library missing vdd -1121 Liberty.cc:1389 timing arc count mismatch +1120 Liberty.cc:1979 library missing vdd +1121 Liberty.cc:1391 timing arc count mismatch 1125 LibertyParser.cc:310 valueIterator called for LibertySimpleAttribute 1126 LibertyParser.cc:390 LibertyStringAttrValue called for float value 1127 LibertyParser.cc:420 LibertyStringAttrValue called for float value 1130 LibertyExpr.cc:82 %s references unknown port %s. 1131 LibertyExpr.cc:175 %s %s. -1140 LibertyReader.cc:617 library %s already exists. -1141 LibertyReader.cc:651 library missing name. -1142 LibertyReader.cc:677 default_wire_load %s not found. -1143 LibertyReader.cc:688 default_wire_selection %s not found. -1144 LibertyReader.cc:700 default_operating_condition %s not found. -1145 LibertyReader.cc:710 input_threshold_pct_%s not found. -1146 LibertyReader.cc:714 output_threshold_pct_%s not found. -1147 LibertyReader.cc:718 slew_lower_threshold_pct_%s not found. -1148 LibertyReader.cc:722 slew_upper_threshold_pct_%s not found. -1149 LibertyReader.cc:727 Library %s is missing one or more thresholds. -1150 LibertyReader.cc:806 unknown unit multiplier %s. -1151 LibertyReader.cc:829 unknown unit scale %c. -1152 LibertyReader.cc:832 unknown unit suffix %s. -1153 LibertyReader.cc:835 unknown unit suffix %s. -1154 LibertyReader.cc:860 capacitive_load_units are not ff or pf. -1155 LibertyReader.cc:863 capacitive_load_units are not a string. -1156 LibertyReader.cc:866 capacitive_load_units missing suffix. -1157 LibertyReader.cc:869 capacitive_load_units scale is not a float. -1158 LibertyReader.cc:872 capacitive_load_units missing scale and suffix. -1159 LibertyReader.cc:875 capacitive_load_unit missing values suffix. -1160 LibertyReader.cc:893 delay_model %s not supported. -1161 LibertyReader.cc:897 delay_model %s not supported. -1162 LibertyReader.cc:901 delay_model %s not supported. -1163 LibertyReader.cc:906 delay_model %s not supported. -. -1164 LibertyReader.cc:909 unknown delay_model %s -. -1165 LibertyReader.cc:928 unknown bus_naming_style format. -1166 LibertyReader.cc:949 voltage_map voltage is not a float. -1167 LibertyReader.cc:952 voltage_map missing voltage. -1168 LibertyReader.cc:955 voltage_map supply name is not a string. -1169 LibertyReader.cc:958 voltage_map missing supply name and voltage. -1170 LibertyReader.cc:961 voltage_map missing values suffix. -1171 LibertyReader.cc:1046 default_max_transition is 0.0. -1172 LibertyReader.cc:1061 default_max_fanout is 0.0. -1173 LibertyReader.cc:1151 default_fanout_load is 0.0. -1174 LibertyReader.cc:1179 default_wire_load_mode %s not found. -1175 LibertyReader.cc:1350 table template missing name. -1176 LibertyReader.cc:1395 missing variable_%d attribute. -1177 LibertyReader.cc:1471 missing table index values. -1178 LibertyReader.cc:1477 non-increasing table index values. -1179 LibertyReader.cc:1509 bus type %s missing bit_from. -1180 LibertyReader.cc:1511 bus type %s missing bit_to. -1181 LibertyReader.cc:1515 type missing name. -1182 LibertyReader.cc:1542 scaling_factors do not have a name. -1183 LibertyReader.cc:1711 operating_conditions missing name. -1184 LibertyReader.cc:1782 wire_load missing name. -1185 LibertyReader.cc:1825 fanout_length is missing length and fanout. -1186 LibertyReader.cc:1840 wire_load_selection missing name. -1187 LibertyReader.cc:1871 wireload %s not found. -1189 LibertyReader.cc:1878 wire_load_from_area min not a float. -1190 LibertyReader.cc:1881 wire_load_from_area max not a float. -1191 LibertyReader.cc:1884 wire_load_from_area missing parameters. -1192 LibertyReader.cc:1887 wire_load_from_area missing parameters. -1193 LibertyReader.cc:1906 cell missing name. -1194 LibertyReader.cc:1930 cell %s ocv_derate_group %s not found. -1195 LibertyReader.cc:1963 port %s function size does not match port size. -1196 LibertyReader.cc:2060 %s %s bus width mismatch. -1197 LibertyReader.cc:2071 %s %s bus width mismatch. -1198 LibertyReader.cc:2081 clear -1199 LibertyReader.cc:2091 preset -1200 LibertyReader.cc:2127 latch enable function is non-unate for port %s. -1201 LibertyReader.cc:2132 latch enable function is unknown for port %s. -1202 LibertyReader.cc:2233 operating conditions %s not found. -1203 LibertyReader.cc:2236 scaled_cell missing operating condition. -1204 LibertyReader.cc:2239 scaled_cell cell %s has not been defined. -1205 LibertyReader.cc:2242 scaled_cell missing name. -1206 LibertyReader.cc:2268 scaled_cell %s, %s port functions do not match cell port functions. -1207 LibertyReader.cc:2273 scaled_cell ports do not match cell ports. -1208 LibertyReader.cc:2275 scaled_cell %s, %s timing does not match cell timing. -1209 LibertyReader.cc:2294 combinational timing to an input port. -1210 LibertyReader.cc:2389 missing %s_transition. -1211 LibertyReader.cc:2391 missing cell_%s. -1212 LibertyReader.cc:2412 timing group from output port. -1213 LibertyReader.cc:2422 timing group from output port. -1214 LibertyReader.cc:2432 timing group from output port. -1215 LibertyReader.cc:2467 timing group from output port. -1217 LibertyReader.cc:2477 timing group from output port. -1218 LibertyReader.cc:2578 receiver_capacitance group not in timing or pin group. -1219 LibertyReader.cc:2596 unsupported model axis. -1220 LibertyReader.cc:2624 output_current_%s group not in timing group. -1221 LibertyReader.cc:2666 output current waveform %.2e %.2e not found. -1222 LibertyReader.cc:2687 unsupported model axis. -1223 LibertyReader.cc:2729 vector index_1 and index_2 must have exactly one value. -1224 LibertyReader.cc:2731 vector reference_time not found. -1225 LibertyReader.cc:2764 normalized_driver_waveform variable_2 must be normalized_voltage -1226 LibertyReader.cc:2767 normalized_driver_waveform variable_1 must be input_net_transition -1228 LibertyReader.cc:2989 level_shifter_type must be HL, LH, or HL_LH -1229 LibertyReader.cc:3025 switch_cell_type must be coarse_grain or fine_grain -1230 LibertyReader.cc:3049 scaling_factors %s not found. -1231 LibertyReader.cc:3100 pin name is not a string. -1232 LibertyReader.cc:3117 pin name is not a string. -1233 LibertyReader.cc:3131 pin name is not a string. -1234 LibertyReader.cc:3209 bus %s bus_type not found. -1235 LibertyReader.cc:3261 bus_type %s not found. -1236 LibertyReader.cc:3264 bus_type is not a string. -1237 LibertyReader.cc:3282 bundle %s member not found. -1238 LibertyReader.cc:3305 member is not a string. -1239 LibertyReader.cc:3312 members attribute is missing values. -1240 LibertyReader.cc:3363 unknown port direction. -1241 LibertyReader.cc:3610 max_transition is 0.0. -1242 LibertyReader.cc:3716 pulse_latch unknown pulse type. -1243 LibertyReader.cc:4134 timing group missing related_pin/related_bus_pin. -1244 LibertyReader.cc:4233 unknown timing_type %s. -1245 LibertyReader.cc:4253 unknown timing_sense %s. -1246 LibertyReader.cc:4293 mode value is not a string. -1247 LibertyReader.cc:4296 missing mode value. -1248 LibertyReader.cc:4299 mode name is not a string. -1249 LibertyReader.cc:4302 mode missing values. -1250 LibertyReader.cc:4305 mode missing mode name and value. -1251 LibertyReader.cc:4381 unsupported model axis. -1252 LibertyReader.cc:4408 unsupported model axis. -1253 LibertyReader.cc:4437 unsupported model axis. -1254 LibertyReader.cc:4472 unsupported model axis. -1255 LibertyReader.cc:4488 %s group not in timing group. -1256 LibertyReader.cc:4527 table template %s not found. -1257 LibertyReader.cc:4611 %s is missing values. -1258 LibertyReader.cc:4634 %s is not a list of floats. -1259 LibertyReader.cc:4636 table row has %u columns but axis has %d. -1260 LibertyReader.cc:4646 table has %u rows but axis has %d. -1261 LibertyReader.cc:4697 lut output is not a string. -1262 LibertyReader.cc:4714 cell %s test_cell redefinition. -1263 LibertyReader.cc:4739 mode definition missing name. -1264 LibertyReader.cc:4756 mode value missing name. -1265 LibertyReader.cc:4770 when attribute inside table model. -1266 LibertyReader.cc:4819 %s attribute is not a string. -1267 LibertyReader.cc:4822 %s is not a simple attribute. -1268 LibertyReader.cc:4842 %s attribute is not an integer. -1269 LibertyReader.cc:4845 %s is not a simple attribute. -1270 LibertyReader.cc:4858 %s is not a simple attribute. -1271 LibertyReader.cc:4884 %s value %s is not a float. -1272 LibertyReader.cc:4913 %s missing values. -1273 LibertyReader.cc:4917 %s missing values. -1274 LibertyReader.cc:4920 %s is not a complex attribute. -1275 LibertyReader.cc:4946 %s is not a float. -1276 LibertyReader.cc:4969 %s is missing values. -1277 LibertyReader.cc:4972 %s has more than one string. -1278 LibertyReader.cc:4981 %s is missing values. -1279 LibertyReader.cc:5006 %s attribute is not boolean. -1280 LibertyReader.cc:5009 %s attribute is not boolean. -1281 LibertyReader.cc:5012 %s is not a simple attribute. -1282 LibertyReader.cc:5028 attribute %s value %s not recognized. -1283 LibertyReader.cc:5059 unknown early/late value. -1284 LibertyReader.cc:5279 OCV derate group named %s not found. -1285 LibertyReader.cc:5295 ocv_derate missing name. -1286 LibertyReader.cc:5348 unknown rise/fall. -1287 LibertyReader.cc:5368 unknown derate type. -1288 LibertyReader.cc:5400 unsupported model axis. -1289 LibertyReader.cc:5432 unsupported model axis. -1290 LibertyReader.cc:5464 unsupported model axis. -1291 LibertyReader.cc:5535 unknown pg_type. -1292 LibertyReader.cc:5949 port %s subscript out of range. -1293 LibertyReader.cc:5953 port range %s of non-bus port %s. -1294 LibertyReader.cc:5967 port %s not found. -1295 LibertyReader.cc:6037 port %s not found. -1297 LibertyReader.cc:1437 axis type %s not supported. -1330 LibertyWriter.cc:300 %s/%s bundled ports not supported. -1331 LibertyWriter.cc:448 %s/%s/%s timing model not supported. -1332 LibertyWriter.cc:468 3 axis table models not supported. -1333 LibertyWriter.cc:617 %s/%s/%s timing arc type %s not supported. +1140 LibertyReader.cc:626 library %s already exists. +1141 LibertyReader.cc:660 library missing name. +1142 LibertyReader.cc:686 default_wire_load %s not found. +1143 LibertyReader.cc:697 default_wire_selection %s not found. +1144 LibertyReader.cc:709 default_operating_condition %s not found. +1145 LibertyReader.cc:719 input_threshold_pct_%s not found. +1146 LibertyReader.cc:723 output_threshold_pct_%s not found. +1147 LibertyReader.cc:727 slew_lower_threshold_pct_%s not found. +1148 LibertyReader.cc:731 slew_upper_threshold_pct_%s not found. +1149 LibertyReader.cc:736 Library %s is missing one or more thresholds. +1150 LibertyReader.cc:815 unknown unit multiplier %s. +1151 LibertyReader.cc:838 unknown unit scale %c. +1152 LibertyReader.cc:841 unknown unit suffix %s. +1153 LibertyReader.cc:844 unknown unit suffix %s. +1154 LibertyReader.cc:869 capacitive_load_units are not ff or pf. +1155 LibertyReader.cc:872 capacitive_load_units are not a string. +1156 LibertyReader.cc:875 capacitive_load_units missing suffix. +1157 LibertyReader.cc:878 capacitive_load_units scale is not a float. +1158 LibertyReader.cc:881 capacitive_load_units missing scale and suffix. +1159 LibertyReader.cc:884 capacitive_load_unit missing values suffix. +1160 LibertyReader.cc:902 delay_model %s not supported. +1161 LibertyReader.cc:906 delay_model %s not supported. +1162 LibertyReader.cc:910 delay_model %s not supported. +1163 LibertyReader.cc:915 delay_model %s not supported.. +1164 LibertyReader.cc:918 unknown delay_model %s. +1165 LibertyReader.cc:937 unknown bus_naming_style format. +1166 LibertyReader.cc:958 voltage_map voltage is not a float. +1167 LibertyReader.cc:961 voltage_map missing voltage. +1168 LibertyReader.cc:964 voltage_map supply name is not a string. +1169 LibertyReader.cc:967 voltage_map missing supply name and voltage. +1170 LibertyReader.cc:970 voltage_map missing values suffix. +1171 LibertyReader.cc:1055 default_max_transition is 0.0. +1172 LibertyReader.cc:1070 default_max_fanout is 0.0. +1173 LibertyReader.cc:1160 default_fanout_load is 0.0. +1174 LibertyReader.cc:1188 default_wire_load_mode %s not found. +1175 LibertyReader.cc:1359 table template missing name. +1176 LibertyReader.cc:1404 missing variable_%d attribute. +1177 LibertyReader.cc:1480 missing table index values. +1178 LibertyReader.cc:1486 non-increasing table index values. +1179 LibertyReader.cc:1518 bus type %s missing bit_from. +1180 LibertyReader.cc:1520 bus type %s missing bit_to. +1181 LibertyReader.cc:1524 type missing name. +1182 LibertyReader.cc:1551 scaling_factors do not have a name. +1183 LibertyReader.cc:1720 operating_conditions missing name. +1184 LibertyReader.cc:1791 wire_load missing name. +1185 LibertyReader.cc:1834 fanout_length is missing length and fanout. +1186 LibertyReader.cc:1849 wire_load_selection missing name. +1187 LibertyReader.cc:1880 wireload %s not found. +1189 LibertyReader.cc:1887 wire_load_from_area min not a float. +1190 LibertyReader.cc:1890 wire_load_from_area max not a float. +1191 LibertyReader.cc:1893 wire_load_from_area missing parameters. +1192 LibertyReader.cc:1896 wire_load_from_area missing parameters. +1193 LibertyReader.cc:1915 cell missing name. +1194 LibertyReader.cc:1939 cell %s ocv_derate_group %s not found. +1195 LibertyReader.cc:1972 port %s function size does not match port size. +1196 LibertyReader.cc:2069 %s %s bus width mismatch. +1197 LibertyReader.cc:2080 %s %s bus width mismatch. +1198 LibertyReader.cc:2090 clear +1199 LibertyReader.cc:2100 preset +1200 LibertyReader.cc:2136 latch enable function is non-unate for port %s. +1201 LibertyReader.cc:2141 latch enable function is unknown for port %s. +1202 LibertyReader.cc:2243 operating conditions %s not found. +1203 LibertyReader.cc:2246 scaled_cell missing operating condition. +1204 LibertyReader.cc:2249 scaled_cell cell %s has not been defined. +1205 LibertyReader.cc:2252 scaled_cell missing name. +1206 LibertyReader.cc:2278 scaled_cell %s, %s port functions do not match cell port functions. +1207 LibertyReader.cc:2283 scaled_cell ports do not match cell ports. +1208 LibertyReader.cc:2285 scaled_cell %s, %s timing does not match cell timing. +1209 LibertyReader.cc:2304 combinational timing to an input port. +1210 LibertyReader.cc:2399 missing %s_transition. +1211 LibertyReader.cc:2401 missing cell_%s. +1212 LibertyReader.cc:2422 timing group from output port. +1213 LibertyReader.cc:2432 timing group from output port. +1214 LibertyReader.cc:2442 timing group from output port. +1215 LibertyReader.cc:2477 timing group from output port. +1217 LibertyReader.cc:2487 timing group from output port. +1218 LibertyReader.cc:2588 receiver_capacitance group not in timing or pin group. +1219 LibertyReader.cc:2606 unsupported model axis. +1220 LibertyReader.cc:2634 output_current_%s group not in timing group. +1221 LibertyReader.cc:2676 output current waveform %.2e %.2e not found. +1222 LibertyReader.cc:2697 unsupported model axis. +1223 LibertyReader.cc:2739 vector index_1 and index_2 must have exactly one value. +1224 LibertyReader.cc:2741 vector reference_time not found. +1225 LibertyReader.cc:2774 normalized_driver_waveform variable_2 must be normalized_voltage +1226 LibertyReader.cc:2777 normalized_driver_waveform variable_1 must be input_net_transition +1228 LibertyReader.cc:2999 level_shifter_type must be HL, LH, or HL_LH +1229 LibertyReader.cc:3035 switch_cell_type must be coarse_grain or fine_grain +1230 LibertyReader.cc:3059 scaling_factors %s not found. +1231 LibertyReader.cc:3120 pin name is not a string. +1232 LibertyReader.cc:3137 pin name is not a string. +1233 LibertyReader.cc:3151 pin name is not a string. +1234 LibertyReader.cc:3229 bus %s bus_type not found. +1235 LibertyReader.cc:3281 bus_type %s not found. +1236 LibertyReader.cc:3284 bus_type is not a string. +1237 LibertyReader.cc:3302 bundle %s member not found. +1238 LibertyReader.cc:3325 member is not a string. +1239 LibertyReader.cc:3332 members attribute is missing values. +1240 LibertyReader.cc:3383 unknown port direction. +1241 LibertyReader.cc:3630 max_transition is 0.0. +1242 LibertyReader.cc:3736 pulse_latch unknown pulse type. +1243 LibertyReader.cc:4155 timing group missing related_pin/related_bus_pin. +1244 LibertyReader.cc:4254 unknown timing_type %s. +1245 LibertyReader.cc:4274 unknown timing_sense %s. +1246 LibertyReader.cc:4314 mode value is not a string. +1247 LibertyReader.cc:4317 missing mode value. +1248 LibertyReader.cc:4320 mode name is not a string. +1249 LibertyReader.cc:4323 mode missing values. +1250 LibertyReader.cc:4326 mode missing mode name and value. +1251 LibertyReader.cc:4402 unsupported model axis. +1252 LibertyReader.cc:4429 unsupported model axis. +1253 LibertyReader.cc:4458 unsupported model axis. +1254 LibertyReader.cc:4493 unsupported model axis. +1255 LibertyReader.cc:4509 %s group not in timing group. +1256 LibertyReader.cc:4548 table template %s not found. +1257 LibertyReader.cc:4632 %s is missing values. +1258 LibertyReader.cc:4655 %s is not a list of floats. +1259 LibertyReader.cc:4657 table row has %u columns but axis has %d. +1260 LibertyReader.cc:4667 table has %u rows but axis has %d. +1261 LibertyReader.cc:4718 lut output is not a string. +1262 LibertyReader.cc:4734 cell %s test_cell redefinition. +1263 LibertyReader.cc:4773 mode definition missing name. +1264 LibertyReader.cc:4790 mode value missing name. +1265 LibertyReader.cc:4804 when attribute inside table model. +1266 LibertyReader.cc:4853 %s attribute is not a string. +1267 LibertyReader.cc:4856 %s is not a simple attribute. +1268 LibertyReader.cc:4876 %s attribute is not an integer. +1269 LibertyReader.cc:4879 %s is not a simple attribute. +1270 LibertyReader.cc:4892 %s is not a simple attribute. +1271 LibertyReader.cc:4918 %s value %s is not a float. +1272 LibertyReader.cc:4947 %s missing values. +1273 LibertyReader.cc:4951 %s missing values. +1274 LibertyReader.cc:4954 %s is not a complex attribute. +1275 LibertyReader.cc:4980 %s is not a float. +1276 LibertyReader.cc:5003 %s is missing values. +1277 LibertyReader.cc:5006 %s has more than one string. +1278 LibertyReader.cc:5015 %s is missing values. +1279 LibertyReader.cc:5040 %s attribute is not boolean. +1280 LibertyReader.cc:5043 %s attribute is not boolean. +1281 LibertyReader.cc:5046 %s is not a simple attribute. +1282 LibertyReader.cc:5062 attribute %s value %s not recognized. +1283 LibertyReader.cc:5093 unknown early/late value. +1284 LibertyReader.cc:5313 OCV derate group named %s not found. +1285 LibertyReader.cc:5329 ocv_derate missing name. +1286 LibertyReader.cc:5382 unknown rise/fall. +1287 LibertyReader.cc:5402 unknown derate type. +1288 LibertyReader.cc:5434 unsupported model axis. +1289 LibertyReader.cc:5466 unsupported model axis. +1290 LibertyReader.cc:5498 unsupported model axis. +1291 LibertyReader.cc:5569 unknown pg_type. +1292 LibertyReader.cc:5983 port %s subscript out of range. +1293 LibertyReader.cc:5987 port range %s of non-bus port %s. +1294 LibertyReader.cc:6001 port %s not found. +1295 LibertyReader.cc:6071 port %s not found. +1297 LibertyReader.cc:1446 axis type %s not supported. +1298 LibertyReader.cc:2160 statetable input port %s not found. +1299 LibertyReader.cc:3785 unknown signal_type %s. +1300 LibertyReader.cc:4029 table row must have 3 groups separated by ':'. +1301 LibertyReader.cc:4034 table row has %zu input values but %zu are required. +1302 LibertyReader.cc:4041 table row has %zu current values but %zu are required. +1303 LibertyReader.cc:4048 table row has %zu next values but %zu are required. +1304 LibertyReader.cc:4094 table input value '%s' not recognized. +1305 LibertyReader.cc:4113 table internal value '%s' not recognized. +1340 LibertyWriter.cc:307 %s/%s bundled ports not supported. +1341 LibertyWriter.cc:455 %s/%s/%s timing model not supported. +1342 LibertyWriter.cc:475 3 axis table models not supported. +1343 LibertyWriter.cc:624 %s/%s/%s timing arc type %s not supported. 1350 LumpedCapDelayCalc.cc:138 gate delay input variable is NaN 1355 MakeTimingModel.cc:227 clock %s pin %s is inside model block. 1360 Vcd.cc:172 Unknown variable %s ID %s -1370 PathEnum.cc:474 path diversion missing edge. +1370 PathEnum.cc:476 path diversion missing edge. 1398 VerilogReader.cc:1860 %s is not a verilog module. 1399 VerilogReader.cc:1865 %s is not a verilog module. 1400 PathVertex.cc:236 missing arrivals. @@ -508,16 +500,16 @@ Warning: 304 duplicated 1525 SpefParse.yy:805 %d is not positive. 1526 SpefParse.yy:814 %.4f is not positive. 1527 SpefParse.yy:820 %.4f is not positive. -1550 Sta.cc:2005 '%s' is not a valid start point. -1551 Sta.cc:2078 '%s' is not a valid endpoint. -1552 Sta.cc:2081 '%s' is not a valid endpoint. -1553 Sta.cc:2397 maximum corner count exceeded -1554 Sta.cc:2002 '%s' is not a valid start point. +1550 Sta.cc:1999 '%s' is not a valid start point. +1551 Sta.cc:2072 '%s' is not a valid endpoint. +1552 Sta.cc:2075 '%s' is not a valid endpoint. +1553 Sta.cc:2391 maximum corner count exceeded +1554 Sta.cc:1996 '%s' is not a valid start point. 1570 Search.i:54 no network has been linked. 1571 Search.i:68 network does not support edits. -1574 Search.i:1118 POCV support requires compilation with SSTA=1. -1575 Search.i:527 unknown report path field %s -1576 Search.i:539 unknown report path field %s +1574 Search.i:1120 POCV support requires compilation with SSTA=1. +1575 Search.i:529 unknown report path field %s +1576 Search.i:541 unknown report path field %s 1600 WritePathSpice.cc:165 No liberty libraries found, 1602 WriteSpice.cc:458 Liberty pg_port %s/%s missing voltage_name attribute, 1603 WriteSpice.cc:428 %s pg_port %s not found, diff --git a/include/sta/Liberty.hh b/include/sta/Liberty.hh index 0d751c65..b7312706 100644 --- a/include/sta/Liberty.hh +++ b/include/sta/Liberty.hh @@ -88,6 +88,9 @@ enum class ClockGateType { none, latch_posedge, latch_negedge, other }; enum class DelayModelType { cmos_linear, cmos_pwl, cmos2, table, polynomial, dcm }; +enum class ScanSignalType { enable, enable_inverted, clock, clock_a, clock_b, + input, input_inverted, output, output_inverted, none }; + enum class ScaleFactorPvt { process, volt, temp, unknown }; constexpr int scale_factor_pvt_count = int(ScaleFactorPvt::unknown) + 1; @@ -691,6 +694,8 @@ public: LibertyPort *findLibertyBusBit(int index) const; BusDcl *busDcl() const { return bus_dcl_; } void setDirection(PortDirection *dir); + ScanSignalType scanSignalType() const { return scan_signal_type_; } + void setScanSignalType(ScanSignalType type); void fanoutLoad(// Return values. float &fanout_load, bool &exists) const; @@ -861,6 +866,7 @@ protected: LibertyCell *liberty_cell_; BusDcl *bus_dcl_; FuncExpr *function_; + ScanSignalType scan_signal_type_; FuncExpr *tristate_enable_; ScaledPortMap *scaled_ports_; RiseFallMinMax capacitance_; @@ -1080,32 +1086,12 @@ protected: TableAxisPtr axis3_; }; -class TestCell +class TestCell : public LibertyCell { public: - TestCell(); - TestCell(LibertyPort *data_in, - LibertyPort *scan_in, - LibertyPort *scan_enable, - LibertyPort *scan_out, - LibertyPort *scan_out_inv); - LibertyPort *dataIn() const { return data_in_; } - void setDataIn(LibertyPort *port); - LibertyPort *scanIn() const { return scan_in_; } - void setScanIn(LibertyPort *port); - LibertyPort *scanEnable() const { return scan_enable_; } - void setScanEnable(LibertyPort *port); - LibertyPort *scanOut() const { return scan_out_; } - void setScanOut(LibertyPort *port); - LibertyPort *scanOutInv() const { return scan_out_inv_; } - void setScanOutInv(LibertyPort *port); + TestCell(LibertyCell *cell); protected: - LibertyPort *data_in_; - LibertyPort *scan_in_; - LibertyPort *scan_enable_; - LibertyPort *scan_out_; - LibertyPort *scan_out_inv_; }; class OcvDerate diff --git a/include/sta/LibertyClass.hh b/include/sta/LibertyClass.hh index 8217e031..ab62652b 100644 --- a/include/sta/LibertyClass.hh +++ b/include/sta/LibertyClass.hh @@ -36,7 +36,6 @@ class OperatingConditions; class BusDcl; class ModeDef; class ModeValueDef; -class TestCell; class TableTemplate; class Table; class TableModel; diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index 1609ae97..b6bb75ac 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -2075,6 +2075,7 @@ LibertyPort::LibertyPort(LibertyCell *cell, liberty_cell_(cell), bus_dcl_(bus_dcl), function_(nullptr), + scan_signal_type_(ScanSignalType::none), tristate_enable_(nullptr), scaled_ports_(nullptr), fanout_load_(0.0), @@ -2132,6 +2133,12 @@ LibertyPort::setDirection(PortDirection *dir) liberty_cell_->setHasInternalPorts(true); } +void +LibertyPort::setScanSignalType(ScanSignalType type) +{ + scan_signal_type_ = type; +} + LibertyPort * LibertyPort::findLibertyMember(int index) const { @@ -3152,56 +3159,9 @@ ScaleFactors::print() } } -TestCell::TestCell(LibertyPort *data_in, - LibertyPort *scan_in, - LibertyPort *scan_enable, - LibertyPort *scan_out, - LibertyPort *scan_out_inv) : - data_in_(data_in), - scan_in_(scan_in), - scan_enable_(scan_enable), - scan_out_(scan_out), - scan_out_inv_(scan_out_inv) -{ -} - -TestCell::TestCell() : - data_in_(nullptr), - scan_in_(nullptr), - scan_enable_(nullptr), - scan_out_(nullptr), - scan_out_inv_(nullptr) -{ -} - -void -TestCell::setDataIn(LibertyPort *port) -{ - data_in_ = port; -} - -void -TestCell::setScanIn(LibertyPort *port) -{ - scan_in_ = port; -} - -void -TestCell::setScanEnable(LibertyPort *port) -{ - scan_enable_ = port; -} - -void -TestCell::setScanOut(LibertyPort *port) -{ - scan_out_ = port; -} - -void -TestCell::setScanOutInv(LibertyPort *port) +TestCell::TestCell(LibertyCell *cell) : + LibertyCell(cell->libertyLibrary(), cell->name(), cell->filename()) { - scan_out_inv_ = port; } //////////////////////////////////////////////////////////////// diff --git a/liberty/Liberty.i b/liberty/Liberty.i index f6eeac35..ec1ddec0 100644 --- a/liberty/Liberty.i +++ b/liberty/Liberty.i @@ -294,6 +294,8 @@ ensure_voltage_waveforms() self->ensureVoltageWaveforms(dcalc_aps); } +LibertyCell *test_cell() { return self->testCell(); } + } // LibertyCell methods %extend LibertyPort { diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index e8cf79b5..65f5a0ea 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -57,43 +57,23 @@ readLibertyFile(const char *filename, bool infer_latches, Network *network) { - LibertyReader reader; - return reader.readLibertyFile(filename, infer_latches, network); + LibertyReader reader(filename, infer_latches, network); + return reader.readLibertyFile(filename); } -LibertyReader::LibertyReader() : +LibertyReader::LibertyReader(const char *filename, + bool infer_latches, + Network *network) : LibertyGroupVisitor() { + init(filename, infer_latches, network); defineVisitors(); } -LibertyReader::~LibertyReader() -{ - if (var_map_) { - LibertyVariableMap::Iterator iter(var_map_); - while (iter.hasNext()) { - const char *var; - float value; - iter.next(var, value); - stringDelete(var); - } - delete var_map_; - } - - // Scaling factor attribute names are allocated, so delete them. - LibraryAttrMap::Iterator attr_iter(attr_visitor_map_); - while (attr_iter.hasNext()) { - const char *attr_name; - LibraryAttrVisitor visitor; - attr_iter.next(attr_name, visitor); - stringDelete(attr_name); - } -} - -LibertyLibrary * -LibertyReader::readLibertyFile(const char *filename, - bool infer_latches, - Network *network) +void +LibertyReader::init(const char *filename, + bool infer_latches, + Network *network) { filename_ = filename; infer_latches_ = infer_latches; @@ -146,7 +126,34 @@ LibertyReader::readLibertyFile(const char *filename, have_slew_lower_threshold_[rf_index] = false; have_slew_upper_threshold_[rf_index] = false; } +} +LibertyReader::~LibertyReader() +{ + if (var_map_) { + LibertyVariableMap::Iterator iter(var_map_); + while (iter.hasNext()) { + const char *var; + float value; + iter.next(var, value); + stringDelete(var); + } + delete var_map_; + } + + // Scaling factor attribute names are allocated, so delete them. + LibraryAttrMap::Iterator attr_iter(attr_visitor_map_); + while (attr_iter.hasNext()) { + const char *attr_name; + LibraryAttrVisitor visitor; + attr_iter.next(attr_name, visitor); + stringDelete(attr_name); + } +} + +LibertyLibrary * +LibertyReader::readLibertyFile(const char *filename) +{ //::LibertyParse_debug = 1; parseLibertyFile(filename, this, report_); return library_; @@ -909,10 +916,10 @@ LibertyReader::visitDelayModel(LibertyAttr *attr) // Evil IBM garbage. else if (stringEq(type_name, "dcm")) { library_->setDelayModelType(DelayModelType::dcm); - libWarn(1163, attr, "delay_model %s not supported.\n.", type_name); + libWarn(1163, attr, "delay_model %s not supported..", type_name); } else - libWarn(1164, attr, "unknown delay_model %s\n.", type_name); + libWarn(1164, attr, "unknown delay_model %s.", type_name); } } } @@ -2154,7 +2161,7 @@ LibertyReader::makeStatetable() if (port) input_ports.push_back(port); else - libWarn(0000, statetable_->line(), "statetable input port %s not found.", + libWarn(1298, statetable_->line(), "statetable input port %s not found.", input.c_str()); } LibertyPortSeq internal_ports; @@ -3766,17 +3773,34 @@ LibertyReader::visitIsPllFeedbackPin(LibertyAttr *attr) void LibertyReader::visitSignalType(LibertyAttr *attr) { - if (test_cell_) { + if (test_cell_ && port_) { const char *type = getAttrString(attr); if (type) { + ScanSignalType signal_type = ScanSignalType::none; if (stringEq(type, "test_scan_enable")) - test_cell_->setScanEnable(port_); - if (stringEq(type, "test_scan_in")) - test_cell_->setScanIn(port_); - if (stringEq(type, "test_scan_out")) - test_cell_->setScanOut(port_); - if (stringEq(type, "test_scan_out_inverted")) - test_cell_->setScanOutInv(port_); + signal_type = ScanSignalType::enable; + else if (stringEq(type, "test_scan_enable_inverted")) + signal_type = ScanSignalType::enable_inverted; + else if (stringEq(type, "test_scan_clock")) + signal_type = ScanSignalType::clock; + else if (stringEq(type, "test_scan_clock_a")) + signal_type = ScanSignalType::clock_a; + else if (stringEq(type, "test_scan_clock_b")) + signal_type = ScanSignalType::clock_b; + else if (stringEq(type, "test_scan_in")) + signal_type = ScanSignalType::input; + else if (stringEq(type, "test_scan_in_inverted")) + signal_type = ScanSignalType::input_inverted; + else if (stringEq(type, "test_scan_out")) + signal_type = ScanSignalType::output; + else if (stringEq(type, "test_scan_out_inverted")) + signal_type = ScanSignalType::output_inverted; + else { + libWarn(1299, attr, "unknown signal_type %s.", type); + return; + } + if (port_) + port_->setScanSignalType(signal_type); } } } @@ -3946,12 +3970,6 @@ LibertyReader::visitDataIn(LibertyAttr *attr) if (func) sequential_->setData(stringCopy(func)); } - if (test_cell_) { - const char *next_state = getAttrString(attr); - LibertyPort *port = findPort(save_cell_, next_state); - if (port) - test_cell_->setDataIn(port); - } } void @@ -4022,26 +4040,26 @@ LibertyReader::visitTable(LibertyAttr *attr) for (string row : table_rows) { StdStringSeq row_groups = parseTokenList(row.c_str(), ':'); if (row_groups.size() != 3) { - libWarn(0000, attr, "table row must have 3 groups separated by ':'."); + libWarn(1300, attr, "table row must have 3 groups separated by ':'."); break; } StdStringSeq inputs = parseTokenList(row_groups[0].c_str(), ' '); if (inputs.size() != input_count) { - libWarn(0000, attr, "table row has %zu input values but %zu are required.", + libWarn(1301, attr, "table row has %zu input values but %zu are required.", inputs.size(), input_count); break; } StdStringSeq currents = parseTokenList(row_groups[1].c_str(), ' '); if (currents.size() != internal_count) { - libWarn(0000, attr, "table row has %zu current values but %zu are required.", + libWarn(1302, attr, "table row has %zu current values but %zu are required.", currents.size(), internal_count); break; } StdStringSeq nexts = parseTokenList(row_groups[2].c_str(), ' '); if (nexts.size() != internal_count) { - libWarn(0000, attr, "table row has %zu next values but %zu are required.", + libWarn(1303, attr, "table row has %zu next values but %zu are required.", nexts.size(), internal_count); break; @@ -4087,7 +4105,7 @@ LibertyReader::parseStateInputValues(StdStringSeq &inputs, StateInputValue value; state_input_value_name_map.find(input.c_str(), value, exists); if (!exists) { - libWarn(0000, attr, "table input value '%s' not recognized.", + libWarn(1304, attr, "table input value '%s' not recognized.", input.c_str()); value = StateInputValue::dont_care; } @@ -4106,7 +4124,7 @@ LibertyReader::parseStateInternalValues(StdStringSeq &states, StateInternalValue value; state_internal_value_name_map.find(state.c_str(), value, exists); if (!exists) { - libWarn(0000, attr, "table internal value '%s' not recognized.", + libWarn(1305, attr, "table internal value '%s' not recognized.", state.c_str()); value = StateInternalValue::unknown; } @@ -4723,25 +4741,44 @@ LibertyReader::endLut(LibertyGroup *) //////////////////////////////////////////////////////////////// -// Find scan ports in test_cell group. void LibertyReader::beginTestCell(LibertyGroup *group) { if (cell_ && cell_->testCell()) libWarn(1262, group, "cell %s test_cell redefinition.", cell_->name()); else { - test_cell_ = new TestCell; + test_cell_ = new TestCell(cell_); cell_->setTestCell(test_cell_); + + // Do a recursive parse of cell into the test_cell because it has + // pins, buses, bundles, and sequentials just like a cell. save_cell_ = cell_; - cell_ = nullptr; + save_cell_port_groups_ = std::move(cell_port_groups_); + save_statetable_ = statetable_; + statetable_ = nullptr; + save_cell_sequentials_ = std::move(cell_sequentials_); + save_cell_funcs_ = std::move(cell_funcs_); + cell_ = test_cell_; } } void LibertyReader::endTestCell(LibertyGroup *) { + makeCellSequentials(); + makeStatetable(); + parseCellFuncs(); + finishPortGroups(); + + // Restore reader state to enclosing cell. + cell_port_groups_ = std::move(save_cell_port_groups_); + statetable_ = save_statetable_; + cell_sequentials_ = std::move(save_cell_sequentials_); + cell_funcs_= std::move(save_cell_funcs_); cell_ = save_cell_; + test_cell_ = nullptr; + save_statetable_ = nullptr; } //////////////////////////////////////////////////////////////// diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index 9cd3b795..fec56d33 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -69,11 +69,14 @@ typedef vector StdStringSeq; class LibertyReader : public LibertyGroupVisitor { public: - explicit LibertyReader(); + LibertyReader(const char *filename, + bool infer_latches, + Network *network); virtual ~LibertyReader(); - virtual LibertyLibrary *readLibertyFile(const char *filename, - bool infer_latches, - Network *network); + virtual LibertyLibrary *readLibertyFile(const char *filename); + virtual void init(const char *filename, + bool infer_latches, + Network *network); LibertyLibrary *library() const { return library_; } virtual bool save(LibertyGroup *) { return false; } virtual bool save(LibertyAttr *) { return false; } @@ -608,9 +611,7 @@ protected: bool have_slew_upper_threshold_[RiseFall::index_count]; TableTemplate *tbl_template_; LibertyCell *cell_; - LibertyCell *save_cell_; LibertyCell *scaled_cell_owner_; - TestCell *test_cell_; const char *ocv_derate_name_; PortGroupSeq cell_port_groups_; OperatingConditions *op_cond_; @@ -666,6 +667,14 @@ protected: bool reference_time_exists_; const char *driver_waveform_name_; + TestCell *test_cell_; + // Saved state while parsing test_cell. + LibertyCell *save_cell_; + PortGroupSeq save_cell_port_groups_; + StatetableGroup *save_statetable_; + SequentialGroupSeq save_cell_sequentials_; + LibertyFuncSeq save_cell_funcs_; + static constexpr char escape_ = '\\'; private: diff --git a/liberty/LibertyWriter.cc b/liberty/LibertyWriter.cc index 2dfe32f7..63889584 100644 --- a/liberty/LibertyWriter.cc +++ b/liberty/LibertyWriter.cc @@ -304,7 +304,7 @@ LibertyWriter::writeCell(const LibertyCell *cell) if (port->isBus()) writeBusPort(port); else if (port->isBundle()) - report_->error(1330, "%s/%s bundled ports not supported.", + report_->error(1340, "%s/%s bundled ports not supported.", library_->name(), cell->name()); else @@ -452,7 +452,7 @@ LibertyWriter::writeTimingModels(const TimingArc *arc, fprintf(stream_, " }\n"); } else - report_->error(1331, "%s/%s/%s timing model not supported.", + report_->error(1341, "%s/%s/%s timing model not supported.", library_->name(), arc->from()->libertyCell()->name(), arc->from()->name()); @@ -472,7 +472,7 @@ LibertyWriter::writeTableModel(const TableModel *model) writeTableModel2(model); break; case 3: - report_->error(1332, "3 axis table models not supported."); + report_->error(1342, "3 axis table models not supported."); break; } } @@ -621,7 +621,7 @@ LibertyWriter::timingTypeString(const TimingArcSet *arc_set) else if (role == TimingRole::width()) return "min_pulse_width"; else { - report_->error(1333, "%s/%s/%s timing arc type %s not supported.", + report_->error(1343, "%s/%s/%s timing arc type %s not supported.", library_->name(), arc_set->to()->libertyCell()->name(), arc_set->to()->name(), diff --git a/power/Power.tcl b/power/Power.tcl index 0629ccd3..060e6161 100644 --- a/power/Power.tcl +++ b/power/Power.tcl @@ -283,7 +283,7 @@ proc read_power_activities { args } { if { [info exists keys(-scope)] } { set scope $keys(-scope) } - sta_warn 304 "read_power_activities is deprecated. Use read_vcd." + sta_warn 305 "read_power_activities is deprecated. Use read_vcd." read_vcd_file $filename $scope } diff --git a/search/Sim.cc b/search/Sim.cc index f603880c..deed4142 100644 --- a/search/Sim.cc +++ b/search/Sim.cc @@ -824,9 +824,7 @@ Sim::annotateVertexEdges(const Instance *inst, pin, network_,sim_) // Disable mode conditional timing // edges based on constant pins. - || isModeDisabled(edge,inst,network_,sim_) - || isTestDisabled(inst, from_pin, pin, - network_, sim_); + || isModeDisabled(edge,inst,network_,sim_); } bool disables_changed = false; if (sense != edge->simTimingSense()) { @@ -957,58 +955,4 @@ isModeDisabled(Edge *edge, } } -bool -isTestDisabled(const Instance *inst, - const Pin *from_pin, - const Pin *to_pin, - const Network *network, - const Sim *sim) -{ - bool is_disabled; - Pin *scan_enable; - isTestDisabled(inst, from_pin, to_pin, network, sim, - is_disabled, scan_enable); - return is_disabled; -} - -void -isTestDisabled(const Instance *inst, - const Pin *from_pin, - const Pin *to_pin, - const Network *network, - const Sim *sim, - bool &is_disabled, - Pin *&scan_enable) -{ - is_disabled = false; - LibertyCell *cell = network->libertyCell(inst); - if (cell) { - TestCell *test = cell->testCell(); - if (test) { - LibertyPort *from_port = network->libertyPort(from_pin); - LibertyPort *to_port = network->libertyPort(to_pin); - LibertyPort *data_in_port = test->dataIn(); - LibertyPort *scan_in_port = test->scanIn(); - if (from_port == data_in_port - || to_port == data_in_port - || from_port == scan_in_port - || to_port == scan_in_port) { - LibertyPort *scan_enable_port = test->scanEnable(); - if (scan_enable_port) { - scan_enable = network->findPin(inst, scan_enable_port); - if (scan_enable) { - LogicValue scan_enable_value = sim->logicValue(scan_enable); - is_disabled = ((scan_enable_value == LogicValue::zero - && (from_port == scan_in_port - || to_port == scan_in_port)) - || (scan_enable_value == LogicValue::one - && (from_port == data_in_port - || to_port == data_in_port))); - } - } - } - } - } -} - } // namespace diff --git a/search/Sim.hh b/search/Sim.hh index eeca92a4..6d3d0c71 100644 --- a/search/Sim.hh +++ b/search/Sim.hh @@ -183,23 +183,4 @@ isModeDisabled(Edge *edge, bool &is_disabled, FuncExpr *&disable_cond); -// Edge is disabled because by test scan enable. -// from scan_data_in and scan_enable=1 -// from scan_in and scan_enable=0 -bool -isTestDisabled(const Instance *inst, - const Pin *from_pin, - const Pin *to_pin, - const Network *network, - const Sim *sim); - -void -isTestDisabled(const Instance *inst, - const Pin *from_pin, - const Pin *to_pin, - const Network *network, - const Sim *sim, - bool &is_disabled, - Pin *&scan_enable); - } // namespace diff --git a/search/Sta.cc b/search/Sta.cc index 556ca172..0ffa6403 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -1649,7 +1649,6 @@ Sta::isDisabledConstant(Edge *edge) || (!role->isWire() && (isCondDisabled(edge, inst, from_pin, to_pin, network_, sim_) || isModeDisabled(edge, inst, network_, sim_) - || isTestDisabled(inst, from_pin, to_pin, network_, sim_) || hasDisabledArcs(edge, graph_))); } @@ -1704,11 +1703,6 @@ Sta::disabledConstantPins(Edge *edge) is_disabled, disable_cond); if (is_disabled) exprConstantPins(disable_cond, inst, pins); - Pin *scan_enable; - isTestDisabled(inst, from_pin, to_pin, network_, sim_, - is_disabled, scan_enable); - if (is_disabled) - pins.insert(scan_enable); if (hasDisabledArcs(edge, graph_)) { LibertyPort *to_port = network_->libertyPort(to_pin); if (to_port) {