Merge remote-tracking branch 'parallax/master'
Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
This commit is contained in:
commit
b11fde9ef4
21
README.md
21
README.md
|
|
@ -79,7 +79,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.
|
||||
|
||||
|
|
@ -189,6 +189,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.
|
||||
|
|
|
|||
438
doc/messages.txt
438
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,
|
||||
|
|
|
|||
|
|
@ -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,14 @@ 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(LibertyLibrary *library,
|
||||
const char *name,
|
||||
const char *filename);
|
||||
|
||||
protected:
|
||||
LibertyPort *data_in_;
|
||||
LibertyPort *scan_in_;
|
||||
LibertyPort *scan_enable_;
|
||||
LibertyPort *scan_out_;
|
||||
LibertyPort *scan_out_inv_;
|
||||
};
|
||||
|
||||
class OcvDerate
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@ class OperatingConditions;
|
|||
class BusDcl;
|
||||
class ModeDef;
|
||||
class ModeValueDef;
|
||||
class TestCell;
|
||||
class TableTemplate;
|
||||
class Table;
|
||||
class TableModel;
|
||||
|
|
|
|||
|
|
@ -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,58 +3159,13 @@ 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(LibertyLibrary *library,
|
||||
const char *name,
|
||||
const char *filename) :
|
||||
LibertyCell(library, name, filename)
|
||||
{
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
scan_out_inv_ = port;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
OcvDerate::OcvDerate(const char *name) :
|
||||
|
|
|
|||
|
|
@ -294,6 +294,8 @@ ensure_voltage_waveforms()
|
|||
self->ensureVoltageWaveforms(dcalc_aps);
|
||||
}
|
||||
|
||||
LibertyCell *test_cell() { return self->testCell(); }
|
||||
|
||||
} // LibertyCell methods
|
||||
|
||||
%extend LibertyPort {
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ HNAME ({PIN_NAME}|{BUS_NAME}|{MIXED_NAME})([\/.]({PIN_NAME}|{BUS_NAME}|{MIXED_NA
|
|||
/* default_operating_conditions : slow_100_3.00 ; */
|
||||
/* revision : 1.0.17; */
|
||||
/* default_wire_load : xc2v250-5_avg; */
|
||||
TOKEN ({ALPHA}|{DIGIT}|_)({ALPHA}|{DIGIT}|[._\-])*
|
||||
TOKEN ({ALPHA}|{DIGIT}|_)({ALPHA}|{DIGIT}|[._\-])*(:({ALPHA}|{DIGIT}|_)+)?
|
||||
/* bus_naming_style : %s[%d] ; */
|
||||
BUS_STYLE "%s"{BUS_LEFT}"%d"{BUS_RIGHT}
|
||||
PUNCTUATION [,\:;|(){}+*&!'=]
|
||||
|
|
|
|||
|
|
@ -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_;
|
||||
|
|
@ -905,10 +912,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2150,7 +2157,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;
|
||||
|
|
@ -3291,7 +3298,7 @@ void
|
|||
LibertyReader::endBundle(LibertyGroup *group)
|
||||
{
|
||||
if (cell_) {
|
||||
if (ports_->empty())
|
||||
if (ports_ && ports_->empty())
|
||||
libWarn(1237, group, "bundle %s member not found.", group->firstName());
|
||||
endBusOrBundle();
|
||||
in_bundle_ = false;
|
||||
|
|
@ -3762,17 +3769,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3942,12 +3966,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
|
||||
|
|
@ -4018,26 +4036,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;
|
||||
|
|
@ -4083,7 +4101,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;
|
||||
}
|
||||
|
|
@ -4102,7 +4120,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;
|
||||
}
|
||||
|
|
@ -4719,25 +4737,47 @@ 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;
|
||||
string name = cell_->name();
|
||||
name += "/test_cell";
|
||||
test_cell_ = new TestCell(cell_->libertyLibrary(), name.c_str(),
|
||||
cell_->filename());
|
||||
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;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -69,11 +69,14 @@ typedef vector<string> 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:
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue