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
|
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.
|
||||||
|
|
|
||||||
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.
|
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,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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) :
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 [,\:;|(){}+*&!'=]
|
||||||
|
|
|
||||||
|
|
@ -57,43 +57,23 @@ 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_) {
|
bool infer_latches,
|
||||||
LibertyVariableMap::Iterator iter(var_map_);
|
Network *network)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
filename_ = filename;
|
filename_ = filename;
|
||||||
infer_latches_ = infer_latches;
|
infer_latches_ = infer_latches;
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
|
||||||
|
|
@ -69,11 +69,14 @@ 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);
|
||||||
bool infer_latches,
|
virtual void init(const char *filename,
|
||||||
Network *network);
|
bool infer_latches,
|
||||||
|
Network *network);
|
||||||
LibertyLibrary *library() const { return library_; }
|
LibertyLibrary *library() const { return library_; }
|
||||||
virtual bool save(LibertyGroup *) { return false; }
|
virtual bool save(LibertyGroup *) { return false; }
|
||||||
virtual bool save(LibertyAttr *) { return false; }
|
virtual bool save(LibertyAttr *) { return false; }
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue