Merge remote-tracking branch 'parallax/master'

Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
This commit is contained in:
Matt Liberty 2024-11-06 23:18:52 +00:00
commit b11fde9ef4
14 changed files with 377 additions and 447 deletions

View File

@ -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 base have not passed extensive regression testing which is not
publicly available. publicly available.
## Build ## Build from source
OpenSTA is built with CMake. 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 existing CMake cached variable values by deleting all of the
files in the build directory. 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 ## Bug Reports
Use the Issues tab on the github repository to report bugs. Use the Issues tab on the github repository to report bugs.

View File

@ -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. 0100 CmdArgs.tcl:108 unsupported object type $object_type.
0101 CmdArgs.tcl:166 object '$obj' not found. 0101 CmdArgs.tcl:165 object '$obj' not found.
0102 CmdArgs.tcl:414 $corner_arg is not the name of process corner. 0102 CmdArgs.tcl:413 $corner_arg is not the name of process corner.
0103 CmdArgs.tcl:420 -corner keyword required with multi-corner analysis. 0103 CmdArgs.tcl:419 -corner keyword required with multi-corner analysis.
0104 CmdArgs.tcl:434 $corner_name is not the name of process corner. 0104 CmdArgs.tcl:433 $corner_name is not the name of process corner.
0105 CmdArgs.tcl:439 missing -corner arg. 0105 CmdArgs.tcl:438 missing -corner arg.
0106 CmdArgs.tcl:450 $corner_name is not the name of process corner. 0106 CmdArgs.tcl:449 $corner_name is not the name of process corner.
0107 CmdArgs.tcl:467 $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:502 both -min and -max specified. 0108 CmdArgs.tcl:501 both -min and -max specified.
0109 CmdArgs.tcl:516 both -min and -max specified. 0109 CmdArgs.tcl:515 both -min and -max specified.
0110 CmdArgs.tcl:543 only one of -early and -late can be specified. 0110 CmdArgs.tcl:542 only one of -early and -late can be specified.
0111 CmdArgs.tcl:549 -early or -late must be specified. 0111 CmdArgs.tcl:548 -early or -late must be specified.
0112 CmdArgs.tcl:556 both -early and -late specified. 0112 CmdArgs.tcl:555 both -early and -late specified.
0113 CmdArgs.tcl:571 $arg_name must be a single library. 0113 CmdArgs.tcl:570 $arg_name must be a single library.
0114 CmdArgs.tcl:577 $arg_name type '$object_type' is not a library. 0114 CmdArgs.tcl:576 $arg_name type '$object_type' is not a library.
0115 CmdArgs.tcl:582 library '$arg' not found. 0115 CmdArgs.tcl:581 library '$arg' not found.
0116 CmdArgs.tcl:599 $arg_name must be a single lib cell. 0116 CmdArgs.tcl:598 $arg_name must be a single lib cell.
0123 CmdArgs.tcl:686 $arg_name must be a single instance. 0123 CmdArgs.tcl:685 $arg_name must be a single instance.
0124 CmdArgs.tcl:692 $arg_name type '$object_type' is not an instance. 0124 CmdArgs.tcl:691 $arg_name type '$object_type' is not an instance.
0125 CmdArgs.tcl:697 instance '$arg' not found. 0125 CmdArgs.tcl:696 instance '$arg' not found.
0126 CmdArgs.tcl:716 $arg_name type '$object_type' is not an instance. 0126 CmdArgs.tcl:715 $arg_name type '$object_type' is not an instance.
0127 CmdArgs.tcl:723 instance '$arg' not found. 0127 CmdArgs.tcl:722 instance '$arg' not found.
0131 CmdArgs.tcl:784 $arg_name type '$object_type' is not a pin or port. 0131 CmdArgs.tcl:783 $arg_name type '$object_type' is not a pin or port.
0132 CmdArgs.tcl:791 pin '$arg' not found. 0132 CmdArgs.tcl:790 pin '$arg' not found.
0133 CmdArgs.tcl:811 $arg_name type '$object_type' is not a port. 0133 CmdArgs.tcl:810 $arg_name type '$object_type' is not a port.
0139 CmdArgs.tcl:892 unsupported object type $object_type. 0139 CmdArgs.tcl:891 unsupported object type $object_type.
0141 CmdArgs.tcl:913 $arg_name '$object_type' is not a net. 0141 CmdArgs.tcl:912 $arg_name '$object_type' is not a net.
0142 CmdArgs.tcl:937 unsupported object type $object_type. 0142 CmdArgs.tcl:936 unsupported object type $object_type.
0143 CmdArgs.tcl:918 $arg_name '$arg' not found. 0143 CmdArgs.tcl:917 $arg_name '$arg' not found.
0144 CmdArgs.tcl:409 corner object type '$object_type' is not a corner. 0144 CmdArgs.tcl:408 corner object type '$object_type' is not a corner.
0160 CmdUtil.tcl:44 no commands match '$pattern'. 0160 CmdUtil.tcl:44 no commands match '$pattern'.
0161 CmdUtil.tcl:89 Usage: $cmd $cmd_args($cmd) 0161 CmdUtil.tcl:89 Usage: $cmd $cmd_args($cmd)
0162 CmdUtil.tcl:91 Usage: $cmd argument error 0162 CmdUtil.tcl:91 Usage: $cmd argument error
@ -94,18 +80,18 @@ Warning: 304 duplicated
0253 NetworkEdit.tcl:192 unsupported object type $object_type. 0253 NetworkEdit.tcl:192 unsupported object type $object_type.
0266 VertexVisitor.cc:32 VertexPinCollector::copy not supported. 0266 VertexVisitor.cc:32 VertexPinCollector::copy not supported.
0267 WriteSpice.cc:1217 out of memory 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. 0272 Parasitics.tcl:41 read_spef -quiet is deprecated.
0273 Parasitics.tcl:45 read_spef -reduce_to is deprecated. Use -reduce instead. 0273 Parasitics.tcl:45 read_spef -reduce_to is deprecated. Use -reduce instead.
0274 Parasitics.tcl:50 read_spef -delete_after_reduce is deprecated. 0274 Parasitics.tcl:50 read_spef -delete_after_reduce is deprecated.
0275 Parasitics.tcl:54 read_spef -save is deprecated. 0275 Parasitics.tcl:54 read_spef -save is deprecated.
0276 Parasitics.tcl:62 path instance '$path' not found. 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 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 0302 Power.tcl:242 duty should be 0.0 to 1.0
0303 Power.tcl:257 activity cannot be set on clock ports. 0303 Power.tcl:257 activity cannot be set on clock ports.
0304 Power.tcl:40 No liberty libraries have been read. 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. 0320 Property.tcl:32 $cmd object is null.
0321 Property.tcl:37 $cmd $type_key must be specified with object name argument. 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. 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. 0331 Sdc.tcl:856 object '$pattern' is not a net.
0332 Sdc.tcl:936 object '$pattern' is not a pin. 0332 Sdc.tcl:936 object '$pattern' is not a pin.
0333 Sdc.tcl:993 object '$pattern' is not a port. 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'. 0340 Sdc.tcl:73 cannot open '$filename'.
0341 Sdc.tcl:128 incomplete command at end of file. 0341 Sdc.tcl:128 incomplete command at end of file.
0342 Sdc.tcl:212 hierarchy separator must be one of '$sdc_dividers'. 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. 0522 Search.tcl:791 -min and -max cannot both be specified.
0523 Search.tcl:811 pin '$pin_arg' is hierarchical. 0523 Search.tcl:811 pin '$pin_arg' is hierarchical.
0524 Search.tcl:867 -format $format not recognized. 0524 Search.tcl:867 -format $format not recognized.
0526 Search.tcl:1013 specify one of -setup and -hold. 0526 Search.tcl:1015 specify one of -setup and -hold.
0527 Search.tcl:1063 unknown path group '$name'. 0527 Search.tcl:1065 unknown path group '$name'.
0540 Sta.tcl:158 -from/-to arguments not supported with -of_objects. 0540 Sta.tcl:158 -from/-to arguments not supported with -of_objects.
0560 Util.tcl:44 $cmd $key missing value. 0560 Util.tcl:44 $cmd $key missing value.
0561 Util.tcl:61 $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. 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. 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. 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. 1113 Liberty.cc:1824 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. 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:1771 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative 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 1116 Liberty.cc:362 unsupported slew degradation table axes
1117 Liberty.cc:378 unsupported slew degradation table axes 1117 Liberty.cc:378 unsupported slew degradation table axes
1118 Liberty.cc:383 unsupported slew degradation table order 1118 Liberty.cc:383 unsupported slew degradation table order
1119 Liberty.cc:413 unsupported slew degradation table axes 1119 Liberty.cc:413 unsupported slew degradation table axes
1120 Liberty.cc:1977 library missing vdd 1120 Liberty.cc:1979 library missing vdd
1121 Liberty.cc:1389 timing arc count mismatch 1121 Liberty.cc:1391 timing arc count mismatch
1125 LibertyParser.cc:310 valueIterator called for LibertySimpleAttribute 1125 LibertyParser.cc:310 valueIterator called for LibertySimpleAttribute
1126 LibertyParser.cc:390 LibertyStringAttrValue called for float value 1126 LibertyParser.cc:390 LibertyStringAttrValue called for float value
1127 LibertyParser.cc:420 LibertyStringAttrValue called for float value 1127 LibertyParser.cc:420 LibertyStringAttrValue called for float value
1130 LibertyExpr.cc:82 %s references unknown port %s. 1130 LibertyExpr.cc:82 %s references unknown port %s.
1131 LibertyExpr.cc:175 %s %s. 1131 LibertyExpr.cc:175 %s %s.
1140 LibertyReader.cc:617 library %s already exists. 1140 LibertyReader.cc:626 library %s already exists.
1141 LibertyReader.cc:651 library missing name. 1141 LibertyReader.cc:660 library missing name.
1142 LibertyReader.cc:677 default_wire_load %s not found. 1142 LibertyReader.cc:686 default_wire_load %s not found.
1143 LibertyReader.cc:688 default_wire_selection %s not found. 1143 LibertyReader.cc:697 default_wire_selection %s not found.
1144 LibertyReader.cc:700 default_operating_condition %s not found. 1144 LibertyReader.cc:709 default_operating_condition %s not found.
1145 LibertyReader.cc:710 input_threshold_pct_%s not found. 1145 LibertyReader.cc:719 input_threshold_pct_%s not found.
1146 LibertyReader.cc:714 output_threshold_pct_%s not found. 1146 LibertyReader.cc:723 output_threshold_pct_%s not found.
1147 LibertyReader.cc:718 slew_lower_threshold_pct_%s not found. 1147 LibertyReader.cc:727 slew_lower_threshold_pct_%s not found.
1148 LibertyReader.cc:722 slew_upper_threshold_pct_%s not found. 1148 LibertyReader.cc:731 slew_upper_threshold_pct_%s not found.
1149 LibertyReader.cc:727 Library %s is missing one or more thresholds. 1149 LibertyReader.cc:736 Library %s is missing one or more thresholds.
1150 LibertyReader.cc:806 unknown unit multiplier %s. 1150 LibertyReader.cc:815 unknown unit multiplier %s.
1151 LibertyReader.cc:829 unknown unit scale %c. 1151 LibertyReader.cc:838 unknown unit scale %c.
1152 LibertyReader.cc:832 unknown unit suffix %s. 1152 LibertyReader.cc:841 unknown unit suffix %s.
1153 LibertyReader.cc:835 unknown unit suffix %s. 1153 LibertyReader.cc:844 unknown unit suffix %s.
1154 LibertyReader.cc:860 capacitive_load_units are not ff or pf. 1154 LibertyReader.cc:869 capacitive_load_units are not ff or pf.
1155 LibertyReader.cc:863 capacitive_load_units are not a string. 1155 LibertyReader.cc:872 capacitive_load_units are not a string.
1156 LibertyReader.cc:866 capacitive_load_units missing suffix. 1156 LibertyReader.cc:875 capacitive_load_units missing suffix.
1157 LibertyReader.cc:869 capacitive_load_units scale is not a float. 1157 LibertyReader.cc:878 capacitive_load_units scale is not a float.
1158 LibertyReader.cc:872 capacitive_load_units missing scale and suffix. 1158 LibertyReader.cc:881 capacitive_load_units missing scale and suffix.
1159 LibertyReader.cc:875 capacitive_load_unit missing values suffix. 1159 LibertyReader.cc:884 capacitive_load_unit missing values suffix.
1160 LibertyReader.cc:893 delay_model %s not supported. 1160 LibertyReader.cc:902 delay_model %s not supported.
1161 LibertyReader.cc:897 delay_model %s not supported. 1161 LibertyReader.cc:906 delay_model %s not supported.
1162 LibertyReader.cc:901 delay_model %s not supported. 1162 LibertyReader.cc:910 delay_model %s not supported.
1163 LibertyReader.cc:906 delay_model %s not supported. 1163 LibertyReader.cc:915 delay_model %s not supported..
. 1164 LibertyReader.cc:918 unknown delay_model %s.
1164 LibertyReader.cc:909 unknown delay_model %s 1165 LibertyReader.cc:937 unknown bus_naming_style format.
. 1166 LibertyReader.cc:958 voltage_map voltage is not a float.
1165 LibertyReader.cc:928 unknown bus_naming_style format. 1167 LibertyReader.cc:961 voltage_map missing voltage.
1166 LibertyReader.cc:949 voltage_map voltage is not a float. 1168 LibertyReader.cc:964 voltage_map supply name is not a string.
1167 LibertyReader.cc:952 voltage_map missing voltage. 1169 LibertyReader.cc:967 voltage_map missing supply name and voltage.
1168 LibertyReader.cc:955 voltage_map supply name is not a string. 1170 LibertyReader.cc:970 voltage_map missing values suffix.
1169 LibertyReader.cc:958 voltage_map missing supply name and voltage. 1171 LibertyReader.cc:1055 default_max_transition is 0.0.
1170 LibertyReader.cc:961 voltage_map missing values suffix. 1172 LibertyReader.cc:1070 default_max_fanout is 0.0.
1171 LibertyReader.cc:1046 default_max_transition is 0.0. 1173 LibertyReader.cc:1160 default_fanout_load is 0.0.
1172 LibertyReader.cc:1061 default_max_fanout is 0.0. 1174 LibertyReader.cc:1188 default_wire_load_mode %s not found.
1173 LibertyReader.cc:1151 default_fanout_load is 0.0. 1175 LibertyReader.cc:1359 table template missing name.
1174 LibertyReader.cc:1179 default_wire_load_mode %s not found. 1176 LibertyReader.cc:1404 missing variable_%d attribute.
1175 LibertyReader.cc:1350 table template missing name. 1177 LibertyReader.cc:1480 missing table index values.
1176 LibertyReader.cc:1395 missing variable_%d attribute. 1178 LibertyReader.cc:1486 non-increasing table index values.
1177 LibertyReader.cc:1471 missing table index values. 1179 LibertyReader.cc:1518 bus type %s missing bit_from.
1178 LibertyReader.cc:1477 non-increasing table index values. 1180 LibertyReader.cc:1520 bus type %s missing bit_to.
1179 LibertyReader.cc:1509 bus type %s missing bit_from. 1181 LibertyReader.cc:1524 type missing name.
1180 LibertyReader.cc:1511 bus type %s missing bit_to. 1182 LibertyReader.cc:1551 scaling_factors do not have a name.
1181 LibertyReader.cc:1515 type missing name. 1183 LibertyReader.cc:1720 operating_conditions missing name.
1182 LibertyReader.cc:1542 scaling_factors do not have a name. 1184 LibertyReader.cc:1791 wire_load missing name.
1183 LibertyReader.cc:1711 operating_conditions missing name. 1185 LibertyReader.cc:1834 fanout_length is missing length and fanout.
1184 LibertyReader.cc:1782 wire_load missing name. 1186 LibertyReader.cc:1849 wire_load_selection missing name.
1185 LibertyReader.cc:1825 fanout_length is missing length and fanout. 1187 LibertyReader.cc:1880 wireload %s not found.
1186 LibertyReader.cc:1840 wire_load_selection missing name. 1189 LibertyReader.cc:1887 wire_load_from_area min not a float.
1187 LibertyReader.cc:1871 wireload %s not found. 1190 LibertyReader.cc:1890 wire_load_from_area max not a float.
1189 LibertyReader.cc:1878 wire_load_from_area min not a float. 1191 LibertyReader.cc:1893 wire_load_from_area missing parameters.
1190 LibertyReader.cc:1881 wire_load_from_area max not a float. 1192 LibertyReader.cc:1896 wire_load_from_area missing parameters.
1191 LibertyReader.cc:1884 wire_load_from_area missing parameters. 1193 LibertyReader.cc:1915 cell missing name.
1192 LibertyReader.cc:1887 wire_load_from_area missing parameters. 1194 LibertyReader.cc:1939 cell %s ocv_derate_group %s not found.
1193 LibertyReader.cc:1906 cell missing name. 1195 LibertyReader.cc:1972 port %s function size does not match port size.
1194 LibertyReader.cc:1930 cell %s ocv_derate_group %s not found. 1196 LibertyReader.cc:2069 %s %s bus width mismatch.
1195 LibertyReader.cc:1963 port %s function size does not match port size. 1197 LibertyReader.cc:2080 %s %s bus width mismatch.
1196 LibertyReader.cc:2060 %s %s bus width mismatch. 1198 LibertyReader.cc:2090 clear
1197 LibertyReader.cc:2071 %s %s bus width mismatch. 1199 LibertyReader.cc:2100 preset
1198 LibertyReader.cc:2081 clear 1200 LibertyReader.cc:2136 latch enable function is non-unate for port %s.
1199 LibertyReader.cc:2091 preset 1201 LibertyReader.cc:2141 latch enable function is unknown for port %s.
1200 LibertyReader.cc:2127 latch enable function is non-unate for port %s. 1202 LibertyReader.cc:2243 operating conditions %s not found.
1201 LibertyReader.cc:2132 latch enable function is unknown for port %s. 1203 LibertyReader.cc:2246 scaled_cell missing operating condition.
1202 LibertyReader.cc:2233 operating conditions %s not found. 1204 LibertyReader.cc:2249 scaled_cell cell %s has not been defined.
1203 LibertyReader.cc:2236 scaled_cell missing operating condition. 1205 LibertyReader.cc:2252 scaled_cell missing name.
1204 LibertyReader.cc:2239 scaled_cell cell %s has not been defined. 1206 LibertyReader.cc:2278 scaled_cell %s, %s port functions do not match cell port functions.
1205 LibertyReader.cc:2242 scaled_cell missing name. 1207 LibertyReader.cc:2283 scaled_cell ports do not match cell ports.
1206 LibertyReader.cc:2268 scaled_cell %s, %s port functions do not match cell port functions. 1208 LibertyReader.cc:2285 scaled_cell %s, %s timing does not match cell timing.
1207 LibertyReader.cc:2273 scaled_cell ports do not match cell ports. 1209 LibertyReader.cc:2304 combinational timing to an input port.
1208 LibertyReader.cc:2275 scaled_cell %s, %s timing does not match cell timing. 1210 LibertyReader.cc:2399 missing %s_transition.
1209 LibertyReader.cc:2294 combinational timing to an input port. 1211 LibertyReader.cc:2401 missing cell_%s.
1210 LibertyReader.cc:2389 missing %s_transition. 1212 LibertyReader.cc:2422 timing group from output port.
1211 LibertyReader.cc:2391 missing cell_%s. 1213 LibertyReader.cc:2432 timing group from output port.
1212 LibertyReader.cc:2412 timing group from output port. 1214 LibertyReader.cc:2442 timing group from output port.
1213 LibertyReader.cc:2422 timing group from output port. 1215 LibertyReader.cc:2477 timing group from output port.
1214 LibertyReader.cc:2432 timing group from output port. 1217 LibertyReader.cc:2487 timing group from output port.
1215 LibertyReader.cc:2467 timing group from output port. 1218 LibertyReader.cc:2588 receiver_capacitance group not in timing or pin group.
1217 LibertyReader.cc:2477 timing group from output port. 1219 LibertyReader.cc:2606 unsupported model axis.
1218 LibertyReader.cc:2578 receiver_capacitance group not in timing or pin group. 1220 LibertyReader.cc:2634 output_current_%s group not in timing group.
1219 LibertyReader.cc:2596 unsupported model axis. 1221 LibertyReader.cc:2676 output current waveform %.2e %.2e not found.
1220 LibertyReader.cc:2624 output_current_%s group not in timing group. 1222 LibertyReader.cc:2697 unsupported model axis.
1221 LibertyReader.cc:2666 output current waveform %.2e %.2e not found. 1223 LibertyReader.cc:2739 vector index_1 and index_2 must have exactly one value.
1222 LibertyReader.cc:2687 unsupported model axis. 1224 LibertyReader.cc:2741 vector reference_time not found.
1223 LibertyReader.cc:2729 vector index_1 and index_2 must have exactly one value. 1225 LibertyReader.cc:2774 normalized_driver_waveform variable_2 must be normalized_voltage
1224 LibertyReader.cc:2731 vector reference_time not found. 1226 LibertyReader.cc:2777 normalized_driver_waveform variable_1 must be input_net_transition
1225 LibertyReader.cc:2764 normalized_driver_waveform variable_2 must be normalized_voltage 1228 LibertyReader.cc:2999 level_shifter_type must be HL, LH, or HL_LH
1226 LibertyReader.cc:2767 normalized_driver_waveform variable_1 must be input_net_transition 1229 LibertyReader.cc:3035 switch_cell_type must be coarse_grain or fine_grain
1228 LibertyReader.cc:2989 level_shifter_type must be HL, LH, or HL_LH 1230 LibertyReader.cc:3059 scaling_factors %s not found.
1229 LibertyReader.cc:3025 switch_cell_type must be coarse_grain or fine_grain 1231 LibertyReader.cc:3120 pin name is not a string.
1230 LibertyReader.cc:3049 scaling_factors %s not found. 1232 LibertyReader.cc:3137 pin name is not a string.
1231 LibertyReader.cc:3100 pin name is not a string. 1233 LibertyReader.cc:3151 pin name is not a string.
1232 LibertyReader.cc:3117 pin name is not a string. 1234 LibertyReader.cc:3229 bus %s bus_type not found.
1233 LibertyReader.cc:3131 pin name is not a string. 1235 LibertyReader.cc:3281 bus_type %s not found.
1234 LibertyReader.cc:3209 bus %s bus_type not found. 1236 LibertyReader.cc:3284 bus_type is not a string.
1235 LibertyReader.cc:3261 bus_type %s not found. 1237 LibertyReader.cc:3302 bundle %s member not found.
1236 LibertyReader.cc:3264 bus_type is not a string. 1238 LibertyReader.cc:3325 member is not a string.
1237 LibertyReader.cc:3282 bundle %s member not found. 1239 LibertyReader.cc:3332 members attribute is missing values.
1238 LibertyReader.cc:3305 member is not a string. 1240 LibertyReader.cc:3383 unknown port direction.
1239 LibertyReader.cc:3312 members attribute is missing values. 1241 LibertyReader.cc:3630 max_transition is 0.0.
1240 LibertyReader.cc:3363 unknown port direction. 1242 LibertyReader.cc:3736 pulse_latch unknown pulse type.
1241 LibertyReader.cc:3610 max_transition is 0.0. 1243 LibertyReader.cc:4155 timing group missing related_pin/related_bus_pin.
1242 LibertyReader.cc:3716 pulse_latch unknown pulse type. 1244 LibertyReader.cc:4254 unknown timing_type %s.
1243 LibertyReader.cc:4134 timing group missing related_pin/related_bus_pin. 1245 LibertyReader.cc:4274 unknown timing_sense %s.
1244 LibertyReader.cc:4233 unknown timing_type %s. 1246 LibertyReader.cc:4314 mode value is not a string.
1245 LibertyReader.cc:4253 unknown timing_sense %s. 1247 LibertyReader.cc:4317 missing mode value.
1246 LibertyReader.cc:4293 mode value is not a string. 1248 LibertyReader.cc:4320 mode name is not a string.
1247 LibertyReader.cc:4296 missing mode value. 1249 LibertyReader.cc:4323 mode missing values.
1248 LibertyReader.cc:4299 mode name is not a string. 1250 LibertyReader.cc:4326 mode missing mode name and value.
1249 LibertyReader.cc:4302 mode missing values. 1251 LibertyReader.cc:4402 unsupported model axis.
1250 LibertyReader.cc:4305 mode missing mode name and value. 1252 LibertyReader.cc:4429 unsupported model axis.
1251 LibertyReader.cc:4381 unsupported model axis. 1253 LibertyReader.cc:4458 unsupported model axis.
1252 LibertyReader.cc:4408 unsupported model axis. 1254 LibertyReader.cc:4493 unsupported model axis.
1253 LibertyReader.cc:4437 unsupported model axis. 1255 LibertyReader.cc:4509 %s group not in timing group.
1254 LibertyReader.cc:4472 unsupported model axis. 1256 LibertyReader.cc:4548 table template %s not found.
1255 LibertyReader.cc:4488 %s group not in timing group. 1257 LibertyReader.cc:4632 %s is missing values.
1256 LibertyReader.cc:4527 table template %s not found. 1258 LibertyReader.cc:4655 %s is not a list of floats.
1257 LibertyReader.cc:4611 %s is missing values. 1259 LibertyReader.cc:4657 table row has %u columns but axis has %d.
1258 LibertyReader.cc:4634 %s is not a list of floats. 1260 LibertyReader.cc:4667 table has %u rows but axis has %d.
1259 LibertyReader.cc:4636 table row has %u columns but axis has %d. 1261 LibertyReader.cc:4718 lut output is not a string.
1260 LibertyReader.cc:4646 table has %u rows but axis has %d. 1262 LibertyReader.cc:4734 cell %s test_cell redefinition.
1261 LibertyReader.cc:4697 lut output is not a string. 1263 LibertyReader.cc:4773 mode definition missing name.
1262 LibertyReader.cc:4714 cell %s test_cell redefinition. 1264 LibertyReader.cc:4790 mode value missing name.
1263 LibertyReader.cc:4739 mode definition missing name. 1265 LibertyReader.cc:4804 when attribute inside table model.
1264 LibertyReader.cc:4756 mode value missing name. 1266 LibertyReader.cc:4853 %s attribute is not a string.
1265 LibertyReader.cc:4770 when attribute inside table model. 1267 LibertyReader.cc:4856 %s is not a simple attribute.
1266 LibertyReader.cc:4819 %s attribute is not a string. 1268 LibertyReader.cc:4876 %s attribute is not an integer.
1267 LibertyReader.cc:4822 %s is not a simple attribute. 1269 LibertyReader.cc:4879 %s is not a simple attribute.
1268 LibertyReader.cc:4842 %s attribute is not an integer. 1270 LibertyReader.cc:4892 %s is not a simple attribute.
1269 LibertyReader.cc:4845 %s is not a simple attribute. 1271 LibertyReader.cc:4918 %s value %s is not a float.
1270 LibertyReader.cc:4858 %s is not a simple attribute. 1272 LibertyReader.cc:4947 %s missing values.
1271 LibertyReader.cc:4884 %s value %s is not a float. 1273 LibertyReader.cc:4951 %s missing values.
1272 LibertyReader.cc:4913 %s missing values. 1274 LibertyReader.cc:4954 %s is not a complex attribute.
1273 LibertyReader.cc:4917 %s missing values. 1275 LibertyReader.cc:4980 %s is not a float.
1274 LibertyReader.cc:4920 %s is not a complex attribute. 1276 LibertyReader.cc:5003 %s is missing values.
1275 LibertyReader.cc:4946 %s is not a float. 1277 LibertyReader.cc:5006 %s has more than one string.
1276 LibertyReader.cc:4969 %s is missing values. 1278 LibertyReader.cc:5015 %s is missing values.
1277 LibertyReader.cc:4972 %s has more than one string. 1279 LibertyReader.cc:5040 %s attribute is not boolean.
1278 LibertyReader.cc:4981 %s is missing values. 1280 LibertyReader.cc:5043 %s attribute is not boolean.
1279 LibertyReader.cc:5006 %s attribute is not boolean. 1281 LibertyReader.cc:5046 %s is not a simple attribute.
1280 LibertyReader.cc:5009 %s attribute is not boolean. 1282 LibertyReader.cc:5062 attribute %s value %s not recognized.
1281 LibertyReader.cc:5012 %s is not a simple attribute. 1283 LibertyReader.cc:5093 unknown early/late value.
1282 LibertyReader.cc:5028 attribute %s value %s not recognized. 1284 LibertyReader.cc:5313 OCV derate group named %s not found.
1283 LibertyReader.cc:5059 unknown early/late value. 1285 LibertyReader.cc:5329 ocv_derate missing name.
1284 LibertyReader.cc:5279 OCV derate group named %s not found. 1286 LibertyReader.cc:5382 unknown rise/fall.
1285 LibertyReader.cc:5295 ocv_derate missing name. 1287 LibertyReader.cc:5402 unknown derate type.
1286 LibertyReader.cc:5348 unknown rise/fall. 1288 LibertyReader.cc:5434 unsupported model axis.
1287 LibertyReader.cc:5368 unknown derate type. 1289 LibertyReader.cc:5466 unsupported model axis.
1288 LibertyReader.cc:5400 unsupported model axis. 1290 LibertyReader.cc:5498 unsupported model axis.
1289 LibertyReader.cc:5432 unsupported model axis. 1291 LibertyReader.cc:5569 unknown pg_type.
1290 LibertyReader.cc:5464 unsupported model axis. 1292 LibertyReader.cc:5983 port %s subscript out of range.
1291 LibertyReader.cc:5535 unknown pg_type. 1293 LibertyReader.cc:5987 port range %s of non-bus port %s.
1292 LibertyReader.cc:5949 port %s subscript out of range. 1294 LibertyReader.cc:6001 port %s not found.
1293 LibertyReader.cc:5953 port range %s of non-bus port %s. 1295 LibertyReader.cc:6071 port %s not found.
1294 LibertyReader.cc:5967 port %s not found. 1297 LibertyReader.cc:1446 axis type %s not supported.
1295 LibertyReader.cc:6037 port %s not found. 1298 LibertyReader.cc:2160 statetable input port %s not found.
1297 LibertyReader.cc:1437 axis type %s not supported. 1299 LibertyReader.cc:3785 unknown signal_type %s.
1330 LibertyWriter.cc:300 %s/%s bundled ports not supported. 1300 LibertyReader.cc:4029 table row must have 3 groups separated by ':'.
1331 LibertyWriter.cc:448 %s/%s/%s timing model not supported. 1301 LibertyReader.cc:4034 table row has %zu input values but %zu are required.
1332 LibertyWriter.cc:468 3 axis table models not supported. 1302 LibertyReader.cc:4041 table row has %zu current values but %zu are required.
1333 LibertyWriter.cc:617 %s/%s/%s timing arc type %s not supported. 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 1350 LumpedCapDelayCalc.cc:138 gate delay input variable is NaN
1355 MakeTimingModel.cc:227 clock %s pin %s is inside model block. 1355 MakeTimingModel.cc:227 clock %s pin %s is inside model block.
1360 Vcd.cc:172 Unknown variable %s ID %s 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. 1398 VerilogReader.cc:1860 %s is not a verilog module.
1399 VerilogReader.cc:1865 %s is not a verilog module. 1399 VerilogReader.cc:1865 %s is not a verilog module.
1400 PathVertex.cc:236 missing arrivals. 1400 PathVertex.cc:236 missing arrivals.
@ -508,16 +500,16 @@ Warning: 304 duplicated
1525 SpefParse.yy:805 %d is not positive. 1525 SpefParse.yy:805 %d is not positive.
1526 SpefParse.yy:814 %.4f is not positive. 1526 SpefParse.yy:814 %.4f is not positive.
1527 SpefParse.yy:820 %.4f is not positive. 1527 SpefParse.yy:820 %.4f is not positive.
1550 Sta.cc:2005 '%s' is not a valid start point. 1550 Sta.cc:1999 '%s' is not a valid start point.
1551 Sta.cc:2078 '%s' is not a valid endpoint. 1551 Sta.cc:2072 '%s' is not a valid endpoint.
1552 Sta.cc:2081 '%s' is not a valid endpoint. 1552 Sta.cc:2075 '%s' is not a valid endpoint.
1553 Sta.cc:2397 maximum corner count exceeded 1553 Sta.cc:2391 maximum corner count exceeded
1554 Sta.cc:2002 '%s' is not a valid start point. 1554 Sta.cc:1996 '%s' is not a valid start point.
1570 Search.i:54 no network has been linked. 1570 Search.i:54 no network has been linked.
1571 Search.i:68 network does not support edits. 1571 Search.i:68 network does not support edits.
1574 Search.i:1118 POCV support requires compilation with SSTA=1. 1574 Search.i:1120 POCV support requires compilation with SSTA=1.
1575 Search.i:527 unknown report path field %s 1575 Search.i:529 unknown report path field %s
1576 Search.i:539 unknown report path field %s 1576 Search.i:541 unknown report path field %s
1600 WritePathSpice.cc:165 No liberty libraries found, 1600 WritePathSpice.cc:165 No liberty libraries found,
1602 WriteSpice.cc:458 Liberty pg_port %s/%s missing voltage_name attribute, 1602 WriteSpice.cc:458 Liberty pg_port %s/%s missing voltage_name attribute,
1603 WriteSpice.cc:428 %s pg_port %s not found, 1603 WriteSpice.cc:428 %s pg_port %s not found,

View File

@ -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 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 }; enum class ScaleFactorPvt { process, volt, temp, unknown };
constexpr int scale_factor_pvt_count = int(ScaleFactorPvt::unknown) + 1; constexpr int scale_factor_pvt_count = int(ScaleFactorPvt::unknown) + 1;
@ -691,6 +694,8 @@ public:
LibertyPort *findLibertyBusBit(int index) const; LibertyPort *findLibertyBusBit(int index) const;
BusDcl *busDcl() const { return bus_dcl_; } BusDcl *busDcl() const { return bus_dcl_; }
void setDirection(PortDirection *dir); void setDirection(PortDirection *dir);
ScanSignalType scanSignalType() const { return scan_signal_type_; }
void setScanSignalType(ScanSignalType type);
void fanoutLoad(// Return values. void fanoutLoad(// Return values.
float &fanout_load, float &fanout_load,
bool &exists) const; bool &exists) const;
@ -861,6 +866,7 @@ protected:
LibertyCell *liberty_cell_; LibertyCell *liberty_cell_;
BusDcl *bus_dcl_; BusDcl *bus_dcl_;
FuncExpr *function_; FuncExpr *function_;
ScanSignalType scan_signal_type_;
FuncExpr *tristate_enable_; FuncExpr *tristate_enable_;
ScaledPortMap *scaled_ports_; ScaledPortMap *scaled_ports_;
RiseFallMinMax capacitance_; RiseFallMinMax capacitance_;
@ -1080,32 +1086,14 @@ protected:
TableAxisPtr axis3_; TableAxisPtr axis3_;
}; };
class TestCell class TestCell : public LibertyCell
{ {
public: public:
TestCell(); TestCell(LibertyLibrary *library,
TestCell(LibertyPort *data_in, const char *name,
LibertyPort *scan_in, const char *filename);
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);
protected: protected:
LibertyPort *data_in_;
LibertyPort *scan_in_;
LibertyPort *scan_enable_;
LibertyPort *scan_out_;
LibertyPort *scan_out_inv_;
}; };
class OcvDerate class OcvDerate

View File

@ -36,7 +36,6 @@ class OperatingConditions;
class BusDcl; class BusDcl;
class ModeDef; class ModeDef;
class ModeValueDef; class ModeValueDef;
class TestCell;
class TableTemplate; class TableTemplate;
class Table; class Table;
class TableModel; class TableModel;

View File

@ -2075,6 +2075,7 @@ LibertyPort::LibertyPort(LibertyCell *cell,
liberty_cell_(cell), liberty_cell_(cell),
bus_dcl_(bus_dcl), bus_dcl_(bus_dcl),
function_(nullptr), function_(nullptr),
scan_signal_type_(ScanSignalType::none),
tristate_enable_(nullptr), tristate_enable_(nullptr),
scaled_ports_(nullptr), scaled_ports_(nullptr),
fanout_load_(0.0), fanout_load_(0.0),
@ -2132,6 +2133,12 @@ LibertyPort::setDirection(PortDirection *dir)
liberty_cell_->setHasInternalPorts(true); liberty_cell_->setHasInternalPorts(true);
} }
void
LibertyPort::setScanSignalType(ScanSignalType type)
{
scan_signal_type_ = type;
}
LibertyPort * LibertyPort *
LibertyPort::findLibertyMember(int index) const LibertyPort::findLibertyMember(int index) const
{ {
@ -3152,58 +3159,13 @@ ScaleFactors::print()
} }
} }
TestCell::TestCell(LibertyPort *data_in, TestCell::TestCell(LibertyLibrary *library,
LibertyPort *scan_in, const char *name,
LibertyPort *scan_enable, const char *filename) :
LibertyPort *scan_out, LibertyCell(library, name, filename)
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)
{
scan_out_inv_ = port;
}
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
OcvDerate::OcvDerate(const char *name) : OcvDerate::OcvDerate(const char *name) :

View File

@ -294,6 +294,8 @@ ensure_voltage_waveforms()
self->ensureVoltageWaveforms(dcalc_aps); self->ensureVoltageWaveforms(dcalc_aps);
} }
LibertyCell *test_cell() { return self->testCell(); }
} // LibertyCell methods } // LibertyCell methods
%extend LibertyPort { %extend LibertyPort {

View File

@ -70,7 +70,7 @@ HNAME ({PIN_NAME}|{BUS_NAME}|{MIXED_NAME})([\/.]({PIN_NAME}|{BUS_NAME}|{MIXED_NA
/* default_operating_conditions : slow_100_3.00 ; */ /* default_operating_conditions : slow_100_3.00 ; */
/* revision : 1.0.17; */ /* revision : 1.0.17; */
/* default_wire_load : xc2v250-5_avg; */ /* default_wire_load : xc2v250-5_avg; */
TOKEN ({ALPHA}|{DIGIT}|_)({ALPHA}|{DIGIT}|[._\-])* TOKEN ({ALPHA}|{DIGIT}|_)({ALPHA}|{DIGIT}|[._\-])*(:({ALPHA}|{DIGIT}|_)+)?
/* bus_naming_style : %s[%d] ; */ /* bus_naming_style : %s[%d] ; */
BUS_STYLE "%s"{BUS_LEFT}"%d"{BUS_RIGHT} BUS_STYLE "%s"{BUS_LEFT}"%d"{BUS_RIGHT}
PUNCTUATION [,\:;|(){}+*&!'=] PUNCTUATION [,\:;|(){}+*&!'=]

View File

@ -57,41 +57,21 @@ readLibertyFile(const char *filename,
bool infer_latches, bool infer_latches,
Network *network) Network *network)
{ {
LibertyReader reader; LibertyReader reader(filename, infer_latches, network);
return reader.readLibertyFile(filename, infer_latches, network); return reader.readLibertyFile(filename);
} }
LibertyReader::LibertyReader() : LibertyReader::LibertyReader(const char *filename,
bool infer_latches,
Network *network) :
LibertyGroupVisitor() LibertyGroupVisitor()
{ {
init(filename, infer_latches, network);
defineVisitors(); defineVisitors();
} }
LibertyReader::~LibertyReader() void
{ LibertyReader::init(const char *filename,
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, bool infer_latches,
Network *network) Network *network)
{ {
@ -146,7 +126,34 @@ LibertyReader::readLibertyFile(const char *filename,
have_slew_lower_threshold_[rf_index] = false; have_slew_lower_threshold_[rf_index] = false;
have_slew_upper_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; //::LibertyParse_debug = 1;
parseLibertyFile(filename, this, report_); parseLibertyFile(filename, this, report_);
return library_; return library_;
@ -905,10 +912,10 @@ LibertyReader::visitDelayModel(LibertyAttr *attr)
// Evil IBM garbage. // Evil IBM garbage.
else if (stringEq(type_name, "dcm")) { else if (stringEq(type_name, "dcm")) {
library_->setDelayModelType(DelayModelType::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 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) if (port)
input_ports.push_back(port); input_ports.push_back(port);
else else
libWarn(0000, statetable_->line(), "statetable input port %s not found.", libWarn(1298, statetable_->line(), "statetable input port %s not found.",
input.c_str()); input.c_str());
} }
LibertyPortSeq internal_ports; LibertyPortSeq internal_ports;
@ -3291,7 +3298,7 @@ void
LibertyReader::endBundle(LibertyGroup *group) LibertyReader::endBundle(LibertyGroup *group)
{ {
if (cell_) { if (cell_) {
if (ports_->empty()) if (ports_ && ports_->empty())
libWarn(1237, group, "bundle %s member not found.", group->firstName()); libWarn(1237, group, "bundle %s member not found.", group->firstName());
endBusOrBundle(); endBusOrBundle();
in_bundle_ = false; in_bundle_ = false;
@ -3762,17 +3769,34 @@ LibertyReader::visitIsPllFeedbackPin(LibertyAttr *attr)
void void
LibertyReader::visitSignalType(LibertyAttr *attr) LibertyReader::visitSignalType(LibertyAttr *attr)
{ {
if (test_cell_) { if (test_cell_ && port_) {
const char *type = getAttrString(attr); const char *type = getAttrString(attr);
if (type) { if (type) {
ScanSignalType signal_type = ScanSignalType::none;
if (stringEq(type, "test_scan_enable")) if (stringEq(type, "test_scan_enable"))
test_cell_->setScanEnable(port_); signal_type = ScanSignalType::enable;
if (stringEq(type, "test_scan_in")) else if (stringEq(type, "test_scan_enable_inverted"))
test_cell_->setScanIn(port_); signal_type = ScanSignalType::enable_inverted;
if (stringEq(type, "test_scan_out")) else if (stringEq(type, "test_scan_clock"))
test_cell_->setScanOut(port_); signal_type = ScanSignalType::clock;
if (stringEq(type, "test_scan_out_inverted")) else if (stringEq(type, "test_scan_clock_a"))
test_cell_->setScanOutInv(port_); 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) if (func)
sequential_->setData(stringCopy(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 void
@ -4018,26 +4036,26 @@ LibertyReader::visitTable(LibertyAttr *attr)
for (string row : table_rows) { for (string row : table_rows) {
StdStringSeq row_groups = parseTokenList(row.c_str(), ':'); StdStringSeq row_groups = parseTokenList(row.c_str(), ':');
if (row_groups.size() != 3) { 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; break;
} }
StdStringSeq inputs = parseTokenList(row_groups[0].c_str(), ' '); StdStringSeq inputs = parseTokenList(row_groups[0].c_str(), ' ');
if (inputs.size() != input_count) { 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(), inputs.size(),
input_count); input_count);
break; break;
} }
StdStringSeq currents = parseTokenList(row_groups[1].c_str(), ' '); StdStringSeq currents = parseTokenList(row_groups[1].c_str(), ' ');
if (currents.size() != internal_count) { 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(), currents.size(),
internal_count); internal_count);
break; break;
} }
StdStringSeq nexts = parseTokenList(row_groups[2].c_str(), ' '); StdStringSeq nexts = parseTokenList(row_groups[2].c_str(), ' ');
if (nexts.size() != internal_count) { 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(), nexts.size(),
internal_count); internal_count);
break; break;
@ -4083,7 +4101,7 @@ LibertyReader::parseStateInputValues(StdStringSeq &inputs,
StateInputValue value; StateInputValue value;
state_input_value_name_map.find(input.c_str(), value, exists); state_input_value_name_map.find(input.c_str(), value, exists);
if (!exists) { if (!exists) {
libWarn(0000, attr, "table input value '%s' not recognized.", libWarn(1304, attr, "table input value '%s' not recognized.",
input.c_str()); input.c_str());
value = StateInputValue::dont_care; value = StateInputValue::dont_care;
} }
@ -4102,7 +4120,7 @@ LibertyReader::parseStateInternalValues(StdStringSeq &states,
StateInternalValue value; StateInternalValue value;
state_internal_value_name_map.find(state.c_str(), value, exists); state_internal_value_name_map.find(state.c_str(), value, exists);
if (!exists) { if (!exists) {
libWarn(0000, attr, "table internal value '%s' not recognized.", libWarn(1305, attr, "table internal value '%s' not recognized.",
state.c_str()); state.c_str());
value = StateInternalValue::unknown; value = StateInternalValue::unknown;
} }
@ -4719,25 +4737,47 @@ LibertyReader::endLut(LibertyGroup *)
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
// Find scan ports in test_cell group.
void void
LibertyReader::beginTestCell(LibertyGroup *group) LibertyReader::beginTestCell(LibertyGroup *group)
{ {
if (cell_ && cell_->testCell()) if (cell_ && cell_->testCell())
libWarn(1262, group, "cell %s test_cell redefinition.", cell_->name()); libWarn(1262, group, "cell %s test_cell redefinition.", cell_->name());
else { 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_); 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_; 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 void
LibertyReader::endTestCell(LibertyGroup *) 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_; cell_ = save_cell_;
test_cell_ = nullptr; test_cell_ = nullptr;
save_statetable_ = nullptr;
} }
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////

View File

@ -69,9 +69,12 @@ typedef vector<string> StdStringSeq;
class LibertyReader : public LibertyGroupVisitor class LibertyReader : public LibertyGroupVisitor
{ {
public: public:
explicit LibertyReader(); LibertyReader(const char *filename,
bool infer_latches,
Network *network);
virtual ~LibertyReader(); virtual ~LibertyReader();
virtual LibertyLibrary *readLibertyFile(const char *filename, virtual LibertyLibrary *readLibertyFile(const char *filename);
virtual void init(const char *filename,
bool infer_latches, bool infer_latches,
Network *network); Network *network);
LibertyLibrary *library() const { return library_; } LibertyLibrary *library() const { return library_; }
@ -608,9 +611,7 @@ protected:
bool have_slew_upper_threshold_[RiseFall::index_count]; bool have_slew_upper_threshold_[RiseFall::index_count];
TableTemplate *tbl_template_; TableTemplate *tbl_template_;
LibertyCell *cell_; LibertyCell *cell_;
LibertyCell *save_cell_;
LibertyCell *scaled_cell_owner_; LibertyCell *scaled_cell_owner_;
TestCell *test_cell_;
const char *ocv_derate_name_; const char *ocv_derate_name_;
PortGroupSeq cell_port_groups_; PortGroupSeq cell_port_groups_;
OperatingConditions *op_cond_; OperatingConditions *op_cond_;
@ -666,6 +667,14 @@ protected:
bool reference_time_exists_; bool reference_time_exists_;
const char *driver_waveform_name_; 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_ = '\\'; static constexpr char escape_ = '\\';
private: private:

View File

@ -304,7 +304,7 @@ LibertyWriter::writeCell(const LibertyCell *cell)
if (port->isBus()) if (port->isBus())
writeBusPort(port); writeBusPort(port);
else if (port->isBundle()) else if (port->isBundle())
report_->error(1330, "%s/%s bundled ports not supported.", report_->error(1340, "%s/%s bundled ports not supported.",
library_->name(), library_->name(),
cell->name()); cell->name());
else else
@ -452,7 +452,7 @@ LibertyWriter::writeTimingModels(const TimingArc *arc,
fprintf(stream_, " }\n"); fprintf(stream_, " }\n");
} }
else else
report_->error(1331, "%s/%s/%s timing model not supported.", report_->error(1341, "%s/%s/%s timing model not supported.",
library_->name(), library_->name(),
arc->from()->libertyCell()->name(), arc->from()->libertyCell()->name(),
arc->from()->name()); arc->from()->name());
@ -472,7 +472,7 @@ LibertyWriter::writeTableModel(const TableModel *model)
writeTableModel2(model); writeTableModel2(model);
break; break;
case 3: case 3:
report_->error(1332, "3 axis table models not supported."); report_->error(1342, "3 axis table models not supported.");
break; break;
} }
} }
@ -621,7 +621,7 @@ LibertyWriter::timingTypeString(const TimingArcSet *arc_set)
else if (role == TimingRole::width()) else if (role == TimingRole::width())
return "min_pulse_width"; return "min_pulse_width";
else { 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(), library_->name(),
arc_set->to()->libertyCell()->name(), arc_set->to()->libertyCell()->name(),
arc_set->to()->name(), arc_set->to()->name(),

View File

@ -283,7 +283,7 @@ proc read_power_activities { args } {
if { [info exists keys(-scope)] } { if { [info exists keys(-scope)] } {
set scope $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 read_vcd_file $filename $scope
} }

View File

@ -824,9 +824,7 @@ Sim::annotateVertexEdges(const Instance *inst,
pin, network_,sim_) pin, network_,sim_)
// Disable mode conditional timing // Disable mode conditional timing
// edges based on constant pins. // edges based on constant pins.
|| isModeDisabled(edge,inst,network_,sim_) || isModeDisabled(edge,inst,network_,sim_);
|| isTestDisabled(inst, from_pin, pin,
network_, sim_);
} }
bool disables_changed = false; bool disables_changed = false;
if (sense != edge->simTimingSense()) { 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 } // namespace

View File

@ -183,23 +183,4 @@ isModeDisabled(Edge *edge,
bool &is_disabled, bool &is_disabled,
FuncExpr *&disable_cond); 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 } // namespace

View File

@ -1649,7 +1649,6 @@ Sta::isDisabledConstant(Edge *edge)
|| (!role->isWire() || (!role->isWire()
&& (isCondDisabled(edge, inst, from_pin, to_pin, network_, sim_) && (isCondDisabled(edge, inst, from_pin, to_pin, network_, sim_)
|| isModeDisabled(edge, inst, network_, sim_) || isModeDisabled(edge, inst, network_, sim_)
|| isTestDisabled(inst, from_pin, to_pin, network_, sim_)
|| hasDisabledArcs(edge, graph_))); || hasDisabledArcs(edge, graph_)));
} }
@ -1704,11 +1703,6 @@ Sta::disabledConstantPins(Edge *edge)
is_disabled, disable_cond); is_disabled, disable_cond);
if (is_disabled) if (is_disabled)
exprConstantPins(disable_cond, inst, pins); 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_)) { if (hasDisabledArcs(edge, graph_)) {
LibertyPort *to_port = network_->libertyPort(to_pin); LibertyPort *to_port = network_->libertyPort(to_pin);
if (to_port) { if (to_port) {