diff --git a/sky130_cds/DISCLAIMER b/sky130_cds/DISCLAIMER new file mode 100755 index 000000000..a291851e2 --- /dev/null +++ b/sky130_cds/DISCLAIMER @@ -0,0 +1,9 @@ +You are advised that by using this repository at your own risk. By +using the PDK, you assume all liability for any resulting errors and +problems. + +Oklahoma State University, 2022 +James Stine +Rachana Erra + + diff --git a/sky130_cds/DRC/README.md b/sky130_cds/DRC/README.md new file mode 100755 index 000000000..e69de29bb diff --git a/sky130_cds/DRC/sky130_drcRules.pvl b/sky130_cds/DRC/sky130_drcRules.pvl new file mode 100755 index 000000000..fbe6504e0 --- /dev/null +++ b/sky130_cds/DRC/sky130_drcRules.pvl @@ -0,0 +1,420 @@ + +incr_conn YES +results_db -drc mult_seq.drc_errors.ascii -ascii + +/// Tolerance for round-off errors on skew edges +tolerance 0.001 + +/// Unused MaskLayers: (FOM DNM NWM HVTRM TUNM ONOM LVOM P1M NPCM LDNTM NSDM PSDM LICM1 LI1M CTM1 MM1 VIM MM2 VIM2 MM3 VIM3 MM4 VIM4 MM5 NSM PDM PBO RPM CU1M PMM2) +layer_def nwell 1000 +layer_map 64 -datatype 20 1000 // nwell drawing + +layer_def diff 1001 +layer_map 65 -datatype 20 1001 // diff drawing + +layer_def poly 1008 +layer_map 66 -datatype 20 1008 // poly drawing + +layer_def licon1 1012 +layer_map 66 -datatype 44 1012 // licon1 drawing + +layer_def li1 1013 +layer_map 67 -datatype 20 1013 // li1 drawing + +layer_def mcon 1014 +layer_map 67 -datatype 44 1014 // mcon drawing + +layer_def met1 1015 +layer_map 68 -datatype 20 1015 // met1 drawing + +layer_def via 1016 +layer_map 68 -datatype 44 1016 // via drawing + +layer_def met2 1017 +layer_map 69 -datatype 20 1017 // met2 drawing + +layer_def via2 1019 +layer_map 69 -datatype 44 1019 // via2 drawing + +layer_def met3 1020 +layer_map 70 -datatype 20 1020 // met3 drawing + +layer_def via3 1021 +layer_map 70 -datatype 44 1021 // via3 drawing + +layer_def met4 1022 +layer_map 71 -datatype 20 1022 // met4 drawing + +layer_def via4 1023 +layer_map 71 -datatype 44 1023 // via4 drawing + +layer_def met5 1024 +layer_map 72 -datatype 20 1024 // met5 drawing + +layer_def pad 1026 +layer_map 76 -datatype 20 1026 // pad drawing + +layer_def capacitor 1031 +layer_map 82 -datatype 64 1031 // capacitor drawing + +layer_def inductor 1034 +layer_map 82 -datatype 24 1034 // inductor drawing + +layer_def polyGate 1074 +layer_map 66 -datatype 9 1074 // poly gate + +layer_def padText 1089 +layer_map 76 -texttype 5 1089 // pad label + +layer_def diffLabel 1090 +layer_map 65 -datatype 6 1090 // diff label + +layer_def nwellLabel 1092 +layer_map 64 -datatype 5 1092 // nwell label + +layer_def polyLabel 1093 +layer_map 66 -datatype 5 1093 // poly label + +layer_def met1Label 1094 +layer_map 68 -datatype 5 1094 // met1 label + +layer_def met2Label 1095 +layer_map 69 -datatype 5 1095 // met2 label + +layer_def met3Label 1096 +layer_map 70 -datatype 5 1096 // met3 label + +layer_def met4Label 1097 +layer_map 71 -datatype 5 1097 // met4 label + +layer_def met5Label 1098 +layer_map 72 -datatype 5 1098 // met5 label + +layer_def li1Block 1099 +layer_map 67 -datatype 10 1099 // li1 blockage + +layer_def met1Block 1100 +layer_map 68 -datatype 10 1100 // met1 blockage + +layer_def met2Block 1101 +layer_map 69 -datatype 10 1101 // met2 blockage + +layer_def met3Block 1102 +layer_map 70 -datatype 10 1102 // met3 blockage + +layer_def met4Block 1103 +layer_map 71 -datatype 10 1103 // met4 blockage + +layer_def met5Block 1104 +layer_map 72 -datatype 10 1104 // met5 blockage + +layer_def diffBndry 1106 +layer_map 65 -datatype 4 1106 // diff boundary + +layer_def mconBndry 1108 +layer_map 67 -datatype 60 1108 // mcon boundary + +layer_def polyBndry 1109 +layer_map 66 -datatype 4 1109 // poly boundary + +layer_def viaBndry 1110 +layer_map 68 -datatype 60 1110 // via boundary + +layer_def via2Bndry 1111 +layer_map 69 -datatype 60 1111 // via2 boundary + +layer_def via3Bndry 1112 +layer_map 70 -datatype 60 1112 // via3 boundary + +layer_def via4Bndry 1113 +layer_map 71 -datatype 60 1113 // via4 boundary + +layer_def li1tt 1114 1115 1116 1117 +layer_map 67 -texttype 20 1114 // li1 drawing +layer_map 67 -texttype 5 1115 // li1 label +layer_map 67 -texttype 23 1116 // li1 net +layer_map 67 -texttype 16 1117 // li1 pin + +layer_def met1tt 1118 1119 1120 1121 +layer_map 68 -texttype 20 1118 // met1 drawing +layer_map 68 -texttype 5 1119 // met1 label +layer_map 68 -texttype 23 1120 // met1 net +layer_map 68 -texttype 16 1121 // met1 pin + +layer_def met2tt 1122 1123 1124 1125 +layer_map 69 -texttype 20 1122 // met2 drawing +layer_map 69 -texttype 5 1123 // met2 label +layer_map 69 -texttype 23 1124 // met2 net +layer_map 69 -texttype 16 1125 // met2 pin + +layer_def met3tt 1126 1127 1128 1129 +layer_map 70 -texttype 20 1126 // met3 drawing +layer_map 70 -texttype 5 1127 // met3 label +layer_map 70 -texttype 23 1128 // met3 net +layer_map 70 -texttype 16 1129 // met3 pin + +layer_def met4tt 1130 1131 1132 1133 +layer_map 71 -texttype 20 1130 // met4 drawing +layer_map 71 -texttype 5 1131 // met4 label +layer_map 71 -texttype 23 1132 // met4 net +layer_map 71 -texttype 16 1133 // met4 pin + +layer_def met5tt 1134 1135 1136 1137 +layer_map 72 -texttype 20 1134 // met5 drawing +layer_map 72 -texttype 5 1135 // met5 label +layer_map 72 -texttype 23 1136 // met5 net +layer_map 72 -texttype 16 1137 // met5 pin + +layer_def polytt 1138 1139 1140 1141 +layer_map 66 -texttype 20 1138 // poly drawing +layer_map 66 -texttype 5 1139 // poly label +layer_map 66 -texttype 23 1140 // poly net +layer_map 66 -texttype 16 1141 // poly pin + +layer_def difftt 1142 1143 1144 1145 +layer_map 65 -texttype 20 1142 // diff drawing +layer_map 65 -texttype 6 1143 // diff label +layer_map 65 -texttype 23 1144 // diff net +layer_map 65 -texttype 16 1145 // diff pin + +layer_def poly_pin 1146 +layer_map 66 -datatype 16 1146 // poly pin + +layer_def li1_pin 1147 +layer_map 67 -datatype 16 1147 // li1 pin + +layer_def met1_pin 1148 +layer_map 68 -datatype 16 1148 // met1 pin + +layer_def met2_pin 1149 +layer_map 69 -datatype 16 1149 // met2 pin + +layer_def met3_pin 1150 +layer_map 70 -datatype 16 1150 // met3 pin + +layer_def met4_pin 1151 +layer_map 71 -datatype 16 1151 // met4 pin + +layer_def met5_pin 1152 +layer_map 72 -datatype 16 1152 // met5 pin + +layer_def nwellpt 1153 +layer_map 64 -texttype 16 1153 // nwell pin +layer_map 64 -texttype 0 1153 // nwell pin + +layer_def polypt 1154 +layer_map 66 -texttype 16 1154 // poly pin +layer_map 66 -texttype 0 1154 // poly pin + +layer_def li1pt 1155 +layer_map 67 -texttype 16 1155 // li1 pin +layer_map 67 -texttype 0 1155 // li1 pin + +layer_def met1pt 1156 +layer_map 68 -texttype 16 1156 // met1 pin +layer_map 68 -texttype 0 1156 // met1 pin + +layer_def met2pt 1157 +layer_map 69 -texttype 16 1157 // met2 pin +layer_map 69 -texttype 0 1157 // met2 pin + +layer_def met3pt 1158 +layer_map 70 -texttype 16 1158 // met3 pin +layer_map 70 -texttype 0 1158 // met3 pin + +layer_def met4pt 1159 +layer_map 71 -texttype 16 1159 // met4 pin +layer_map 71 -texttype 0 1159 // met4 pin + +layer_def met5pt 1160 +layer_map 72 -texttype 16 1160 // met5 pin +layer_map 72 -texttype 0 1160 // met5 pin + +layer_def padtt 1167 1089 +layer_map 76 -texttype 20 1167 // pad drawing + // 1089 -> pad label + +layer_def pad_pin 1168 +layer_map 76 -datatype 16 1168 // pad pin + +layer_def padpt 1169 +layer_map 76 -texttype 16 1169 // pad pin +layer_map 76 -texttype 0 1169 // pad pin + +layer_def met5Pin 1152 + // 1152 -> met5 pin + +layer_def met4Pin 1151 + // 1151 -> met4 pin + +layer_def met3Pin 1150 + // 1150 -> met3 pin + +layer_def met2Pin 1149 + // 1149 -> met2 pin + +layer_def met1Pin 1148 + // 1148 -> met1 pin + +layer_def li1Pin 1147 + // 1147 -> li1 pin + +layer_def polyPin 1146 + // 1146 -> poly pin + +layer_def diffPin 1222 +layer_map 65 -datatype 16 1222 // diff pin + +treat_non_baselayer_as_toplayer yes +base_layer diff +base_layer poly +layer_def pwellLabel 1229 +layer_map 64 -datatype 59 1229 // pwell label + +layer_def pwelltt 1230 +layer_map 64 -texttype 59 1230 // pwell label + +layer_def pwell_pin 1231 +layer_map 122 -datatype 16 1231 // pwell pin + +layer_def pwellpt 1232 +layer_map 122 -texttype 16 1232 // pwell pin +layer_map 122 -texttype 0 1232 // pwell pin + +copy inductor -outputlayer inductor_exempt +and diff nwell -outputlayer PDIFF +not diff nwell -outputlayer NDIFF +not diff poly -outputlayer SRCDRN +and poly diff -outputlayer POLYandDIFF +copy POLYandDIFF -outputlayer GATE +edge_boolean -inside GATE diff -outputlayer GATESIDE +edge_boolean -coincident_only -inside GATE diff -outputlayer GATEEND +//edge_boolean -coincident_only -outside diff tap -outputlayer diffTapEdge +copy GATE -outputlayer MOSGATE +copy MOSGATE -outputlayer EMOSGATE +disconnect +//and npc licon1 -outputlayer npccon +//connect dnwell nwell +//connect nwell tap -by NTAP +//connect tap li1 -by licon1 +//connect poly li1 -by npccon +connect li1 met1 -by mcon +connect met1 met2 -by via +connect met3 met2 -by via2 +connect met3 met4 -by via3 +connect met4 met5 -by via4 +connect met5 pad +rule "R0_nwell_X1" { +caption "nwell_X1: off 0.005 grid nwell vertex" +offgrid nwell 5 +} +rule "R1_diff_X1" { +caption "diff_X1: off 0.005 grid diff vertex" +offgrid diff 5 +} +rule "R2_poly_X1" { +caption "poly_X1: off 0.005 grid poly vertex" +offgrid poly 5 +} +rule "R3_li1_X1" { +caption "li1_X1: off 0.005 grid li1 vertex" +offgrid li1 5 +} +rule "R4_mcon_X1" { +caption "mcon_X1: off 0.005 grid mcon vertex" +offgrid mcon 5 +} +rule "R5_met1_X1" { +caption "met1_X1: off 0.005 grid met1 vertex" +offgrid met1 5 +} +rule "R6_via_X1" { +caption "via_X1: off 0.005 grid via vertex" +offgrid via 5 +} +rule "R7_met2_X1" { +caption "met2_X1: off 0.005 grid met2 vertex" +offgrid met2 5 +} +rule "R8_via2_X1" { +caption "via2_X1: off 0.005 grid via2 vertex" +offgrid via2 5 +} +rule "R9_met3_X1" { +caption "met3_X1: off 0.005 grid met3 vertex" +offgrid met3 5 +} +rule "R10_via3_X1" { +caption "via3_X1: off 0.005 grid via3 vertex" +offgrid via3 5 +} +rule "R11_met4_X1" { +caption "met4_X1: off 0.005 grid met4 vertex" +offgrid met4 5 +} +rule "R12_via4_X1" { +caption "via4_X1: off 0.005 grid via4 vertex" +offgrid via4 5 +} +rule "R13_met5_X1" { +caption "met5_X1: off 0.005 grid met5 vertex" +offgrid met5 5 +} +rule "R14_pad_X1" { +caption "pad_X1: off 0.005 grid pad vertex" +offgrid pad 5 +} +rule "R15_cap_X1" { +caption "cap_X1: off 0.005 grid capacitor vertex" +offgrid capacitor 5 +} +rule "R16_ind_X1" { +caption "ind_X1: off 0.005 grid inductor vertex" +offgrid inductor 5 +} +rule "R17_nwell_X2" { +caption "nwell_X2: non-octagonal nwell edge" +angle nwell -ltgt 0 45 +angle nwell -ltgt 45 90 +} +rule "R18_diff_X2" { +caption "diff_X2: non-octagonal diff edge" +angle diff -ltgt 0 45 +angle diff -ltgt 45 90 +} +rule "R19_met1_X2" { +caption "met1_X2: non-octagonal met1 edge" +angle met1 -ltgt 0 45 +angle met1 -ltgt 45 90 +} +rule "R20_met2_X2" { +caption "met2_X2: non-octagonal met2 edge" +angle met2 -ltgt 0 45 +angle met2 -ltgt 45 90 +} +rule "R21_met3_X2" { +caption "met3_X2: non-octagonal met3 edge" +angle met3 -ltgt 0 45 +angle met3 -ltgt 45 90 +} +rule "R22_met4_X2" { +caption "met4_X2: non-octagonal met4 edge" +angle met4 -ltgt 0 45 +angle met4 -ltgt 45 90 +} +rule "R23_met5_X2" { +caption "met5_X2: non-octagonal met5 edge" +angle met5 -ltgt 0 45 +angle met5 -ltgt 45 90 +} +rule "R24_cap_X2" { +caption "cap_X2: non-octagonal capacitor edge" +angle capacitor -ltgt 0 45 +angle capacitor -ltgt 45 90 +} +rule "R25_ind_X2" { +caption "ind_X2: non-octagonal inductor edge" +angle inductor -ltgt 0 45 +angle inductor -ltgt 45 90 +} + diff --git a/sky130_cds/LICENSE b/sky130_cds/LICENSE new file mode 100755 index 000000000..261eeb9e9 --- /dev/null +++ b/sky130_cds/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/sky130_cds/LVS/README.md b/sky130_cds/LVS/README.md new file mode 100755 index 000000000..e69de29bb diff --git a/sky130_cds/PEX/README.md b/sky130_cds/PEX/README.md new file mode 100755 index 000000000..e69de29bb diff --git a/sky130_cds/PEX/qrcTechFile b/sky130_cds/PEX/qrcTechFile new file mode 100755 index 000000000..e289c08c4 Binary files /dev/null and b/sky130_cds/PEX/qrcTechFile differ diff --git a/sky130_cds/PEX/sky130.ict b/sky130_cds/PEX/sky130.ict new file mode 100755 index 000000000..ebbb58858 --- /dev/null +++ b/sky130_cds/PEX/sky130.ict @@ -0,0 +1,371 @@ + +# +process sky130 { + background_dielectric_constant 1.0 + temp_reference 30 +} +# Well declarations +well NWELL {} +well PWELL {} + +# Diffusion Layers +diffusion P_SOURCE_DRAIN { + thickness 0.12 + resistivity 15 +} + +diffusion N_SOURCE_DRAIN { + thickness 0.12 + resistivity 15 +} + +# Conducting Layers +conductor Poly { + min_spacing 0.21 + min_width 0.15 + height 0.3262 + thickness 0.180 + resistivity 48.2 + temp_tc1 0.0008916 + temp_tc2 8.443e-07 + gate_forming_layer true + wire_edge_enlargement_r { + wee_widths 0.15 + wee_spacings 0.21 + wee_adjustments -0.0280 + } + wire_edge_enlargement_c { + wee_widths 0.15 + wee_spacings 0.21 + wee_adjustments 0.0 + } +} + +conductor li1 { + min_spacing 0.17 + min_width 0.17 + height 0.9361 + thickness 0.100 + resistivity 12.8 + temp_tc1 0.0006045 + temp_tc2 -3.693e-07 + gate_forming_layer false + wire_edge_enlargement_r { + wee_widths 0.17 + wee_spacings 0.17 + wee_adjustments 0.0085 + } + wire_edge_enlargement_c { + wee_widths 0.17 + wee_spacings 0.17 + wee_adjustments 0 + } +} + +conductor met1 { + min_spacing 0.14 + min_width 0.14 + height 1.3761 + thickness 0.36 + resistivity 0.125 + temp_tc1 0.003179 + temp_tc2 3.094e-07 + gate_forming_layer false + wire_edge_enlargement_r { + wee_widths 0.14 + wee_spacings 0.14 + wee_adjustments -0.0195 + } + wire_edge_enlargement_c { + wee_widths 0.14 + wee_spacings 0.14 + wee_adjustments 0 + } +} + +conductor met2 { + min_spacing 0.14 + min_width 0.14 + height 2.0061 + thickness 0.360 + resistivity 0.125 + temp_tc1 0.003161 + temp_tc2 -7.272e-07 + gate_forming_layer false + wire_edge_enlargement_r { + wee_widths 0.14 + wee_spacings 0.14 + wee_adjustments -0.0195 + } + wire_edge_enlargement_c { + wee_widths 0.14 + wee_spacings 0.14 + wee_adjustments 0 + } +} + +conductor met3 { + min_spacing 0.30 + min_width 0.30 + height 2.7861 + thickness 0.845 + resistivity 0.047 + temp_tc1 0.003424 + temp_tc2 -7.739e-07 + gate_forming_layer false + wire_edge_enlargement_r { + wee_widths 0.30 + wee_spacings 0.30 + wee_adjustments -0.0125 + } + wire_edge_enlargement_c { + wee_widths 0.30 + wee_spacings 0.30 + wee_adjustments 0 + } +} + +conductor met4 { + min_spacing 0.30 + min_width 0.30 + height 4.0211 + thickness 0.845 + resistivity 0.047 + temp_tc1 0.003424 + temp_tc2 -7.739e-07 + gate_forming_layer false + wire_edge_enlargement_r { + wee_widths 0.30 + wee_spacings 0.30 + wee_adjustments -0.0125 + } + wire_edge_enlargement_c { + wee_widths 0.30 + wee_spacings 0.30 + wee_adjustments 0 + } +} + +conductor met5 { + min_spacing 1.60 + min_width 0.80 + height 5.3711 + thickness 1.260 + resistivity 0.0285 + temp_tc1 3.5e-3 + temp_tc2 -7.5e-07 + gate_forming_layer false + wire_edge_enlargement_r { + wee_widths 0.80 + wee_spacings 1.60 + wee_adjustments -0.0450 + } + wire_edge_enlargement_c { + wee_widths 0.80 + wee_spacings 1.60 + wee_adjustments 0 + } +} + +# dielectric Layers +dielectric FOX { + conformal FALSE + height 0.0000 + thickness 0.3262 + dielectric_constant 3.9 +} + +dielectric IOX { + conformal TRUE + expandedFrom Poly + height 0.3262 + thickness 0.0000 + topThickness 0.0000 + sideExpand 0.0060 + dielectric_constant 3.9 +} + +dielectric SPNIT { + conformal TRUE + expandedFrom IOX + height 0.3262 + thickness 0.0000 + topThickness 0.1210 + sideExpand 0.0431 + dielectric_constant 7.5 +} + +dielectric PSG { + conformal FALSE + height 0.3262 + thickness 0.6099 + dielectric_constant 3.9 +} + +dielectric LINT { + conformal TRUE + expandedFrom li1 + height 0.9361 + thickness 0.0750 + topThickness 0.0750 + sideExpand 0.0610 + dielectric_constant 7.3 +} + +dielectric NILD2 { + conformal FALSE + height 1.0111 + thickness 0.3650 + dielectric_constant 4.05 +} + +dielectric NILD3_C { + conformal TRUE + expandedFrom met1 + height 1.3761 + thickness 0.0000 + topThickness 0.0000 + sideExpand 0.0300 + dielectric_constant 3.5 +} + +dielectric NILD3 { + conformal FALSE + height 1.3761 + thickness 0.6300 + dielectric_constant 4.5 +} + +dielectric NILD4_C { + conformal TRUE + expandedFrom met2 + height 2.0061 + thickness 0.0000 + topThickness 0.0000 + sideExpand 0.0300 + dielectric_constant 3.5 +} + +dielectric NILD4 { + conformal FALSE + height 2.0061 + thickness 0.7800 + dielectric_constant 4.2 +} + +dielectric NILD5 { + conformal FALSE + height 2.7861 + thickness 1.2350 + dielectric_constant 4.1 +} + +dielectric NILD6 { + conformal FALSE + height 4.0211 + thickness 1.3500 + dielectric_constant 4.0 +} + +dielectric TOPOX { + conformal TRUE + expandedFrom met5 + height 5.3711 + thickness 0.0000 + topThickness 0.0900 + sideExpand 0.0700 + dielectric_constant 3.9 +} + +dielectric TOPNIT { + conformal TRUE + expandedFrom TOPOX + height 5.3711 + thickness 0.3777 + topThickness 0.5400 + sideExpand 0.4223 + dielectric_constant 7.50 +} + +dielectric PI1 { + conformal FALSE + height 5.7488 + thickness 6.1346 + dielectric_constant 2.94 +} + +dielectric PI2 { + conformal FALSE + height 11.8834 + thickness 7.5000 + dielectric_constant 2.85 +} + +dielectric MOLD { + conformal FALSE + height 19.3834 + thickness 40.0000 + dielectric_constant 3.6 +} + +# Connect Layers +via CONT { + bottom_layer P_SOURCE_DRAIN + top_layer li1 + contact_resistance 15 +} + +via CONT { + bottom_layer N_SOURCE_DRAIN + top_layer li1 + contact_resistance 15 +} + +via via4 { + bottom_layer met4 + top_layer met5 + contact_resistance 0.38 + temp_tc1 0.00177 + temp_tc2 -1.6e-07 +} + +via via3 { + bottom_layer met3 + top_layer met4 + contact_resistance 3.41 + temp_tc1 0.002366 + temp_tc2 -1.025e-05 +} + +via via2 { + bottom_layer met2 + top_layer met3 + contact_resistance 3.41 + temp_tc1 0.002366 + temp_tc2 -1.025e-05 +} + +via via { + bottom_layer met1 + top_layer met2 + contact_resistance 4.5 + temp_tc1 0.001081 + temp_tc2 -1.903e-07 +} + +via mcon { + bottom_layer li1 + top_layer met1 + contact_resistance 9.3 + temp_tc1 0.001067 + temp_tc2 -5.324e-06 +} + +via licon { + bottom_layer Poly + top_layer li1 + contact_resistance 152 + temp_tc1 0.001249 + temp_tc2 -6.647e-06 +} + diff --git a/sky130_cds/README.md b/sky130_cds/README.md new file mode 100755 index 000000000..76f0a872e --- /dev/null +++ b/sky130_cds/README.md @@ -0,0 +1,69 @@ +# sky130_cds +
+James E. Stine, Jr. and Rachana Erra
+james.stine@okstate.edu 
+Oklahoma State University
+School of Electrical and Computer Engineering
+VLSI Computer Architecture Research Group
+
+ +Many thanks to Cadence Design Systems including David Junkin, Barry Nelson and Anton Kotz for all their amazing help and guidance. + +Repository for SKY130 Process Design Kit and Cadence Design System tools. + +**Submodules**
+ +This repository contains the Oklahoma State University standard cells for Skywater Technology 130nm (SKY130). They are integrated as submodules to get all of the standard-cells after cloning, type: + +
+git submodule update --init --recursive
+
+ +You can also get each submodule individually by typing: + +
+git submodule update --init sky130_osu_sc_t18
+
+ +If you wish to download them individually, you can do that at these links: +
+https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t18/+/refs/heads/main
+https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t15/+/refs/heads/main
+https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12/+/refs/heads/main
+
+ +**Sample Designs:**
+ +Right now there are two sample designs in the repository. One is a purely combinational design (mult.sv) and the other is a combination of combinational and sequential (mult_seq.sv). Right now, the mult_seq design is set up but can be easily modified and changed, if needed. + +**Instructions to run synthesis and pnr:** + +1. git clone git@github.com:stineje/sky130_cds.git + +2. **Set up PDK:**
+ a. cd sky130_cds
+ b. git submodule update --init --recursive
+ +3. **Run synthesis:**
+ a.cd synth
+ b.Add HDL to hdl subdirectory
+ c.Edit genus script.tcl to load in correct SV files
+ d.Also modify genus_script.tcl to add the timing needed any loading or input/output delays. There are also options for loading that can be changed. Right now, a FF is assumed to be at the beginning and end of the timing to constrain the timing properly.Constraint settings are found within the constraints top.sdc file.
+ e.make synth
+ f.All output is logged to synth.out that should be checked on completion. Reports are found within the reports directory and any mapped HDL is found in the top directory.
+ +4. **Place-and-Route:**
+ a. Edit setup.tcl and change the design, netlist, and sdc location. These can be found by searching for mult seq in a text editor. These items should match the files done through synthesis.
+ b.innovus_config.tcl has plugins that allow commands to be run when needed. Right now, some plugins are enabled and some are not. This file would have be edited if one would want to do an additional command. These commands can be done before or after a step -- e.g.,pre init or post init.
+ c.To start the process, a Makefile is used. Type the following in this order: init, place, cts, postcts hold, route, postroute, signoff. For example, you could type, make init to run through a design for the init phase. If one would want to just run through route, just type make route and the scripts should run through all the scripts until the end of route provided the other steps have not been initiated.This, of course, is provided there are no errors.
+ d.Any commands run through the pnr are in the LOG subdirectory. There is one file that lists the commands (i.e., cmd) and the other that lists output from the command or the log files (i.e., .log). Reports are found in the RPT subdirectory.
+ e.To pull up a placed-and-routed design from the route stage , start innovus and type: restoreDesign DBS/route.enc.dat/ mult_seq. It is important that the last argument be the top-level design indicated during the synthesis stage.
+ +Notes: There is more information in the PowerPoint slides found in the doc subdirectory. + + **Generating a qrcTechfile for PEX using Quantus:**
+ +qrcTechfile is a technology file specific to a PDK that is generated from an ict file. An ict file contains information about conductors, dielectrics, diffusion, substrate, via and so forth. It is created using the specified syntax for each of the commands.
+
techgen -si sky130.ict
+ + diff --git a/sky130_cds/VirtuosoOA/.cadence/dfII/Navigator/Options.xml b/sky130_cds/VirtuosoOA/.cadence/dfII/Navigator/Options.xml new file mode 100755 index 000000000..e69de29bb diff --git a/sky130_cds/VirtuosoOA/.cadence/dfII/Navigator/categories.xml b/sky130_cds/VirtuosoOA/.cadence/dfII/Navigator/categories.xml new file mode 100755 index 000000000..e69de29bb diff --git a/sky130_cds/VirtuosoOA/.cadence/dfII/history/jstine.history b/sky130_cds/VirtuosoOA/.cadence/dfII/history/jstine.history new file mode 100644 index 000000000..8104612bd --- /dev/null +++ b/sky130_cds/VirtuosoOA/.cadence/dfII/history/jstine.history @@ -0,0 +1 @@ +("sample:/\tsample test_sky130 layout" (("open" (nil hierarchy "/{test_sky130 sample layout }:a"))) (((-7.479 4.421) (-2.906 8.604)) "a" "Layout" 2))("sky130_osu_sc_12T_hs__addf_1:/\tsky130_osu_sc_12T_hs__addf_1 sky130_osu_sc_t12 layout" (("open" (nil hierarchy "/{sky130_osu_sc_t12 sky130_osu_sc_12T_hs__addf_1 layout }:a"))) (((-0.561 -2.269) (9.752 6.725)) "a" "Layout" 2))("sky130_osu_sc_12T_ls__dff_1:/\tsky130_osu_sc_12T_ls__dff_1 sky130_osu_sc_t12 layout" (("open" (nil hierarchy "/{sky130_osu_sc_t12 sky130_osu_sc_12T_ls__dff_1 layout }:a"))) (((-0.7 -1.458) (8.866 5.919)) "a" "Layout" 2))("sky130_osu_sc_18T_hs__inv_1:/\tsky130_osu_sc_18T_hs__inv_1 sample schematic" (("open" (nil hierarchy "/{sample sky130_osu_sc_18T_hs__inv_1 schematic }:a"))) (((-1.89375 -0.74375) (0.20625 0.89375)) "a" "Schematics" 9))("sky130_osu_sc_18T_hs__inv_1:/\tsky130_osu_sc_18T_hs__inv_1 sample layout" (("open" (nil hierarchy "/{sample sky130_osu_sc_18T_hs__inv_1 layout }:a"))) (((-4.406 -1.511) (7.416 7.138)) "a" "Layout" 7))("sky130_osu_sc_18T_hs__addf_1:/\tsky130_osu_sc_18T_hs__addf_1 sky130_osu_sc_t18 layout" (("open" (nil hierarchy "/{sky130_osu_sc_t18 sky130_osu_sc_18T_hs__addf_1 layout }:a"))) (((-0.501 1.07) (2.601 3.33)) "a" "Layout" 2))("sample:/\tsample example layout" (("open" (nil hierarchy "/{example sample layout }:a"))) (((-13.098 -37.509) (41.261 10.001)) "a" "Layout" 2)) \ No newline at end of file diff --git a/sky130_cds/VirtuosoOA/.cadence/dfII/history/rerra.history b/sky130_cds/VirtuosoOA/.cadence/dfII/history/rerra.history new file mode 100755 index 000000000..d9420f4d5 --- /dev/null +++ b/sky130_cds/VirtuosoOA/.cadence/dfII/history/rerra.history @@ -0,0 +1 @@ +("sample:/\tsample test_sky130 layout" (("open" (nil hierarchy "/{test_sky130 sample layout }:a"))) (((-7.478 4.878) (-2.906 8.222)) "a" "Layout" 4))("sky130_osu_sc_18T_hs__addh_l:/\tsky130_osu_sc_18T_hs__addh_l sky130_osu_sc_t18 layout" (("open" (nil hierarchy "/{sky130_osu_sc_t18 sky130_osu_sc_18T_hs__addh_l layout }:a"))) (((-2.675 -1.511) (9.147 7.138)) "a" "Layout" 2))("sky130_osu_sc_18T_hs__and2_2:/\tsky130_osu_sc_18T_hs__and2_2 sky130_osu_sc_t18 layout" (("open" (nil hierarchy "/{sky130_osu_sc_t18 sky130_osu_sc_18T_hs__and2_2 layout }:a"))) (((-0.291 3.551) (5.385 7.704)) "a" "Layout" 4))("sky130_osu_sc_15T_hs__and2_2:/\tsky130_osu_sc_15T_hs__and2_2 sky130_osu_sc_t15 layout" (("open" (nil hierarchy "/{sky130_osu_sc_t15 sky130_osu_sc_15T_hs__and2_2 layout }:a"))) (((-3.362 -1.155) (6.372 5.966)) "a" "Layout" 2))("sky130_osu_sc_12T_hs__addh_l:/\tsky130_osu_sc_12T_hs__addh_l sky130_osu_sc_t12 layout" (("open" (nil hierarchy "/{sky130_osu_sc_t12 sky130_osu_sc_12T_hs__addh_l layout }:a"))) (((-1.599 -1.154) (8.069 5.919)) "a" "Layout" 4))("sky130_osu_sc_15T_hs__addh_1:/\tsky130_osu_sc_15T_hs__addh_1 sky130_osu_sc_t15 layout" (("open" (nil hierarchy "/{sky130_osu_sc_t15 sky130_osu_sc_15T_hs__addh_1 layout }:a"))) (((-1.845 -1.466) (8.316 5.967)) "a" "Layout" 2))("sample:/\tsample sky130 layout" (("open" (nil hierarchy "/{sky130 sample layout }:a"))) (((-21.551 -10.001) (21.551 10.001)) "a" "Layout" 2))("L1_T:/\tL1_T sky130 symbolic" (("open" (nil hierarchy "/{sky130 L1_T symbolic }:a"))) (((-0.123 -0.086) (0.123 0.094)) "a" "Layout" 4))("sky130_osu_sc_15T_hs__and2_4:/\tsky130_osu_sc_15T_hs__and2_4 sky130_osu_sc_t15 layout" (("open" (nil hierarchy "/{sky130_osu_sc_t15 sky130_osu_sc_15T_hs__and2_4 layout }:a"))) (((-3.295 -1.154) (6.439 5.966)) "a" "Layout" 2))("sky130_osu_sc_18T_hs__addh_1:/\tsky130_osu_sc_18T_hs__addh_1 sky130_osu_sc_t18 layout" (("open" (nil hierarchy "/{sky130_osu_sc_t18 sky130_osu_sc_18T_hs__addh_1 layout }:a"))) (((-2.44 -1.165) (8.91 7.138)) "a" "Layout" 2)) \ No newline at end of file diff --git a/sky130_cds/VirtuosoOA/.cadence/dfII/opc/queries.il b/sky130_cds/VirtuosoOA/.cadence/dfII/opc/queries.il new file mode 100755 index 000000000..e69de29bb diff --git a/sky130_cds/VirtuosoOA/.cadence/dfII/opc/querySets.xml b/sky130_cds/VirtuosoOA/.cadence/dfII/opc/querySets.xml new file mode 100644 index 000000000..e69de29bb diff --git a/sky130_cds/VirtuosoOA/.cadence/xstream/IN/.session b/sky130_cds/VirtuosoOA/.cadence/xstream/IN/.session new file mode 100644 index 000000000..c6d56abcf --- /dev/null +++ b/sky130_cds/VirtuosoOA/.cadence/xstream/IN/.session @@ -0,0 +1,26 @@ +<<<<<<< HEAD +M:0 DV:1 NT:0 N:1 C:32 + +M:0 DV:1 NT:0 N:2 C:32 + +M:0 DV:1 NT:0 N:1 C:32 +======= +M:0 DV:1 NT:0 N:72 C:32 + +M:0 DV:1 NT:0 N:72 C:32 + +M:0 DV:1 NT:0 N:72 C:32 + +M:0 DV:1 NT:0 N:72 C:32 + +M:0 DV:1 NT:0 N:72 C:32 + +M:0 DV:1 NT:0 N:72 C:32 + +M:0 DV:1 NT:0 N:72 C:32 + +M:0 DV:1 NT:0 N:72 C:32 + +M:0 DV:1 NT:0 N:74 C:32 +>>>>>>> 10823a628534cc8495a7a4d920792bedde1654ba + diff --git a/sky130_cds/VirtuosoOA/.cdsinit b/sky130_cds/VirtuosoOA/.cdsinit new file mode 100755 index 000000000..4014908e9 --- /dev/null +++ b/sky130_cds/VirtuosoOA/.cdsinit @@ -0,0 +1,11 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; SKY130 .cdsinit +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +setShellEnvVar("PDK_HOME=$HOME/sky130_cds") +envSetVal("layout" "xSnapSpacing" 'float 0.005) +envSetVal("layout" "ySnapSpacing" 'float 0.005) +setShellEnvVar("CDS_Netlisting_Mode=Analog") +setShellEnvVar("CDS_AUTO_64BIT=ALL") diff --git a/sky130_cds/VirtuosoOA/README.md b/sky130_cds/VirtuosoOA/README.md new file mode 100755 index 000000000..a161e3a00 --- /dev/null +++ b/sky130_cds/VirtuosoOA/README.md @@ -0,0 +1,11 @@ +This directory contains the Virtoso library for the SKY130 PDK. This +library is meant to get a user started and may not have all the layers +associated with a given design. It is only meant to help users get +starting using Virtuoso with the SKY130 PDK. Please consult the +documentation at Skywater Technology PDK before attempting to +fabricate using these tools. + +The environmental variable PDK_HOME should be set to the pdk +directory. A sample script is included but can be modified as needed. + + diff --git a/sky130_cds/VirtuosoOA/cds.lib b/sky130_cds/VirtuosoOA/cds.lib new file mode 100755 index 000000000..277b00a2f --- /dev/null +++ b/sky130_cds/VirtuosoOA/cds.lib @@ -0,0 +1,14 @@ +# File Created by James Stine at Fri Sep 16 15:14:51 2022 +# assisted by CdsLibEditor +# Cadence libraries +INCLUDE $CDS_IC/share/cdssetup/cds.lib +DEFINE bmslib $CDS_IC/tools/dfII/samples/artist/bmslib +DEFINE sky130 ./sky130 + +# OSU Standard-Cell Libraries +DEFINE sky130_osu_sc_t18 ./sky130_osu_sc_t18 +DEFINE sky130_osu_sc_t12 ./sky130_osu_sc_t12 +DEFINE sky130_osu_sc_t15 ./sky130_osu_sc_t15 + +# Test Layout +DEFINE test_sky130 ./test_sky130 diff --git a/sky130_cds/VirtuosoOA/display.drf b/sky130_cds/VirtuosoOA/display.drf new file mode 100755 index 000000000..1702217af --- /dev/null +++ b/sky130_cds/VirtuosoOA/display.drf @@ -0,0 +1,1629 @@ +drDefineDisplay( +;( DisplayName ) + ( display ) +) +drDefineColor( +;( DisplayName ColorsName Red Green Blue ) + ( display black 0 0 0 ) + ( display blinkRed 255 0 0 t ) + ( display blinkWhite 255 255 255 t ) + ( display blinkYellow 255 255 0 t ) + ( display blue 0 0 255 ) + ( display brown 191 64 38 ) + ( display cadetBlue 57 191 255 ) + ( display chocolate 128 38 38 ) + ( display cream 255 255 204 ) + ( display cyan 0 255 255 ) + ( display deepBlue 0 191 255 ) + ( display deepGold 218 165 32 ) + ( display deepLime 173 255 47 ) + ( display deepOrange 255 127 80 ) + ( display deepYellow 255 215 0 ) + ( display forest 38 140 107 ) + ( display gold 217 204 0 ) + ( display gray 204 204 217 ) + ( display green 0 204 102 ) + ( display lightBlue 150 200 255 ) + ( display lightCyan 200 255 255 ) + ( display lightGold 255 244 100 ) + ( display lightGreen 50 250 150 ) + ( display lightLime 200 255 200 ) + ( display lightMagenta 255 200 255 ) + ( display lightMaroon 255 100 100 ) + ( display lightOrange 255 178 50 ) + ( display lightRed 255 175 175 ) + ( display lightSlate 190 190 216 ) + ( display lightTan 255 245 230 ) + ( display lightViolet 174 125 255 ) + ( display lime 0 255 0 ) + ( display magenta 255 0 255 ) + ( display maroon 230 31 13 ) + ( display navy 51 51 153 ) + ( display orange 255 128 0 ) + ( display pink 255 191 242 ) + ( display purple 153 0 230 ) + ( display red 255 0 0 ) + ( display salmon 250 128 114 ) + ( display silver 217 230 255 ) + ( display slate 140 140 166 ) + ( display tan 255 230 191 ) + ( display turquoise 0 255 231 ) + ( display violet 94 0 230 ) + ( display white 255 255 255 ) + ( display winBack 224 224 224 ) + ( display winColor1 166 166 166 ) + ( display winColor2 115 115 115 ) + ( display winColor3 189 204 204 ) + ( display winColor4 204 204 204 ) + ( display winColor5 199 199 199 ) + ( display winFore 128 0 0 ) + ( display winText 51 51 51 ) + ( display yellow 255 255 0 ) +) +drDefineStipple( +;( DisplayName StippleName Bitmap ) + ( display dots ( ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display dots1 ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) ) ) + ( display hLine ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) ) ) + ( display vLine ( ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) ) ) + ( display cross ( ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) ) ) + ( display grid ( ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) ) ) + ( display slash ( ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) ) ) + ( display backSlash ( ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) ) ) + ( display hZigZag ( ( 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 ) + ( 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 ) + ( 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ) ) ) + ( display vZigZag ( ( 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 ) + ( 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 ) + ( 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 ) + ( 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 ) + ( 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 ) + ( 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 ) + ( 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 ) + ( 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 ) + ( 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 ) + ( 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 ) + ( 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 ) + ( 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 ) + ( 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 ) + ( 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 ) + ( 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 ) + ( 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 ) ) ) + ( display hCurb ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display vCurb ( ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 ) ) ) + ( display brick ( ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) ) ) + ( display dagger ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) ) ) + ( display triangle ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display x ( ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) ) ) + ( display sparseDagger ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) ) ) + ( display sparseDagger2 ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display Xone ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 ) + ( 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 ) + ( 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 ) + ( 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 ) + ( 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 ) + ( 0 1 0 0 1 1 1 1 1 1 1 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display Xtwo ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 ) + ( 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 ) + ( 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 ) + ( 0 1 0 0 1 1 1 1 1 1 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display spareDots ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display spareDots21 ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display spareDots22 ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display checker ( ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) ) ) + ( display checker2 ( ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) ) ) + ( display one ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display two ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display three ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display four ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display five ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display six ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display seven ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display eight ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display box45 ( ( 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ) + ( 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ) + ( 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ) + ( 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ) ) ) + ( display gray50 ( ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ) + ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ) + ( 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ) ) ) + ( display gray25 ( ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display snow ( ( 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display backSlash2 ( ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ) + ( 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ) + ( 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) ) ) + ( display lattice ( ( 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) ) ) + ( display smallChecker ( ( 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 ) + ( 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 ) + ( 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 ) + ( 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 ) + ( 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 ) + ( 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 ) + ( 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 ) + ( 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 ) + ( 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 ) + ( 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 ) + ( 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 ) + ( 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 ) + ( 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 ) + ( 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 ) + ( 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 ) + ( 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 ) ) ) + ( display slantBox ( ( 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ) + ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ) ) ) + ( display slash2 ( ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) + ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 ) ) ) + ( display bigSlash ( ( 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 ) ) ) + ( display boxes ( ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 ) + ( 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 ) + ( 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 ) + ( 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display circles ( ( 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 ) + ( 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 ) + ( 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 ) + ( 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 ) + ( 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 ) + ( 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 ) + ( 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 ) + ( 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 ) + ( 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 ) + ( 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 ) + ( 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display zigzag ( ( 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 ) + ( 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 ) + ( 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 ) + ( 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 ) + ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 ) + ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ) + ( 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 ) ) ) + ( display lightMesh ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 ) ) ) + ( display hugeSlash ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display hugeSlash2 ( ( 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ) ) ) + ( display curve ( ( 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 ) + ( 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 ) + ( 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ) ) ) + ( display curve2 ( ( 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 ) + ( 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 ) + ( 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 ) + ( 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ) ) ) + ( display diams ( ( 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display sparsediam ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ) ) ) + ( display rain ( ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ) + ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ) + ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ) ) ) +) +drDefineLineStyle( +;( DisplayName LineStyle Size Pattern ) + ( display solid 1 (1 1 1 ) ) + ( display dashed 1 (1 1 1 1 0 0 ) ) + ( display dots 1 (1 0 0 ) ) + ( display dashDot 1 (1 1 1 0 0 1 0 0 ) ) + ( display shortDash 1 (1 1 0 0 ) ) + ( display doubleDash 1 (1 1 1 1 0 0 1 1 0 0 ) ) + ( display hidden 1 (1 0 0 0 ) ) + ( display thickLine 3 (1 1 1 ) ) +) +drDefinePacket( +;( DisplayName PacketName Stipple LineStyle Fill Outline [FillStyle]) + ( display AnnotateBoundary blank solid yellow yellow outline ) + ( display Cannotoccupy X solid red red X ) + ( display CannotoccupyBnd blank solid red red outline ) + ( display Canplace blank solid cyan cyan outline ) + ( display Group dots solid green green outlineStipple) + ( display GroupBnd blank solid green green outline ) + ( display GroupLbl blank solid green green outline ) + ( display Row blank solid cyan cyan outline ) + ( display RowBnd blank solid cyan cyan outline ) + ( display RowLbl blank solid cyan cyan outline ) + ( display Unrouted blank dashed winColor5 winColor5 outline ) + ( display Unrouted1 blank dashed brown brown outline ) + ( display Unrouted2 blank dashed red red outline ) + ( display Unrouted3 blank dashed pink pink outline ) + ( display Unrouted4 blank dashed orange orange outline ) + ( display Unrouted5 blank dashed green green outline ) + ( display Unrouted6 blank dashed blue blue outline ) + ( display Unrouted7 blank dashed purple purple outline ) + ( display Unrouted8 blank dashed gold gold outline ) + ( display Unrouted9 blank dashed silver silver outline ) + ( display UnroutedTrk blank dashed yellow yellow outline ) + ( display VhviId grid solid cyan cyan outlineStipple) + ( display align blank solid tan tan outline ) + ( display annotate blank solid orange orange outline ) + ( display annotate1 blank solid pink pink outline ) + ( display annotate2 blank solid lime lime outline ) + ( display annotate3 blank solid cyan cyan outline ) + ( display annotate4 blank solid yellow yellow outline ) + ( display annotate5 blank solid white white outline ) + ( display annotate6 blank solid silver silver outline ) + ( display annotate7 blank solid red red outline ) + ( display annotate8 blank solid tan tan outline ) + ( display annotate9 blank solid green green outline ) + ( display area blank solid tan tan outline ) + ( display areaidCoreRes spareDots22 thickLine turquoise deepBlue outlineStipple) + ( display areaidDualMemory blank thickLine orange orange outline ) + ( display areaidStandardc blank thickLine magenta magenta outline ) + ( display areaidTcamMemory blank thickLine pink pink outline ) + ( display areaidWaffleWindow solid thickLine turquoise deepBlue solid ) + ( display areaidanalog blank thickLine lightMaroon lightMaroon outline ) + ( display areaidartisan blank thickLine pink pink outline ) + ( display areaidcd blank doubleDash cream cream outline ) + ( display areaidcore blank thickLine silver silver outline ) + ( display areaidcr blank doubleDash orange orange outline ) + ( display areaidde blank thickLine yellow yellow outline ) + ( display areaiddieCut blank thickLine tan tan outline ) + ( display areaiddn blank doubleDash tan tan outline ) + ( display areaidesd blank thickLine gold gold outline ) + ( display areaidextDrain20 blank thickLine deepBlue deepBlue outline ) + ( display areaidextendedDrain blank thickLine deepGold deepGold outline ) + ( display areaidferro blank thickLine lightBlue lightBlue outline ) + ( display areaidframe blank thickLine cream cream outline ) + ( display areaidframeRect blank thickLine cyan cyan outline ) + ( display areaidipExempt blank thickLine maroon maroon outline ) + ( display areaidlvdnw blank thickLine red red outline ) + ( display areaidmoduleCut blank thickLine lime lime outline ) + ( display areaidnwellIsolation spareDots22 solid cyan cyan outlineStipple) + ( display areaidopcDrop spareDots thickLine lightLime slate outlineStipple) + ( display areaidpitch blank thickLine salmon salmon outline ) + ( display areaidprobe blank thickLine purple purple outline ) + ( display areaidscr blank solid slate slate outline ) + ( display areaidseal blank thickLine white white outline ) + ( display areaidsubcktDevice blank thickLine salmon salmon outline ) + ( display areaidsubstrateCut brick solid lime orange outlineStipple) + ( display areaidsubstrateCut2 spareDots22 solid gray navy outlineStipple) + ( display assemblyBoundary blank solid yellow yellow outline ) + ( display axis blank solid white white outline ) + ( display b55capm slash solid purple purple outlineStipple) + ( display background solid solid black black solid ) + ( display beginGenericLayer blank solid yellow yellow outline ) + ( display border blank solid tan tan outline ) + ( display bpm slash solid navy gray outlineStipple) + ( display capacitor blank thickLine lightOrange lightOrange outline ) + ( display ccim blank solid blue slate outline ) + ( display ccimmask brick solid slate slate outlineStipple) + ( display cctm1 blank solid white white outline ) + ( display cctm1mask triangle solid white white outlineStipple) + ( display cctm1maskAdd dagger solid white white outlineStipple) + ( display cctm1maskDrop hLine solid white white outlineStipple) + ( display cdnm spareDots solid gold gold outlineStipple) + ( display cdnmmask brick solid gold gold outlineStipple) + ( display cdnmmaskAdd dagger solid gold gold outlineStipple) + ( display cdnmmaskDrop hCurb solid gold gold outlineStipple) + ( display cesdmask slantBox solid brown brown outlineStipple) + ( display cfom spareDots solid gray gray outlineStipple) + ( display cfommask brick solid gray gray outlineStipple) + ( display cfommaskAdd dagger solid gray gray outlineStipple) + ( display cfommaskDrop hCurb solid gray gray outlineStipple) + ( display cfomwaffle checker solid forest forest outlineStipple) + ( display cfomwaffleDrop X solid forest forest X ) + ( display changedLayerTl0 blank solid red red outline ) + ( display changedLayerTl1 blank solid yellow yellow outline ) + ( display chvntm spareDots solid lightTan lightTan outlineStipple) + ( display chvntmmask brick solid lightTan lightTan outlineStipple) + ( display chvntmmaskAdd dagger solid lightTan lightTan outlineStipple) + ( display chvntmmaskDrop hCurb solid lightTan lightTan outlineStipple) + ( display chvtpm blank solid cream orange outline ) + ( display chvtpmmask blank solid white orange outline ) + ( display chvtpmmaskAdd dagger solid white orange outlineStipple) + ( display chvtpmmaskDrop hLine solid blue orange outlineStipple) + ( display chvtrm blank solid silver red outline ) + ( display chvtrmmask blank solid maroon red outline ) + ( display chvtrmmaskAdd dagger solid maroon red outlineStipple) + ( display chvtrmmaskDrop hLine solid silver red outlineStipple) + ( display cli1m blank solid white white outline ) + ( display cli1mmask hCurb solid cyan cyan outlineStipple) + ( display cli1mmaskAdd dagger solid cyan cyan outlineStipple) + ( display cli1mmaskDrop hLine solid cyan cyan outlineStipple) + ( display cli1mwaffleDrop X solid cyan cyan X ) + ( display clicm1 blank solid white white outline ) + ( display clicm1mask blank solid silver silver outline ) + ( display clicm1maskAdd dagger solid silver silver outlineStipple) + ( display clicm1maskDrop hLine solid silver silver outlineStipple) + ( display clvom blank solid orange orange outline ) + ( display clvommask triangle solid forest forest outlineStipple) + ( display clvommaskAdd dagger solid forest forest outlineStipple) + ( display clvommaskDrop hLine solid slate slate outlineStipple) + ( display clvtnm blank solid cream lightBlue outline ) + ( display clvtnmmask blank solid white lightBlue outline ) + ( display clvtnmmaskAdd dagger solid white lightBlue outlineStipple) + ( display clvtnmmaskDrop hLine solid blue lightBlue outlineStipple) + ( display cmm1 spareDots solid blue blue outlineStipple) + ( display cmm1mask brick solid blue blue outlineStipple) + ( display cmm1maskAdd dagger solid blue blue outlineStipple) + ( display cmm1maskDrop hCurb solid blue blue outlineStipple) + ( display cmm1waffle checker solid blue blue outlineStipple) + ( display cmm1waffleAdd1 Xone solid blue blue outlineStipple) + ( display cmm1waffleAdd2 Xtwo solid blue blue outlineStipple) + ( display cmm1waffleDrop X solid blue blue X ) + ( display cmm2 spareDots solid pink pink outlineStipple) + ( display cmm2mask brick solid pink pink outlineStipple) + ( display cmm2maskAdd dagger solid pink pink outlineStipple) + ( display cmm2maskDrop hCurb solid pink pink outlineStipple) + ( display cmm2waffle checker solid pink pink outlineStipple) + ( display cmm2waffleAdd1 Xone solid pink pink outlineStipple) + ( display cmm2waffleAdd2 Xtwo solid pink pink outlineStipple) + ( display cmm2waffleDrop X solid pink pink X ) + ( display cmm3 spareDots solid violet violet outlineStipple) + ( display cmm3mask brick solid violet violet outlineStipple) + ( display cmm3maskAdd dagger solid violet violet outlineStipple) + ( display cmm3maskDrop hCurb solid violet violet outlineStipple) + ( display cmm3waffle checker solid violet violet outlineStipple) + ( display cmm3waffleAdd1 Xone solid violet violet outlineStipple) + ( display cmm3waffleAdd2 Xtwo solid violet violet outlineStipple) + ( display cmm3waffleDrop X solid violet violet X ) + ( display cmm4 spareDots solid green green outlineStipple) + ( display cmm4mask brick solid green green outlineStipple) + ( display cmm4maskAdd dagger solid green green outlineStipple) + ( display cmm4maskDrop hCurb solid green green outlineStipple) + ( display cmm4waffle checker solid green green outlineStipple) + ( display cmm4waffleAdd1 Xone solid green green outlineStipple) + ( display cmm4waffleAdd2 Xtwo solid green green outlineStipple) + ( display cmm4waffleDrop X solid green green X ) + ( display cmm5 spareDots solid orange orange outlineStipple) + ( display cmm5mask brick solid orange orange outlineStipple) + ( display cmm5maskAdd dagger solid orange orange outlineStipple) + ( display cmm5maskDrop hCurb solid orange orange outlineStipple) + ( display cmm5waffle checker solid orange orange outlineStipple) + ( display cmm5waffleAdd1 Xone solid orange orange outlineStipple) + ( display cmm5waffleAdd2 Xtwo solid orange orange outlineStipple) + ( display cmm5waffleDrop X solid orange orange X ) + ( display cmm8 spareDots solid green green outlineStipple) + ( display cmm8mask brick solid green green outlineStipple) + ( display cmm8maskAdd dagger solid green green outlineStipple) + ( display cmm8maskDrop hCurb solid green green outlineStipple) + ( display cmm8waffle checker solid green green outlineStipple) + ( display cmm8waffleAdd1 Xone solid green green outlineStipple) + ( display cmm8waffleAdd2 Xtwo solid green green outlineStipple) + ( display cmm8waffleDrop X solid green green X ) + ( display cmsm blank thickLine lime magenta outline ) + ( display cncm blank solid orange orange outline ) + ( display cncmmask blank solid red red outline ) + ( display cnsdm spareDots solid green green outlineStipple) + ( display cnsdmmask brick solid green green outlineStipple) + ( display cnsdmmaskAdd dagger solid green green outlineStipple) + ( display cnsdmmaskDrop hCurb solid green green outlineStipple) + ( display cntm spareDots solid gold gold outlineStipple) + ( display cntmmask brick solid gold gold outlineStipple) + ( display cntmmaskAdd dagger solid gold gold outlineStipple) + ( display cntmmaskDrop hCurb solid gold gold outlineStipple) + ( display cnwm spareDots solid forest forest outlineStipple) + ( display cnwmmask brick solid forest forest outlineStipple) + ( display cnwmmaskAdd dagger solid forest forest outlineStipple) + ( display cnwmmaskDrop hCurb solid forest forest outlineStipple) + ( display conom blank solid red red outline ) + ( display conommask blank solid red red outline ) + ( display conommaskAdd dagger solid red red outlineStipple) + ( display conommaskDrop hLine solid red red outlineStipple) + ( display cp1m spareDots solid orange orange outlineStipple) + ( display cp1mmask brick solid orange orange outlineStipple) + ( display cp1mmaskAdd dagger solid orange orange outlineStipple) + ( display cp1mmaskDrop hCurb solid orange orange outlineStipple) + ( display cp1mwaffle checker solid purple purple outlineStipple) + ( display cp1mwaffleDrop X solid purple purple X ) + ( display cpdm spareDots solid tan tan outlineStipple) + ( display cpdmm spareDots solid chocolate chocolate outlineStipple) + ( display cpdmmask brick solid tan tan outlineStipple) + ( display cpdmmaskAdd dagger solid tan tan outlineStipple) + ( display cpdmmaskDrop hCurb solid tan tan outlineStipple) + ( display cpdmmmask brick solid chocolate chocolate outlineStipple) + ( display cpdmmmaskDrop hLine solid chocolate chocolate outlineStipple) + ( display cpsdm spareDots solid yellow yellow outlineStipple) + ( display cpsdmmask brick solid yellow yellow outlineStipple) + ( display cpsdmmaskAdd dagger solid yellow yellow outlineStipple) + ( display cpsdmmaskDrop hCurb solid yellow yellow outlineStipple) + ( display crpm blank solid white white outline ) + ( display crpmmask blank solid white white outline ) + ( display crpmmaskAdd dagger solid white white outlineStipple) + ( display crpmmaskDrop hLine solid white white outlineStipple) + ( display crrpmmask dagger solid purple purple outlineStipple) + ( display csilm blank solid white white outline ) + ( display csilmmask smallChecker solid maroon maroon outlineStipple) + ( display csilmmaskAdd dagger solid maroon maroon outlineStipple) + ( display csilmmaskDrop hLine solid maroon maroon outlineStipple) + ( display ctunm blank solid white white outline ) + ( display ctunmmask blank solid slate slate outline ) + ( display ctunmmaskAdd dagger solid white white outlineStipple) + ( display ctunmmaskDrop hLine solid white white outlineStipple) + ( display cviam blank solid cream cream outline ) + ( display cviam2 blank solid navy navy outline ) + ( display cviam2mask triangle solid navy navy outlineStipple) + ( display cviam2maskAdd dagger solid navy navy outlineStipple) + ( display cviam2maskDrop hLine solid navy navy outlineStipple) + ( display cviam3 blank solid forest forest outline ) + ( display cviam3mask triangle solid forest forest outlineStipple) + ( display cviam3maskAdd dagger solid forest forest outlineStipple) + ( display cviam3maskDrop hLine solid forest forest outlineStipple) + ( display cviam4 blank solid cyan cyan outline ) + ( display cviam4mask triangle solid cyan cyan outlineStipple) + ( display cviam4maskAdd dagger solid cyan cyan outlineStipple) + ( display cviam4maskDrop hLine solid cyan cyan outlineStipple) + ( display cviam5 blank solid magenta magenta outline ) + ( display cviam5mask triangle solid magenta magenta outlineStipple) + ( display cviam5maskAdd dagger solid magenta magenta outlineStipple) + ( display cviam5maskDrop hLine solid magenta magenta outlineStipple) + ( display cviammask triangle solid cream cream outlineStipple) + ( display cviammaskAdd dagger solid cream cream outlineStipple) + ( display cviammaskDrop hLine solid cream cream outlineStipple) + ( display defaultPacket blank solid white yellow outline ) + ( display designFlow dots solid blue blue outlineStipple) + ( display designFlow1 dots solid purple purple outlineStipple) + ( display designFlow2 dots solid magenta magenta outlineStipple) + ( display designFlow3 dots solid cyan cyan outlineStipple) + ( display designFlow4 dots solid forest forest outlineStipple) + ( display designFlow5 dots solid green green outlineStipple) + ( display designFlow6 dots solid orange orange outlineStipple) + ( display designFlow7 dots solid yellow yellow outlineStipple) + ( display designFlow8 dots solid brown brown outlineStipple) + ( display designFlow9 dots solid red red outlineStipple) + ( display device blank solid green green outline ) + ( display device1 solid solid green green solid ) + ( display device2 blank dashed green green outline ) + ( display deviceAnt blank solid yellow yellow outline ) + ( display deviceLbl blank solid green green outline ) + ( display diff gray50 solid lime lime outlineStipple) + ( display diffBnd blank solid lime lime outline ) + ( display diffCut solid solid lime lime solid ) + ( display diffHv snow solid purple purple outlineStipple) + ( display diffLabel solid solid lightLime lightLime solid ) + ( display diffNet cross solid lime lime outlineStipple) + ( display diffPin snow solid forest forest outlineStipple) + ( display diffProbe solid solid lime lime solid ) + ( display diffRes X solid lime lime X ) + ( display dnwell hugeSlash solid lightLime lightLime outlineStipple) + ( display drill blank solid yellow yellow outline ) + ( display drive blank solid blue blue outline ) + ( display edgeLayer blank solid winColor5 winColor5 outline ) + ( display edgeLayerPin blank solid yellow yellow outline ) + ( display elm lattice solid lightBlue white outlineStipple) + ( display endGenericLayer blank solid yellow yellow outline ) + ( display feedthru blank thickLine lightLime lightLime outline ) + ( display fix dots thickLine lightSlate lightSlate outlineStipple) + ( display grid blank solid slate slate outline ) + ( display grid1 blank solid white white outline ) + ( display halo1 blank solid yellow yellow outline ) + ( display halo10 blank solid brown brown outline ) + ( display halo11 blank solid cadetBlue cadetBlue outline ) + ( display halo12 blank solid navy navy outline ) + ( display halo13 blank solid chocolate chocolate outline ) + ( display halo14 blank solid maroon maroon outline ) + ( display halo15 blank solid tan tan outline ) + ( display halo16 blank solid gold gold outline ) + ( display halo17 blank solid forest forest outline ) + ( display halo18 blank solid slate slate outline ) + ( display halo19 blank solid cream cream outline ) + ( display halo2 blank solid cyan cyan outline ) + ( display halo20 blank solid silver silver outline ) + ( display halo3 blank solid orange orange outline ) + ( display halo4 blank solid pink pink outline ) + ( display halo5 blank solid green green outline ) + ( display halo6 blank solid blue blue outline ) + ( display halo7 blank solid violet violet outline ) + ( display halo8 blank solid white white outline ) + ( display halo9 blank solid gray gray outline ) + ( display hardFence blank solid red red outline ) + ( display hilite blank solid white white outline ) + ( display hilite1 dots solid magenta magenta outlineStipple) + ( display hilite2 blank solid tan tan outline ) + ( display hilite3 blank solid cyan cyan outline ) + ( display hilite4 blank solid orange orange outline ) + ( display hilite5 blank solid lime lime outline ) + ( display hilite6 blank solid orange orange outline ) + ( display hilite7 blank solid cream cream outline ) + ( display hilite8 blank solid magenta magenta outline ) + ( display hilite9 blank solid pink pink outline ) + ( display hiz blank solid orange orange outline ) + ( display hvi vLine solid purple purple outlineStipple) + ( display hvntm spareDots solid yellow yellow outlineStipple) + ( display hvtp dagger solid white orange outlineStipple) + ( display hvtr dagger solid maroon red outlineStipple) + ( display indm snow solid gold gold outlineStipple) + ( display inductor blank solid gold gold outline ) + ( display inductorLabel solid solid lightGold lightGold solid ) + ( display inductorTerm1 one solid white navy outlineStipple) + ( display inductorTerm2 two solid white navy outlineStipple) + ( display inductorTerm3 three solid white navy outlineStipple) + ( display instance blank solid red red outline ) + ( display instanceLbl blank solid gold gold outline ) + ( display internalGenericLayer blank solid yellow yellow outline ) + ( display li1 cross solid tan tan outlineStipple) + ( display li1Blkg rain solid brown brown outlineStipple) + ( display li1Bnd blank solid silver silver outline ) + ( display li1Cut solid solid tan tan solid ) + ( display li1Fuse X solid tan tan X ) + ( display li1Label solid solid brown brown solid ) + ( display li1Net rain solid tan tan outlineStipple) + ( display li1Pin lightMesh solid brown brown outlineStipple) + ( display li1Probe solid solid tan tan solid ) + ( display li1Res X solid tan tan X ) + ( display li1Short snow solid tan tan outlineStipple) + ( display licon1 checker solid cream cream outlineStipple) + ( display licon1Bnd blank solid cream cream outline ) + ( display licon1Net cross solid cream cream outlineStipple) + ( display licon1Pin grid solid lightCyan tan outlineStipple) + ( display lvtn sparseDagger solid white lightBlue outlineStipple) + ( display markerAck X solid yellow yellow X ) + ( display markerAno X solid blue blue X ) + ( display markerCrt X solid red red X ) + ( display markerErr X solid blinkWhite blinkWhite X ) + ( display markerFat X solid blinkRed blinkRed X ) + ( display markerInf X solid green green X ) + ( display markerScr X solid red red X ) + ( display markerSer X solid orange orange X ) + ( display markerWarn X solid blinkYellow blinkYellow X ) + ( display mcon solid solid gray gray solid ) + ( display mconBnd blank solid gray gray outline ) + ( display mconNet cross solid gray gray outlineStipple) + ( display mconPin grid solid silver cream outlineStipple) + ( display met1 slash solid blue blue outlineStipple) + ( display met1Blkg rain solid blue blue outlineStipple) + ( display met1Block blank solid lightBlue lightBlue outline ) + ( display met1Bnd blank solid blue blue outline ) + ( display met1Cut solid solid blue blue solid ) + ( display met1Fuse X solid blue blue X ) + ( display met1Hv bigSlash solid blue blue outlineStipple) + ( display met1Hvlabel lattice solid lightBlue lightBlue outlineStipple) + ( display met1Hvpin grid solid violet violet outlineStipple) + ( display met1Label solid solid lightBlue lightBlue solid ) + ( display met1Metop1 one solid blue blue outlineStipple) + ( display met1Metop2 two solid blue blue outlineStipple) + ( display met1Metop3 three solid blue blue outlineStipple) + ( display met1Metop4 four solid blue blue outlineStipple) + ( display met1Metop5 five solid blue blue outlineStipple) + ( display met1Metop6 six solid blue blue outlineStipple) + ( display met1Metop7 seven solid blue blue outlineStipple) + ( display met1Metop8 eight solid blue blue outlineStipple) + ( display met1Net cross solid violet violet outlineStipple) + ( display met1Pin grid solid violet violet outlineStipple) + ( display met1Probe solid solid blue blue solid ) + ( display met1Psa1 slash solid slate slate outlineStipple) + ( display met1Psa2 slash solid turquoise turquoise outlineStipple) + ( display met1Psa3 slash solid cream cream outlineStipple) + ( display met1Psa4 slash solid chocolate chocolate outlineStipple) + ( display met1Psa5 slash solid navy navy outlineStipple) + ( display met1Psa6 slash solid salmon salmon outlineStipple) + ( display met1Res X solid blue blue X ) + ( display met1Short snow solid blue blue outlineStipple) + ( display met2 backSlash2 solid magenta magenta outlineStipple) + ( display met2Blkg rain solid magenta magenta outlineStipple) + ( display met2Block blank solid lightMagenta lightMagenta outline ) + ( display met2Bnd blank solid magenta magenta outline ) + ( display met2Cut solid solid magenta magenta solid ) + ( display met2Fuse X solid magenta magenta X ) + ( display met2Hv bigSlash solid magenta magenta outlineStipple) + ( display met2Hvlabel lattice solid lightMagenta lightMagenta outlineStipple) + ( display met2Hvpin zigzag solid magenta magenta outlineStipple) + ( display met2Label solid solid lightMagenta lightMagenta solid ) + ( display met2Metop1 one solid magenta magenta outlineStipple) + ( display met2Metop2 two solid magenta magenta outlineStipple) + ( display met2Metop3 three solid magenta magenta outlineStipple) + ( display met2Metop4 four solid magenta magenta outlineStipple) + ( display met2Metop5 five solid magenta magenta outlineStipple) + ( display met2Metop6 six solid magenta magenta outlineStipple) + ( display met2Metop7 seven solid magenta magenta outlineStipple) + ( display met2Metop8 eight solid magenta magenta outlineStipple) + ( display met2Net cross solid magenta magenta outlineStipple) + ( display met2Pin zigzag solid magenta magenta outlineStipple) + ( display met2Probe solid solid magenta magenta solid ) + ( display met2Psa1 backSlash2 solid slate slate outlineStipple) + ( display met2Psa2 backSlash2 solid turquoise turquoise outlineStipple) + ( display met2Psa3 backSlash2 solid cream cream outlineStipple) + ( display met2Psa4 backSlash2 solid chocolate chocolate outlineStipple) + ( display met2Psa5 backSlash2 solid navy navy outlineStipple) + ( display met2Psa6 backSlash2 solid salmon salmon outlineStipple) + ( display met2Res X solid magenta magenta X ) + ( display met2Short snow solid magenta magenta outlineStipple) + ( display met3 curve solid cyan cyan outlineStipple) + ( display met3Blkg rain solid cyan cyan outlineStipple) + ( display met3Block blank solid lightLime lightLime outline ) + ( display met3Bnd blank solid cyan cyan outline ) + ( display met3Cut solid solid cyan cyan solid ) + ( display met3Fuse X solid cyan cyan X ) + ( display met3Hv hugeSlash solid forest forest outlineStipple) + ( display met3Hvlabel lattice solid lightLime lightLime outlineStipple) + ( display met3Hvpin zigzag solid green green outlineStipple) + ( display met3Label solid solid lightCyan lightCyan solid ) + ( display met3Metop1 one solid cyan cyan outlineStipple) + ( display met3Metop2 two solid cyan cyan outlineStipple) + ( display met3Metop3 three solid cyan cyan outlineStipple) + ( display met3Metop4 four solid cyan cyan outlineStipple) + ( display met3Metop5 five solid cyan cyan outlineStipple) + ( display met3Metop6 six solid cyan cyan outlineStipple) + ( display met3Metop7 seven solid cyan cyan outlineStipple) + ( display met3Metop8 eight solid cyan cyan outlineStipple) + ( display met3Net cross solid cyan cyan outlineStipple) + ( display met3Pin gray50 solid cyan cyan outlineStipple) + ( display met3Probe solid solid cyan cyan solid ) + ( display met3Psa1 curve solid slate slate outlineStipple) + ( display met3Psa2 curve solid turquoise turquoise outlineStipple) + ( display met3Psa3 curve solid cream cream outlineStipple) + ( display met3Psa4 curve solid chocolate chocolate outlineStipple) + ( display met3Psa5 curve solid navy navy outlineStipple) + ( display met3Psa6 curve solid salmon salmon outlineStipple) + ( display met3Res X solid cyan cyan X ) + ( display met3Short snow solid cyan cyan outlineStipple) + ( display met4 sparseDagger solid violet violet outlineStipple) + ( display met4Blkg rain solid violet violet outlineStipple) + ( display met4Block blank solid lightViolet lightViolet outline ) + ( display met4Bnd blank solid violet violet outline ) + ( display met4Cut solid solid violet violet solid ) + ( display met4Fuse X solid violet violet X ) + ( display met4Label solid solid lightViolet lightViolet solid ) + ( display met4Metop1 one solid violet violet outlineStipple) + ( display met4Metop2 two solid violet violet outlineStipple) + ( display met4Metop3 three solid violet violet outlineStipple) + ( display met4Metop4 four solid violet violet outlineStipple) + ( display met4Metop5 five solid violet violet outlineStipple) + ( display met4Metop6 six solid violet violet outlineStipple) + ( display met4Metop7 seven solid violet violet outlineStipple) + ( display met4Metop8 eight solid violet violet outlineStipple) + ( display met4Net cross solid violet violet outlineStipple) + ( display met4Pin gray50 solid violet violet outlineStipple) + ( display met4Probe solid solid violet violet solid ) + ( display met4Psa1 sparseDagger solid slate slate outlineStipple) + ( display met4Psa2 sparseDagger solid turquoise turquoise outlineStipple) + ( display met4Psa3 sparseDagger solid cream cream outlineStipple) + ( display met4Psa4 sparseDagger solid chocolate chocolate outlineStipple) + ( display met4Psa5 sparseDagger solid navy navy outlineStipple) + ( display met4Psa6 sparseDagger solid salmon salmon outlineStipple) + ( display met4Res X solid violet violet X ) + ( display met4Short snow solid violet violet outlineStipple) + ( display met5 bigSlash solid gold gold outlineStipple) + ( display met5Blkg rain solid gold gold outlineStipple) + ( display met5Block blank solid lightGold lightGold outline ) + ( display met5Bnd blank solid gold gold outline ) + ( display met5Cut solid solid gold gold solid ) + ( display met5Fuse X solid gold gold X ) + ( display met5Label solid solid lightGold lightGold solid ) + ( display met5Metop1 one solid gold gold outlineStipple) + ( display met5Metop2 two solid gold gold outlineStipple) + ( display met5Metop3 three solid gold gold outlineStipple) + ( display met5Metop4 four solid gold gold outlineStipple) + ( display met5Metop5 five solid gold gold outlineStipple) + ( display met5Metop6 six solid gold gold outlineStipple) + ( display met5Metop7 seven solid gold gold outlineStipple) + ( display met5Metop8 eight solid gold gold outlineStipple) + ( display met5Net cross solid gold gold outlineStipple) + ( display met5Pin gray50 solid gold gold outlineStipple) + ( display met5Probe solid solid gold gold solid ) + ( display met5Psa1 bigSlash solid slate slate outlineStipple) + ( display met5Psa2 bigSlash solid turquoise turquoise outlineStipple) + ( display met5Psa3 bigSlash solid cream cream outlineStipple) + ( display met5Psa4 bigSlash solid chocolate chocolate outlineStipple) + ( display met5Psa5 bigSlash solid navy navy outlineStipple) + ( display met5Psa6 bigSlash solid salmon salmon outlineStipple) + ( display met5Res X solid gold gold X ) + ( display met5Short snow solid gold gold outlineStipple) + ( display met6 vZigZag solid tan tan outlineStipple) + ( display met6Blkg rain solid lightTan lightTan outlineStipple) + ( display met6Block blank solid lightTan lightTan outline ) + ( display met6Bnd blank solid tan tan outline ) + ( display met6Cut solid solid tan tan solid ) + ( display met6Fuse X solid tan tan X ) + ( display met6Label solid solid lightTan lightTan solid ) + ( display met6Metop1 one solid tan tan outlineStipple) + ( display met6Metop2 two solid tan tan outlineStipple) + ( display met6Metop3 three solid tan tan outlineStipple) + ( display met6Metop4 four solid tan tan outlineStipple) + ( display met6Metop5 five solid tan tan outlineStipple) + ( display met6Metop6 six solid tan tan outlineStipple) + ( display met6Metop7 seven solid tan tan outlineStipple) + ( display met6Metop8 eight solid tan tan outlineStipple) + ( display met6Net cross solid tan tan outlineStipple) + ( display met6Pin gray50 solid tan tan outlineStipple) + ( display met6Probe solid solid tan tan solid ) + ( display met6Psa1 vZigZag solid slate slate outlineStipple) + ( display met6Psa2 vZigZag solid turquoise turquoise outlineStipple) + ( display met6Psa3 vZigZag solid cream cream outlineStipple) + ( display met6Psa4 vZigZag solid chocolate chocolate outlineStipple) + ( display met6Psa5 vZigZag solid navy navy outlineStipple) + ( display met6Psa6 vZigZag solid salmon salmon outlineStipple) + ( display met6Res X solid tan tan X ) + ( display met6Short snow solid tan tan outlineStipple) + ( display met7 hugeSlash solid maroon maroon outlineStipple) + ( display met7Blkg rain solid maroon maroon outlineStipple) + ( display met7Block blank solid lightMaroon lightMaroon outline ) + ( display met7Bnd blank solid maroon maroon outline ) + ( display met7Cut solid solid maroon maroon solid ) + ( display met7Fuse X solid maroon maroon X ) + ( display met7Label solid solid lightMaroon lightMaroon solid ) + ( display met7Metop1 one solid maroon maroon outlineStipple) + ( display met7Metop2 two solid maroon maroon outlineStipple) + ( display met7Metop3 three solid maroon maroon outlineStipple) + ( display met7Metop4 four solid maroon maroon outlineStipple) + ( display met7Metop5 five solid maroon maroon outlineStipple) + ( display met7Metop6 six solid maroon maroon outlineStipple) + ( display met7Metop7 seven solid maroon maroon outlineStipple) + ( display met7Metop8 eight solid maroon maroon outlineStipple) + ( display met7Net cross solid maroon maroon outlineStipple) + ( display met7Pin gray50 solid maroon maroon outlineStipple) + ( display met7Probe solid solid maroon maroon solid ) + ( display met7Psa1 vZigZag solid red red outlineStipple) + ( display met7Psa2 vZigZag solid blue blue outlineStipple) + ( display met7Psa3 vZigZag solid green green outlineStipple) + ( display met7Psa4 vZigZag solid white white outlineStipple) + ( display met7Psa5 vZigZag solid yellow yellow outlineStipple) + ( display met7Psa6 vZigZag solid brown brown outlineStipple) + ( display met7Res X solid maroon maroon X ) + ( display met7Short snow solid maroon maroon outlineStipple) + ( display met8 curve2 solid green green outlineStipple) + ( display met8Blkg rain solid green green outlineStipple) + ( display met8Block blank solid lightGreen lightGreen outline ) + ( display met8Bnd blank solid green green outline ) + ( display met8Cut solid solid green green solid ) + ( display met8Fuse X solid green green X ) + ( display met8Label solid solid lightGreen lightGreen solid ) + ( display met8Metop1 one solid green green outlineStipple) + ( display met8Metop2 two solid green green outlineStipple) + ( display met8Metop3 three solid green green outlineStipple) + ( display met8Metop4 four solid green green outlineStipple) + ( display met8Metop5 five solid green green outlineStipple) + ( display met8Metop6 six solid green green outlineStipple) + ( display met8Metop7 seven solid green green outlineStipple) + ( display met8Metop8 eight solid green green outlineStipple) + ( display met8Net cross solid green green outlineStipple) + ( display met8Pin gray50 solid green green outlineStipple) + ( display met8Probe solid solid green green solid ) + ( display met8Res X solid green green X ) + ( display met8Short snow solid green green outlineStipple) + ( display msm blank thickLine red red outline ) + ( display ncm dagger solid tan tan outlineStipple) + ( display npm spareDots solid pink pink outlineStipple) + ( display npn X solid cyan cyan X ) + ( display npnlabel solid solid lightCyan lightCyan solid ) + ( display nsdm spareDots21 solid maroon maroon outlineStipple) + ( display nwell spareDots solid green green outlineStipple) + ( display nwellBnd blank solid forest forest outline ) + ( display nwellCut solid solid forest forest solid ) + ( display nwellLabel solid solid navy navy solid ) + ( display nwellNet cross solid forest forest outlineStipple) + ( display nwellPin snow solid forest forest outlineStipple) + ( display nwellProbe solid solid forest forest solid ) + ( display nwellRes X solid forest forest X ) + ( display overlap blank thickLine deepBlue deepBlue outline ) + ( display overlapBnd blank thickLine deepOrange deepOrange outline ) + ( display pad spareDots solid cream cream outlineStipple) + ( display padLabel solid solid silver silver solid ) + ( display padPin gray50 solid silver silver outlineStipple) + ( display per dots thickLine deepLime deepLime outlineStipple) + ( display pin solid solid red red solid ) + ( display pinAnt blank solid red red outline ) + ( display pinLbl blank solid red red outline ) + ( display pnp X solid magenta magenta X ) + ( display pnplabel solid solid lightMagenta lightMagenta solid ) + ( display poly slash2 solid red red outlineStipple) + ( display polyBnd blank solid red red outline ) + ( display polyCut solid solid red red solid ) + ( display polyFuse X solid red red X ) + ( display polyGate X solid red red X ) + ( display polyHv hugeSlash2 solid red red outlineStipple) + ( display polyHvlabel lattice solid lightRed lightRed outlineStipple) + ( display polyHvpin lattice solid orange orange outlineStipple) + ( display polyLabel solid solid lightRed lightRed solid ) + ( display polyModel solid solid red red solid ) + ( display polyNet cross solid red red outlineStipple) + ( display polyPin lattice solid orange orange outlineStipple) + ( display polyProbe solid solid red red solid ) + ( display polyRes X solid red red X ) + ( display polyShort snow solid red red outlineStipple) + ( display post2 spareDots dashed tan tan outlineStipple) + ( display prBoundary blank solid purple purple outline ) + ( display prBoundaryBnd blank solid cyan cyan outline ) + ( display prBoundaryLbl blank solid purple purple outline ) + ( display prbdg slash solid gray gray outlineStipple) + ( display prunedg blank solid white yellow outline ) + ( display psdm spareDots22 solid purple purple outlineStipple) + ( display pwell spareDots solid cyan cyan outlineStipple) + ( display resist blank solid cyan cyan outline ) + ( display rpolyCut solid solid pink pink solid ) + ( display rpolyLabel solid solid purple purple solid ) + ( display rpolyPin lattice solid pink pink outlineStipple) + ( display rpolyRes X solid pink pink X ) + ( display select blank solid tan tan outline ) + ( display silm blank solid brown brown outline ) + ( display snap blank solid yellow yellow outline ) + ( display softFence blank solid yellow yellow outline ) + ( display solderMaskBottom blank solid yellow yellow outline ) + ( display solderMaskTop blank solid yellow yellow outline ) + ( display spike blank solid purple purple outline ) + ( display stretch blank solid yellow yellow outline ) + ( display supply blank solid lime lime outline ) + ( display tap gray50 solid gold gold outlineStipple) + ( display tapBnd blank solid gold gold outline ) + ( display tapLabel solid solid lightGold lightGold solid ) + ( display tapNet cross solid gold gold outlineStipple) + ( display tapPin grid solid gold gold outlineStipple) + ( display target blank solid blue blue outline ) + ( display text blank solid white white outline ) + ( display text1 blank dashed white white outline ) + ( display text2 solid solid white white solid ) + ( display tunm slash2 solid purple purple outlineStipple) + ( display unknown blank solid yellow yellow outline ) + ( display unset blank solid forest forest outline ) + ( display via solid solid violet violet solid ) + ( display via2 X thickLine orange orange X ) + ( display via2Bnd blank solid orange orange outline ) + ( display via2Net cross solid orange orange outlineStipple) + ( display via2Pin grid solid orange orange outlineStipple) + ( display via3 X thickLine forest forest X ) + ( display via3Bnd blank solid forest forest outline ) + ( display via3Net cross solid forest forest outlineStipple) + ( display via3Pin grid solid forest forest outlineStipple) + ( display via4 X thickLine yellow yellow X ) + ( display via4Bnd blank solid yellow yellow outline ) + ( display via4Net cross solid yellow yellow outlineStipple) + ( display via4Pin grid solid yellow yellow outlineStipple) + ( display via5 X thickLine brown brown X ) + ( display via5Bnd blank solid brown brown outline ) + ( display via5Net cross solid brown brown outlineStipple) + ( display via5Pin grid solid brown brown outlineStipple) + ( display via6 X thickLine pink pink X ) + ( display via6Bnd blank solid pink pink outline ) + ( display via6Net cross solid pink pink outlineStipple) + ( display via6Pin grid solid pink pink outlineStipple) + ( display via7 X thickLine lime lime X ) + ( display via7Bnd blank solid lime lime outline ) + ( display via7Net cross solid lime lime outlineStipple) + ( display via7Pin grid solid lime lime outlineStipple) + ( display viaBnd blank solid violet violet outline ) + ( display viaNet cross solid violet violet outlineStipple) + ( display viaPin grid solid lightViolet lightViolet outlineStipple) + ( display wire solid solid cadetBlue cadetBlue solid ) + ( display wireFlt blank dashed red red outline ) + ( display wireLbl solid solid cadetBlue cadetBlue solid ) + ( display wirebond blank solid yellow yellow outline ) + ( display wirebondFingerGuide blank solid yellow yellow outline ) + ( display y0 blank solid yellow yellow outline ) + ( display y0Flt blank solid yellow yellow outline ) + ( display y1 blank solid red red outline ) + ( display y1Flt blank solid red red outline ) + ( display y2 blank solid green green outline ) + ( display y2Flt blank solid green green outline ) + ( display y3 blank solid magenta magenta outline ) + ( display y3Flt blank solid magenta magenta outline ) + ( display y4 blank solid cyan cyan outline ) + ( display y4Flt blank solid cyan cyan outline ) + ( display y5 blank solid purple purple outline ) + ( display y5Flt blank solid purple purple outline ) + ( display y6 blank solid orange orange outline ) + ( display y6Flt blank solid orange orange outline ) + ( display y7 blank solid gold gold outline ) + ( display y7Flt blank solid gold gold outline ) + ( display y8 blank solid blue blue outline ) + ( display y8Flt blank solid blue blue outline ) + ( display y9 blank solid silver silver outline ) + ( display y9Flt blank solid silver silver outline ) +) diff --git a/sky130_cds/VirtuosoOA/layer.map b/sky130_cds/VirtuosoOA/layer.map new file mode 100755 index 000000000..1f5cbd87a --- /dev/null +++ b/sky130_cds/VirtuosoOA/layer.map @@ -0,0 +1,335 @@ +#Layer Name Layer Purpose Layer Stream Number Datatype Stream Number + +areaid analog 81 79 +areaid core 81 2 +areaid critCorner 81 51 +areaid critSid 81 52 +areaid deadZon 81 50 +areaid dieCut 81 11 +areaid diode 81 23 +areaid esd 81 19 +areaid etest 81 101 +areaid extendedDrain 81 57 +areaid frame 81 3 +areaid frameRect 81 12 +areaid hvnwell 81 63 +areaid injection 81 17 +areaid lowTapDensity 81 14 +areaid lvNative 81 60 +areaid moduleCut 81 10 +areaid notCritSide 81 15 +areaid opcDrop 81 54 +areaid photo 81 81 +areaid rdlprobepad 81 27 +areaid rfdiode 81 125 +areaid seal 81 1 +areaid sigPadDiff 81 6 +areaid sigPadMetNtr 81 8 +areaid sigPadWell 81 7 +areaid standardc 81 4 +areaid substrateCut 81 53 +areaid waffleWindow 81 13 +blanking drawing 124 40 +bump drawing 127 22 +capacitor drawing 82 64 +cbump mask 101 0 +cctm1 drawing 101 44 +cctm1 mask 35 0 +cctm1 maskAdd 101 43 +cctm1 maskDrop 101 42 +ccu1m mask 93 0 +cdnm drawing 110 20 +cdnm mask 48 0 +cdnm maskAdd 110 21 +cdnm maskDrop 110 22 +cfom drawing 22 20 +cfom mask 23 0 +cfom maskAdd 22 21 +cfom maskDrop 22 22 +cfom waffleDrop 22 24 +chvntm drawing 38 20 +chvntm mask 39 0 +chvntm maskAdd 38 21 +chvntm maskDrop 38 22 +chvtpm drawing 88 44 +chvtpm mask 97 0 +chvtpm maskAdd 97 43 +chvtpm maskDrop 97 42 +chvtrm drawing 98 44 +chvtrm mask 98 0 +chvtrm maskAdd 98 43 +chvtrm maskDrop 98 42 +cldntm drawing 11 20 +cldntm mask 11 0 +cli1m drawing 115 44 +cli1m mask 56 0 +cli1m maskAdd 115 43 +cli1m maskDrop 115 42 +clicm1 drawing 106 44 +clicm1 mask 43 0 +clicm1 maskAdd 106 43 +clicm1 maskDrop 106 42 +clvom drawing 45 20 +clvom mask 46 0 +clvom maskAdd 45 21 +clvom maskDrop 45 22 +clvtnm drawing 25 44 +clvtnm mask 25 0 +clvtnm maskAdd 25 43 +clvtnm maskDrop 25 42 +cmm1 drawing 62 20 +cmm1 mask 36 0 +cmm1 maskAdd 62 21 +cmm1 maskDrop 62 22 +cmm1 waffleDrop 62 24 +cmm2 drawing 105 44 +cmm2 mask 41 0 +cmm2 maskAdd 105 43 +cmm2 maskDrop 105 42 +cmm2 waffleDrop 105 52 +cmm3 drawing 107 20 +cmm3 mask 34 0 +cmm3 maskAdd 107 21 +cmm3 maskDrop 107 22 +cmm3 waffleDrop 107 24 +cmm4 mask 51 0 +cmm4 maskAdd 112 43 +cmm4 maskDrop 112 42 +cmm4 waffleDrop 112 4 +cmm5 mask 59 0 +cmm5 waffleDrop 117 4 +cncm drawing 96 44 +cncm mask 17 0 +cnpc drawing 44 20 +cnpc mask 49 0 +cnpc maskAdd 44 43 +cnpc maskDrop 44 42 +cnsdm drawing 29 20 +cnsdm mask 30 0 +cnsdm maskAdd 29 21 +cnsdm maskDrop 29 22 +cnsm mask 22 0 +cntm drawing 26 20 +cntm mask 27 0 +cntm maskAdd 26 21 +cntm maskDrop 26 22 +cnwm drawing 109 44 +cnwm mask 21 0 +cnwm maskAdd 109 43 +cnwm maskDrop 109 42 +conom drawing 87 44 +conom mask 88 0 +conom maskAdd 87 43 +conom maskDrop 87 42 +cp1m drawing 33 44 +cp1m mask 28 0 +cp1m maskAdd 33 43 +cp1m maskDrop 33 42 +cp1m waffleDrop 33 24 +cpbo mask 99 0 +cpdm drawing 104 44 +cpdm mask 37 0 +cpdm maskAdd 104 43 +cpdm maskDrop 104 42 +cpmm drawing 91 44 +cpmm2 mask 94 0 +cpsdm drawing 31 20 +cpsdm mask 32 0 +cpsdm maskAdd 31 21 +cpsdm maskDrop 31 22 +crpm drawing 53 44 +crpm mask 96 0 +crpm maskAdd 53 43 +crpm maskDrop 53 42 +#crrpm mask 102 0 +ctunm drawing 96 20 +ctunm mask 20 0 +ctunm maskAdd 96 21 +ctunm maskDrop 96 22 +cubm mask 100 0 +cviam drawing 105 20 +cviam mask 40 0 +cviam maskAdd 105 21 +cviam maskDrop 105 22 +cviam2 drawing 108 20 +cviam2 mask 44 0 +cviam2 maskAdd 108 21 +cviam2 maskDrop 108 22 +cviam3 drawing 112 20 +cviam3 mask 50 0 +cviam3 maskAdd 112 21 +cviam3 maskDrop 112 22 +cviam4 drawing 117 20 +cviam4 mask 58 0 +cviam4 maskAdd 117 21 +cviam4 maskDrop 117 22 +diff boundary 65 4 +diff cut 65 14 +diff drawing 65 20 +diff hv 65 8 +diff label 65 6 +diff net 65 23 +diff pin 65 16 +diff res 65 13 +dnwell drawing 64 18 +fom dummy 22 23 +hvi drawing 75 20 +hvntm drawing 125 20 +hvtp drawing 78 44 +hvtr drawing 18 20 +inductor drawing 82 24 +inductor label 82 25 +inductor term1 82 26 +inductor term2 82 27 +inductor term3 82 28 +ldntm drawing 11 44 +li1 blockage 67 10 +li1 boundary 67 4 +li1 cut 67 14 +li1 drawing 67 20 +li1 label 67 5 +li1 net 67 23 +li1 pin 67 16 +li1 probe 67 25 +li1 res 67 13 +li1 short 67 15 +licon1 boundary 66 60 +licon1 drawing 66 44 +licon1 net 66 41 +licon1 pin 66 58 +lvtn drawing 125 44 +marker error 83 6 +marker warning 83 7 +mcon boundary 67 60 +mcon drawing 67 44 +mcon net 67 41 +mcon pin 67 48 +met1 blockage 68 10 +met1 boundary 68 4 +met1 cut 68 14 +met1 drawing 68 20 +met1 label 68 5 +met1 net 68 23 +met1 pin 68 16 +met1 probe 68 25 +met1 res 68 13 +met1 short 68 15 +met2 blockage 69 10 +met2 boundary 69 4 +met2 cut 69 14 +met2 drawing 69 20 +met2 label 69 5 +met2 net 69 23 +met2 pin 69 16 +met2 probe 69 25 +met2 res 69 13 +met2 short 69 15 +met3 blockage 70 10 +met3 boundary 70 4 +met3 cut 70 14 +met3 drawing 70 20 +met3 fuse 70 17 +met3 label 70 5 +met3 net 70 23 +met3 pin 70 16 +met3 probe 70 25 +met3 res 70 13 +met3 short 70 15 +met4 blockage 71 10 +met4 boundary 71 4 +met4 cut 71 14 +met4 drawing 71 20 +met4 fuse 71 17 +met4 label 71 5 +met4 net 71 23 +met4 pin 71 16 +met4 probe 71 25 +met4 res 71 13 +met4 short 71 15 +met5 blockage 72 10 +met5 boundary 72 4 +met5 cut 72 14 +met5 drawing 72 20 +met5 fuse 72 17 +met5 label 72 5 +met5 net 72 23 +met5 pin 72 16 +met5 probe 72 25 +met5 res 72 13 +met5 short 72 15 +ncm drawing 92 44 +npc drawing 95 20 +npn drawing 82 20 +npn label 82 5 +nsdm drawing 93 44 +nsm drawing 61 20 +nwell drawing 64 20 +nwell label 64 5 +nwell net 84 23 +nwell pin 64 16 +overlap boundary 90 4 +overlap drawing 90 20 +pad drawing 76 20 +pad label 76 5 +pad pin 76 16 +padCenter drawing 81 20 +pmm drawing 85 44 +pmm2 drawing 77 20 +pnp drawing 82 44 +pnp label 82 59 +poly boundary 66 4 +poly cut 66 14 +poly drawing 66 20 +poly gate 66 9 +poly label 66 5 +poly model 66 83 +poly net 66 23 +poly pin 66 16 +poly probe 66 25 +poly res 66 13 +poly short 66 15 +prBoundary boundary 235 4 +prBoundary drawing 235 0 +prune drawing 84 44 +psdm drawing 94 20 +pwell cut 64 14 +pwell drawing 64 44 +pwell label 64 59 +pwell pin 122 16 +pwell res 64 13 +pwelliso label 44 5 +pwelliso pin 44 16 +rdl cut 74 14 +rdl drawing 74 20 +rdl label 74 5 +rdl pin 74 16 +rdl res 74 13 +rdl short 74 15 +rpm drawing 86 20 +#rrpm drawing 102 20 +tap boundary 65 60 +tap drawing 65 44 +tap label 65 5 +tap net 65 41 +tap pin 65 48 +target drawing 76 44 +text drawing 83 44 +tunm drawing 80 20 +ubm drawing 127 21 +vhvi drawing 74 21 +via boundary 68 60 +via drawing 68 44 +via net 68 41 +via pin 68 58 +via2 boundary 69 60 +via2 drawing 69 44 +via2 net 69 41 +via2 pin 69 58 +via3 boundary 70 60 +via3 drawing 70 44 +via3 net 70 41 +via3 pin 70 48 +via4 boundary 71 60 +via4 drawing 71 44 +via4 net 71 41 +via4 pin 71 48 diff --git a/sky130_cds/VirtuosoOA/lvsrpt.wrn b/sky130_cds/VirtuosoOA/lvsrpt.wrn new file mode 100644 index 000000000..e24568cd3 --- /dev/null +++ b/sky130_cds/VirtuosoOA/lvsrpt.wrn @@ -0,0 +1,7 @@ +Assura Errors & Warnings Search (PLEASE CAREFULLY REVIEW THESE MESSAGES) +================================================================================ +WARNINGS & ERRORS found in Assura NVN Run Log file +-------------------------------------------------------------------------------- + ERROR (AVLVSNN-10134) : CDL parser encountered error in file '/home/jstine/Desktop/inv.sp' on line 19: unknown Cdl/Spice construct +pX3_noxref noxref_5 A A PROBETYPE=1 +^^^^^^^^^^_________________________ diff --git a/sky130_cds/VirtuosoOA/sky130.sh b/sky130_cds/VirtuosoOA/sky130.sh new file mode 100755 index 000000000..2ad2451af --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130.sh @@ -0,0 +1,3 @@ +#!/bin/sh +setenv PDK_HOME $HOME/Desktop/sky130_cds/ +#setEnvVal CDS_DISABLE_USER_DEFINED_CST_REPORT 1 diff --git a/sky130_cds/VirtuosoOA/sky130.tf b/sky130_cds/VirtuosoOA/sky130.tf new file mode 100755 index 000000000..04dc2af45 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130.tf @@ -0,0 +1,2143 @@ +; Technology File sky130 + + + + +;******************************** +; CONTROLS +;******************************** +controls( + techVersion("1.0") + + techParams( + ;( parameter value ) + ;( ---------- ----- ) + ( TECHtechnology "sky130" ) + ( iccLayers ((("nwell" "drawing") "n_well" "off" 0.84 1.27 nil nil) (("diff" "drawing") "n_diffusion" "off" 0.15 0.27 nil nil) (("tap" "drawing") "n_diffusion" "off" 0.15 0.27 nil nil) (("poly" "drawing") "polysilicon" "orthogonal" 0.15 0.21 nil t) (("licon1" "drawing") "cut" "off" 0.17 0.17 nil t) (("li1" "drawing") "metal" "orthogonal" 0.17 0.17 nil t) (("mcon" "drawing") "cut" "off" 0.17 0.19 nil t) (("met1" "drawing") "metal" "orthogonal" 0.14 0.14 nil t) (("via" "drawing") "cut" "off" 0.15 0.17 nil t) (("met2" "drawing") "metal" "orthogonal" 0.14 0.14 nil t) (("via2" "drawing") "cut" "off" 0.2 0.2 nil t) (("met3" "drawing") "metal" "orthogonal" 0.3 0.3 nil t) (("via3" "drawing") "cut" "off" 0.2 0.2 nil t) (("met4" "drawing") "metal" "orthogonal" 0.3 0.3 nil t) (("via4" "drawing") "cut" "off" 0.8 0.8 nil t) (("met5" "drawing") "metal" "orthogonal" 1.6 1.6 nil t)) ) + ( iccEquivalentLayers ((("diff" "drawing") ("diff" "pin")) (("poly" "drawing") ("poly" "pin")) (("li1" "drawing") ("li1" "pin")) (("met1" "drawing") ("met1" "pin") ("met1" "net")) (("met2" "drawing") ("met2" "pin") ("met2" "net")) (("met3" "drawing") ("met3" "pin") ("met3" "net")) (("met4" "drawing") ("met4" "pin") ("met4" "net")) (("met5" "drawing") ("met5" "pin") ("met5" "net"))) ) + ( iccBoundaryLayers ((("nwell" "drawing") ("prBoundary" "drawing") 0.0) (("diff" "drawing") ("prBoundary" "drawing") 0.0) (("tap" "drawing") ("prBoundary" "drawing") 0.0) (("poly" "drawing") ("prBoundary" "drawing") 0.0) (("licon1" "drawing") ("prBoundary" "drawing") 0.0) (("li1" "drawing") ("prBoundary" "drawing") 0.0) (("mcon" "drawing") ("prBoundary" "drawing") 0.0) (("met1" "drawing") ("prBoundary" "drawing") 0.0) (("via" "drawing") ("prBoundary" "drawing") 0.0) (("met2" "drawing") ("prBoundary" "drawing") 0.0) (("via2" "drawing") ("prBoundary" "drawing") 0.0) (("met3" "drawing") ("prBoundary" "drawing") 0.0) (("via3" "drawing") ("prBoundary" "drawing") 0.0) (("met4" "drawing") ("prBoundary" "drawing") 0.0) (("met5" "drawing") ("prBoundary" "drawing") 0.0)) ) + ( iccKeepouts ((nil (("size" (("target" "drawing") nil) "fuseRegion" "routing" t) ("or" (("diff" "drawing") ("tap" "drawing")) "tempfom" "routing" t) ("size" ("tempfom" -0.135) ("poly" "drawing") "routing" t) ("c-not" (("poly" "drawing") "tempfom") ("poly" "drawing") "routing" t) ("c-not" (("poly" "drawing") ("poly" "res")) ("poly" "drawing") "routing" t) ("=>" ("fuseRegion") ("poly" "drawing") "routing" t) ("c-not" (("li1" "drawing") ("li1" "res")) ("li1" "drawing") "routing" t) ("=>" ("fuseRegion") ("li1" "drawing") "routing" t) ("c-not" (("met1" "drawing") ("met1" "res")) ("met1" "drawing") "routing" t) ("c-not" (("met1" "drawing") ("met1" "short")) ("met1" "drawing") "routing" t) ("=>" (("met1" "option1")) ("met1" "drawing") "routing" t) ("=>" (("met1" "option2")) ("met1" "drawing") "routing" t) ("=>" (("met1" "option3")) ("met1" "drawing") "routing" t) ("=>" (("met1" "option4")) ("met1" "drawing") "routing" t) ("=>" (("met1" "option5")) ("met1" "drawing") "routing" t) ("=>" (("met1" "option6")) ("met1" "drawing") "routing" t) ("=>" (("met1" "option7")) ("met1" "drawing") "routing" t) ("=>" (("met1" "option8")) ("met1" "drawing") "routing" t) ("=>" ("fuseRegion") ("met1" "drawing") "routing" t) ("c-not" (("met2" "drawing") ("met2" "res")) ("met2" "drawing") "routing" t) ("c-not" (("met2" "drawing") ("met2" "short")) ("met2" "drawing") "routing" t) ("c-not" (("met2" "drawing") ("met2" "fuse")) ("met2" "drawing") "routing" t) ("=>" (("met2" "option1")) ("met2" "drawing") "routing" t) ("=>" (("met2" "option2")) ("met2" "drawing") "routing" t) ("=>" (("met2" "option3")) ("met2" "drawing") "routing" t) ("=>" (("met2" "option4")) ("met2" "drawing") "routing" t) ("=>" (("met2" "option5")) ("met2" "drawing") "routing" t) ("=>" (("met2" "option6")) ("met2" "drawing") "routing" t) ("=>" (("met2" "option7")) ("met2" "drawing") "routing" t) ("=>" (("met2" "option8")) ("met2" "drawing") "routing" t) ("=>" ("fuseRegion") ("met2" "drawing") "routing" t) ("c-not" (("met3" "drawing") ("met3" "res")) ("met3" "drawing") "routing" t) ("c-not" (("met3" "drawing") ("met3" "short")) ("met3" "drawing") "routing" t) ("c-not" (("met3" "drawing") ("met3" "fuse")) ("met3" "drawing") "routing" t) ("=>" (("met3" "option1")) ("met3" "drawing") "routing" t) ("=>" (("met3" "option2")) ("met3" "drawing") "routing" t) ("=>" (("met3" "option3")) ("met3" "drawing") "routing" t) ("=>" (("met3" "option4")) ("met3" "drawing") "routing" t) ("=>" (("met3" "option5")) ("met3" "drawing") "routing" t) ("=>" (("met3" "option6")) ("met3" "drawing") "routing" t) ("=>" (("met3" "option7")) ("met3" "drawing") "routing" t) ("=>" (("met3" "option8")) ("met3" "drawing") "routing" t) ("=>" ("fuseRegion") ("met3" "drawing") "routing" t) ("c-not" (("met4" "drawing") ("met4" "res")) ("met4" "drawing") "routing" t) ("c-not" (("met4" "drawing") ("met4" "short")) ("met4" "drawing") "routing" t) ("c-not" (("met4" "drawing") ("met4" "fuse")) ("met4" "drawing") "routing" t) ("=>" (("met4" "option1")) ("met4" "drawing") "routing" t) ("=>" (("met4" "option2")) ("met4" "drawing") "routing" t) ("=>" (("met4" "option3")) ("met4" "drawing") "routing" t) ("=>" (("met4" "option4")) ("met4" "drawing") "routing" t) ("=>" (("met4" "option5")) ("met4" "drawing") "routing" t) ("=>" (("met4" "option6")) ("met4" "drawing") "routing" t) ("=>" (("met4" "option7")) ("met4" "drawing") "routing" t) ("=>" (("met4" "option8")) ("met4" "drawing") "routing" t) ("=>" ("fuseRegion") ("met4" "drawing") "routing" t) ("c-not" (("met5" "drawing") ("met5" "res")) ("met5" "drawing") "routing" t) ("c-not" (("met5" "drawing") ("met5" "short")) ("met5" "drawing") "routing" t) ("c-not" (("met5" "drawing") ("met5" "fuse")) ("met5" "drawing") "routing" t) ("=>" (("met5" "option1")) ("met5" "drawing") "routing" t) ("=>" (("met5" "option2")) ("met5" "drawing") "routing" t) ("=>" (("met5" "option3")) ("met5" "drawing") "routing" t) ("=>" (("met5" "option4")) ("met5" "drawing") "routing" t) ("=>" (("met5" "option5")) ("met5" "drawing") "routing" t) ("=>" (("met5" "option6")) ("met5" "drawing") "routing" t) ("=>" (("met5" "option7")) ("met5" "drawing") "routing" t) ("=>" (("met5" "option8")) ("met5" "drawing") "routing" t) ("=>" ("fuseRegion") ("met5" "drawing") "routing" t)))) ) + ) ;techParams + + viewTypeUnits( + ;( viewType userUnit dbuperuu ) + ;( -------- -------- -------- ) + ) ;viewTypeUnits + + mfgGridResolution( + ( 0.005000 ) + ) ;mfgGridResolution + + refTechLibs( +; techLibName +; ----------- + ) ;refTechLibs + + processFamily( + ) ;processFamily + + distanceMeasure( + ) ;distanceMeasure + + processNode() + +) ;controls + + +;******************************** +; LAYER DEFINITION +;******************************** +layerDefinitions( + + techPurposes( + ;( PurposeName Purpose# Abbreviation ) + ;( ----------- -------- ------------ ) + ;User-Defined Purposes: + ( seal 1 ) + ( core 2 ) + ( frame 3 ) + ( waffleDrop 4 ) + ( standardc 5 ) + ( sigPadDiff 6 ) + ( sigPadWell 7 ) + ( sigPadMetNtr 8 ) + ( ferro 9 ) + ( moduleCut 10 ) + ( dieCut 11 ) + ( frameRect 12 ) + ( zener 13 ) + ( extDrain20 14 ) + ( cut 15 ) + ( res 16 ) + ( esd 17 ) + ( tmppnp 18 ) + ( short 19 ) + ( mask 20 ) + ( maskAdd 21 ) + ( maskDrop 22 ) + ( diode 23 ) + ( fuse 24 ) + ( gate 25 ) + ( hvnwell 26 ) + ( rdlprobepad 27 ) + ( hv 28 ) + ( probe 29 ) + ( extFab 30 ) + ( option1 31 ) + ( option2 32 ) + ( option3 33 ) + ( option4 34 ) + ( option5 35 ) + ( option6 36 ) + ( option7 37 ) + ( option8 38 ) + ( precres 39 ) + ( silicon 40 ) + ( vlc 41 ) + ( met3 42 ) + ( met2 43 ) + ( met1 44 ) + ( li1 45 ) + ( poly 46 ) + ( injection 47 ) + ( nodnw 49 ) + ( deadZon 50 ) + ( critCorner 51 ) + ( critSid 52 ) + ( substrateCut 53 ) + ( opcDrop 54 ) + ( cuPillar 55 ) + ( techCd 56 ) + ( term1 57 ) + ( term2 58 ) + ( term3 59 ) + ( scr 60 ) + ( port 61 ) + ( port1 62 ) + ( region 63 ) + ( ppath 65 ) + ( ppath1 66 ) + ( macro 67 ) + ( nwellIsolation 68 ) + ( waffleWindow 69 ) + ( block 70 ) + ( waffleAdd1 71 ) + ( waffleAdd2 72 ) + ( cuDrop 74 ) + ( extendedDrain 75 ) + ( subcktDevice 76 ) + ( pixel 77 ) + ( capacitor 78 ) + ( analog 79 ) + ( lvdnw 80 ) + ( photo 81 ) + ( guardring 82 ) + ( model 83 ) + ( ipExempt 84 ) + ( pitch 85 ) + ( HighVt 86 ) + ( lvNative 87 ) + ( psa1 88 ) + ( psa2 89 ) + ( psa3 90 ) + ( psa4 91 ) + ( psa5 92 ) + ( psa6 93 ) + ( hole 94 ) + ( select 95 ) + ( dummy 96 ) + ( umconly 97 ) + ( opc 98 ) + ( nodummy 99 ) + ( drc 100 ) + ( etest 101 ) + ( vss 102 ) + ( fc 103 ) + ( fix 104 ) + ( mim 105 ) + ( nmim 106 ) + ( pad 107 ) + ( per 108 ) + ( cvs 109 ) + ( ext 110 ) + ( ip 111 ) + ( low_vt 112 ) + ( cis_array 113 ) + ( imagers 114 ) + ( t3 115 ) + ( logic 116 ) + ( dio 117 ) + ( cap 118 ) + ( res1 119 ) + ( bjt 120 ) + ( efuseMark 121 ) + ( slotBlock 122 ) + ( fuseMark 123 ) + ( umcIP 124 ) + ( rfdiode 125 ) + ( lowTapDensity 126 ) + ( notCritSide 127 ) + ;System-Reserved Purposes: + ) ;techPurposes + + techLayers( + ;( LayerName Layer# Abbreviation ) + ;( --------- ------ ------------ ) + ;User-Defined Layers: + ( nwell 0 nwell ) + ( pwell 1 pwell ) + ( diff 2 diff ) + ( tap 3 tap ) + ( poly 4 poly ) + ( mcon 5 mcon ) + ( met1 6 met1 ) + ( via 7 via ) + ( met2 8 met2 ) + ( via2 9 via2 ) + ( met3 10 met3 ) + ( pad 11 pad ) + ( via3 12 via3 ) + ( met4 13 met4 ) + ( via4 14 via4 ) + ( met5 15 met5 ) + ( prune 21 prune ) + ( li1 22 li1 ) + ( dnwell 23 dnwell ) + ( inductor 24 inducto ) + ( lvtn 25 lvtn ) + ( nsdm 30 nsdm ) + ( psdm 31 psdm ) + ( hvntm 36 hvntm ) + ( cnsm 37 cnsm ) + ( tunm 41 tunm ) + ( hvi 42 hvi ) + ( licon1 43 licon1 ) + ( padCenter 45 padCent ) + ( nsm 47 nsm ) + ( cfom 52 cfom ) + ( ldntm 53 ldntm ) + ( cp1m 55 cp1m ) + ( cnsdm 56 cnsdm ) + ( cpsdm 57 cpsdm ) + ( cntm 58 cntm ) + ( cctm1 59 cctm1 ) + ( cmm1 60 cmm1 ) + ( cviam 61 cviam ) + ( cmm2 62 cmm2 ) + ( cviam2 63 cviam2 ) + ( cmm3 64 cmm3 ) + ( cpdm 66 cpdm ) + ( cviam3 67 cviam3 ) + ( cmm4 68 cmm4 ) + ( cviam4 69 cviam4 ) + ( cmm5 70 cmm5 ) + ( capm 75 capm ) + ( pmm 76 pmm ) + ( fom 77 fom ) + ( cdnm 79 cdnm ) + ( cli1m 83 cli1m ) + ( chvtpm 85 chvtpm ) + ( cap2m 86 cap2m ) + ( crpm 87 crpm ) + ( vhvi 88 vhvi ) + ( clvom 89 clvom ) + ( cncm 90 cncm ) + ( ctunm 91 ctunm ) + ( hvtp 92 hvtp ) + ( conom 93 conom ) + ( clicm1 95 clicm1 ) + ( ncm 96 ncm ) + ( cpmm 97 cpmm ) + ( overlap 99 overlap ) + ( pnp 101 pnp ) + ( chvntm 102 chvntm ) + ( capacitor 103 capacit ) + ( rpm 106 rpm ) + ( target 107 target ) + ( cnwm 109 cnwm ) + ( areaid 110 areaid ) + ( npn 111 npn ) + ( hvtr 113 hvtr ) + ( cpmm2 114 cpmm2 ) + ( npc 115 npc ) + ( cnpc 116 cnpc ) + ( pmm2 117 pmm2 ) + ( chvtrm 118 chvtrm ) + ( cpbo 119 cpbo ) + ( clvtnm 120 clvtnm ) + ( pwelliso 122 pwellis ) + ( blanking 123 blankin ) + ( cldntm 126 cldntm ) + ( rdl 136 rdl ) + ( ubm 140 ubm ) + ( bump 141 bump ) + ( ccu1m 142 ccu1m ) + ( cubm 143 cubm ) + ( cbump 144 cbump ) + ;System-Reserved Layers: + ) ;techLayers + + techLayerPurposePriorities( + ;layers are ordered from lowest to highest priority + ;( LayerName Purpose ) + ;( --------- ------- ) + ( prBoundary boundary ) + ( pwell drawing ) + ( pwell pin ) + ( pwell label ) + ( pwell res ) + ( pwell cut ) + ( pwelliso pin ) + ( pwelliso label ) + ( nwell drawing ) + ( nwell net ) + ( nwell pin ) + ( nwell label ) + ( dnwell drawing ) + ( vhvi drawing ) + ( diff drawing ) + ( diff res ) + ( diff cut ) + ( diff pin ) + ( diff label ) + ( diff net ) + ( diff boundary ) + ( diff hv ) + ( tap drawing ) + ( tap pin ) + ( tap net ) + ( tap boundary ) + ( tap label ) + ( psdm drawing ) + ( nsdm drawing ) + ( poly drawing ) + ( poly pin ) + ( poly res ) + ( poly cut ) + ( poly gate ) + ( poly label ) + ( poly boundary ) + ( poly probe ) + ( poly short ) + ( poly net ) + ( poly model ) + ( ldntm drawing ) + ( lvtn drawing ) + ( hvtp drawing ) + ( hvtr drawing ) + ( tunm drawing ) + ( licon1 drawing ) + ( licon1 grid ) + ( licon1 blockage ) + ( licon1 boundary ) + ( licon1 pin ) + ( licon1 net ) + ( npc drawing ) + ( li1 drawing ) + ( li1 grid ) + ( li1 pin ) + ( li1 res ) + ( li1 cut ) + ( li1 label ) + ( li1 net ) + ( li1 boundary ) + ( li1 blockage ) + ( li1 short ) + ( li1 probe ) + ( mcon drawing ) + ( mcon grid ) + ( mcon blockage ) + ( mcon boundary ) + ( mcon pin ) + ( mcon net ) + ( met1 drawing ) + ( met1 grid ) + ( met1 res ) + ( met1 cut ) + ( met1 pin ) + ( met1 label ) + ( met1 net ) + ( met1 boundary ) + ( met1 blockage ) + ( met1 short ) + ( met1 probe ) + ( met1 option1 ) + ( met1 option2 ) + ( met1 option3 ) + ( met1 option4 ) + ( met1 option5 ) + ( met1 option6 ) + ( met1 option7 ) + ( met1 option8 ) + ( via drawing ) + ( via grid ) + ( via blockage ) + ( via boundary ) + ( via net ) + ( via pin ) + ( met2 drawing ) + ( met2 grid ) + ( met2 res ) + ( met2 cut ) + ( met2 pin ) + ( met2 label ) + ( met2 net ) + ( met2 boundary ) + ( met2 blockage ) + ( met2 short ) + ( met2 probe ) + ( met2 option1 ) + ( met2 option2 ) + ( met2 option3 ) + ( met2 option4 ) + ( met2 option5 ) + ( met2 option6 ) + ( met2 option7 ) + ( met2 option8 ) + ( via2 drawing ) + ( via2 grid ) + ( via2 blockage ) + ( via2 boundary ) + ( via2 pin ) + ( via2 net ) + ( met3 drawing ) + ( met3 grid ) + ( met3 res ) + ( met3 cut ) + ( met3 pin ) + ( met3 label ) + ( met3 net ) + ( met3 boundary ) + ( met3 blockage ) + ( met3 short ) + ( met3 fuse ) + ( met3 probe ) + ( met3 option1 ) + ( met3 option2 ) + ( met3 option3 ) + ( met3 option4 ) + ( met3 option5 ) + ( met3 option6 ) + ( met3 option7 ) + ( met3 option8 ) + ( via3 drawing ) + ( via3 grid ) + ( via3 blockage ) + ( via3 boundary ) + ( via3 pin ) + ( via3 net ) + ( met4 drawing ) + ( met4 grid ) + ( met4 res ) + ( met4 cut ) + ( met4 pin ) + ( met4 label ) + ( met4 net ) + ( met4 boundary ) + ( met4 blockage ) + ( met4 short ) + ( met4 fuse ) + ( met4 probe ) + ( met4 option1 ) + ( met4 option2 ) + ( met4 option3 ) + ( met4 option4 ) + ( met4 option5 ) + ( met4 option6 ) + ( met4 option7 ) + ( met4 option8 ) + ( via4 drawing ) + ( via4 grid ) + ( via4 blockage ) + ( via4 boundary ) + ( via4 pin ) + ( via4 net ) + ( met5 drawing ) + ( met5 grid ) + ( met5 res ) + ( met5 cut ) + ( met5 pin ) + ( met5 label ) + ( met5 net ) + ( met5 boundary ) + ( met5 blockage ) + ( met5 short ) + ( met5 fuse ) + ( met5 probe ) + ( met5 option1 ) + ( met5 option2 ) + ( met5 option3 ) + ( met5 option4 ) + ( met5 option5 ) + ( met5 option6 ) + ( met5 option7 ) + ( met5 option8 ) + ( nsm drawing ) + ( pad drawing ) + ( pad grid ) + ( pad blockage ) + ( pad label ) + ( pad pin ) + ( pnp drawing ) + ( pnp label ) + ( npn drawing ) + ( npn label ) + ( rpm drawing ) + ( hvi drawing ) + ( capacitor drawing ) + ( ncm drawing ) + ( cncm drawing ) + ( cncm mask ) + ( pmm drawing ) + ( pmm2 drawing ) + ( rdl drawing ) + ( rdl grid ) + ( rdl blockage ) + ( rdl pin ) + ( rdl label ) + ( rdl res ) + ( rdl cut ) + ( rdl short ) + ( rdl option1 ) + ( rdl option2 ) + ( rdl option3 ) + ( rdl option4 ) + ( rdl option5 ) + ( rdl option6 ) + ( rdl option7 ) + ( rdl option8 ) + ( ubm drawing ) + ( bump drawing ) + ( inductor drawing ) + ( inductor label ) + ( inductor term1 ) + ( inductor term2 ) + ( inductor term3 ) + ( cfom drawing ) + ( cfom mask ) + ( cfom maskAdd ) + ( cfom maskDrop ) + ( cfom waffleDrop ) + ( fom dummy ) + ( cnwm drawing ) + ( cnwm mask ) + ( cnwm maskAdd ) + ( cnwm maskDrop ) + ( cdnm drawing ) + ( cdnm mask ) + ( cdnm maskAdd ) + ( cdnm maskDrop ) + ( clvtnm drawing ) + ( clvtnm mask ) + ( clvtnm maskAdd ) + ( clvtnm maskDrop ) + ( chvtpm drawing ) + ( chvtpm mask ) + ( chvtpm maskAdd ) + ( chvtpm maskDrop ) + ( chvtrm drawing ) + ( chvtrm mask ) + ( chvtrm maskAdd ) + ( chvtrm maskDrop ) + ( ctunm drawing ) + ( ctunm mask ) + ( ctunm maskAdd ) + ( ctunm maskDrop ) + ( conom drawing ) + ( conom mask ) + ( conom maskAdd ) + ( conom maskDrop ) + ( cnsdm drawing ) + ( cnsdm mask ) + ( cnsdm maskAdd ) + ( cnsdm maskDrop ) + ( cpsdm drawing ) + ( cpsdm mask ) + ( cpsdm maskAdd ) + ( cpsdm maskDrop ) + ( cntm drawing ) + ( cntm mask ) + ( cntm maskAdd ) + ( cntm maskDrop ) + ( hvntm drawing ) + ( chvntm drawing ) + ( chvntm mask ) + ( chvntm maskAdd ) + ( chvntm maskDrop ) + ( cldntm drawing ) + ( cldntm mask ) + ( clvom drawing ) + ( clvom mask ) + ( clvom maskAdd ) + ( clvom maskDrop ) + ( cp1m drawing ) + ( cp1m mask ) + ( cp1m maskAdd ) + ( cp1m waffleDrop ) + ( cp1m maskDrop ) + ( cli1m drawing ) + ( cli1m mask ) + ( cli1m maskAdd ) + ( cli1m maskDrop ) + ( clicm1 drawing ) + ( clicm1 mask ) + ( clicm1 maskAdd ) + ( clicm1 maskDrop ) + ( cmm1 drawing ) + ( cmm1 mask ) + ( cmm1 maskAdd ) + ( cmm1 maskDrop ) + ( cmm1 waffleDrop ) + ( cviam drawing ) + ( cviam mask ) + ( cviam maskAdd ) + ( cviam maskDrop ) + ( cmm2 drawing ) + ( cmm2 mask ) + ( cmm2 maskAdd ) + ( cmm2 maskDrop ) + ( cmm2 waffleDrop ) + ( cviam2 drawing ) + ( cviam2 mask ) + ( cviam2 maskAdd ) + ( cviam2 maskDrop ) + ( cmm3 drawing ) + ( cmm3 mask ) + ( cmm3 maskAdd ) + ( cmm3 maskDrop ) + ( cmm3 waffleDrop ) + ( cnpc drawing ) + ( cnpc mask ) + ( cnpc maskAdd ) + ( cnpc maskDrop ) + ( cviam3 drawing ) + ( cviam3 mask ) + ( cviam3 maskAdd ) + ( cviam3 maskDrop ) + ( cnsm mask ) + ( cpdm drawing ) + ( cpdm mask ) + ( cpdm maskAdd ) + ( cpdm maskDrop ) + ( cpmm drawing ) + ( cpbo mask ) + ( cmm4 mask ) + ( cmm4 maskAdd ) + ( cmm4 maskDrop ) + ( cmm4 waffleDrop ) + ( cviam4 drawing ) + ( cviam4 mask ) + ( cviam4 maskAdd ) + ( cviam4 maskDrop ) + ( cmm5 mask ) + ( cmm5 waffleDrop ) + ( target drawing ) + ( cctm1 drawing ) + ( cctm1 mask ) + ( cctm1 maskAdd ) + ( cctm1 maskDrop ) + ( capm drawing ) + ( cap2m drawing ) + ( crpm drawing ) + ( crpm mask ) + ( crpm maskAdd ) + ( crpm maskDrop ) + ( ccu1m mask ) + ( cpmm2 mask ) + ( cubm mask ) + ( cbump mask ) + ( overlap drawing ) + ( overlap boundary ) + ( areaid lowTapDensity ) + ( areaid notCritSide ) + ( areaid injection ) + ( areaid rfdiode ) + ( areaid seal ) + ( areaid core ) + ( areaid frame ) + ( areaid esd ) + ( areaid dieCut ) + ( areaid moduleCut ) + ( areaid frameRect ) + ( areaid substrateCut ) + ( areaid diode ) + ( areaid standardc ) + ( areaid deadZon ) + ( areaid critCorner ) + ( areaid critSid ) + ( areaid opcDrop ) + ( areaid waffleWindow ) + ( areaid extendedDrain ) + ( areaid lvNative ) + ( areaid photo ) + ( areaid etest ) + ( areaid hvnwell ) + ( areaid rdlprobepad ) + ( areaid sigPadDiff ) + ( areaid sigPadWell ) + ( areaid sigPadMetNtr ) + ( areaid analog ) + ( prune drawing ) + ( padCenter drawing ) + ( met1 psa1 ) + ( met2 psa1 ) + ( met3 psa1 ) + ( met4 psa1 ) + ( met5 psa1 ) + ( met1 psa2 ) + ( met2 psa2 ) + ( met3 psa2 ) + ( met4 psa2 ) + ( met5 psa2 ) + ( met1 psa3 ) + ( met2 psa3 ) + ( met3 psa3 ) + ( met4 psa3 ) + ( met5 psa3 ) + ( met1 psa4 ) + ( met2 psa4 ) + ( met3 psa4 ) + ( met4 psa4 ) + ( met5 psa4 ) + ( met1 psa5 ) + ( met2 psa5 ) + ( met3 psa5 ) + ( met4 psa5 ) + ( met5 psa5 ) + ( met1 psa6 ) + ( met2 psa6 ) + ( met3 psa6 ) + ( met4 psa6 ) + ( met5 psa6 ) + ( rdl psa1 ) + ( rdl psa2 ) + ( rdl psa3 ) + ( rdl psa4 ) + ( rdl psa5 ) + ( rdl psa6 ) + ( blanking drawing ) + ) ;techLayerPurposePriorities + + techDisplays( + ;( LayerName Purpose Packet Vis Sel Con2ChgLy DrgEnbl Valid ) + ;( --------- ------- ------ --- --- --------- ------- ----- ) + ( prBoundary boundary prbdg t t t t t ) + ( pwell drawing pwell t t t t t ) + ( pwell pin rpolyPin t t t t t ) + ( pwell label rpolyLabel t t t t t ) + ( pwell res rpolyRes t t t t t ) + ( pwell cut rpolyCut t t t t t ) + ( pwelliso pin elm t t t t t ) + ( pwelliso label rpolyLabel t t t t t ) + ( nwell drawing nwell t t t t t ) + ( nwell net hilite1 t t t t t ) + ( nwell pin nwellPin t t t t t ) + ( nwell label nwellLabel t t t t t ) + ( dnwell drawing dnwell t t t t t ) + ( vhvi drawing VhviId t t t t t ) + ( diff drawing diff t t t t t ) + ( diff res diffRes t t t t t ) + ( diff cut diffCut t t t t t ) + ( diff pin diffPin t t t t nil ) + ( diff label diffLabel t t t t nil ) + ( diff net diffNet t t t t nil ) + ( diff boundary diffBnd t t t t nil ) + ( diff hv diffHv t t t t t ) + ( tap drawing tap t t t t t ) + ( tap pin tapPin t t t t nil ) + ( tap net tapNet t t t t nil ) + ( tap boundary tapBnd t t t t nil ) + ( tap label tapLabel t t t t nil ) + ( psdm drawing psdm t t t t t ) + ( nsdm drawing nsdm t t t t t ) + ( poly drawing poly t t t t t ) + ( poly pin polyPin t t t t t ) + ( poly res polyRes t t t t t ) + ( poly cut polyCut t t t t t ) + ( poly gate polyGate t t t t t ) + ( poly label polyLabel t t t t t ) + ( poly boundary polyBnd t t t t t ) + ( poly probe polyProbe t t t t t ) + ( poly short polyShort t t t t t ) + ( poly net polyNet t t t t t ) + ( poly model polyModel t t t t t ) + ( ldntm drawing met8 t t t t t ) + ( lvtn drawing lvtn t t t t t ) + ( hvtp drawing hvtp t t t t t ) + ( hvtr drawing hvtr t t t t nil ) + ( tunm drawing tunm t t t t t ) + ( licon1 drawing licon1 t t t t t ) + ( licon1 grid licon1 t nil nil nil nil ) + ( licon1 blockage licon1 t nil t t nil ) + ( licon1 boundary licon1Bnd t t t t t ) + ( licon1 pin licon1Pin t t t t nil ) + ( licon1 net licon1Net t t t t t ) + ( npc drawing silm t t t t t ) + ( li1 drawing li1 t t t t t ) + ( li1 grid li1 t nil nil nil nil ) + ( li1 pin li1Pin t t t t t ) + ( li1 res li1Res t t t t nil ) + ( li1 cut li1Cut t t t t nil ) + ( li1 label li1Label t t t t t ) + ( li1 net li1Net t t t t t ) + ( li1 boundary li1Bnd t t t t t ) + ( li1 blockage li1Blkg t t t t t ) + ( li1 short li1Short t t t t t ) + ( li1 probe li1Probe t t t t t ) + ( mcon drawing mcon t t t t t ) + ( mcon grid mcon t nil nil nil nil ) + ( mcon blockage mcon t nil t t nil ) + ( mcon boundary mconBnd t t t t t ) + ( mcon pin mconPin t t t t nil ) + ( mcon net mconNet t t t t t ) + ( met1 drawing met1 t t t t t ) + ( met1 grid met1 t nil nil nil nil ) + ( met1 res met1Res t t t t nil ) + ( met1 cut met1Cut t t t t nil ) + ( met1 pin met1Pin t t t t t ) + ( met1 label met1Label t t t t t ) + ( met1 net met1Net t t t t t ) + ( met1 boundary met1Bnd t t t t t ) + ( met1 blockage met1Blkg t t t t t ) + ( met1 short met1Short t t t t t ) + ( met1 probe met1Probe t t t t t ) + ( met1 option1 met1Metop1 t t t t nil ) + ( met1 option2 met1Metop2 t t t t nil ) + ( met1 option3 met1Metop3 t t t t nil ) + ( met1 option4 met1Metop4 t t t t nil ) + ( met1 option5 met1Metop5 t t t t nil ) + ( met1 option6 met1Metop6 t t t t nil ) + ( met1 option7 met1Metop7 t t t t nil ) + ( met1 option8 met1Metop8 t t t t nil ) + ( via drawing via t t t t t ) + ( via grid via t nil nil nil nil ) + ( via blockage via t nil t t nil ) + ( via boundary viaBnd t t t t t ) + ( via net viaNet t t t t t ) + ( via pin viaPin t t t t nil ) + ( met2 drawing met2 t t t t t ) + ( met2 grid met2 t nil nil nil nil ) + ( met2 res met2Res t t t t nil ) + ( met2 cut met2Cut t t t t nil ) + ( met2 pin met2Pin t t t t t ) + ( met2 label met2Label t t t t t ) + ( met2 net met2Net t t t t t ) + ( met2 boundary met2Bnd t t t t t ) + ( met2 blockage met2Blkg t t t t t ) + ( met2 short met2Short t t t t t ) + ( met2 probe met2Probe t t t t t ) + ( met2 option1 met2Metop1 t t t t nil ) + ( met2 option2 met2Metop2 t t t t nil ) + ( met2 option3 met2Metop3 t t t t nil ) + ( met2 option4 met2Metop4 t t t t nil ) + ( met2 option5 met2Metop5 t t t t nil ) + ( met2 option6 met2Metop6 t t t t nil ) + ( met2 option7 met2Metop7 t t t t nil ) + ( met2 option8 met2Metop8 t t t t nil ) + ( via2 drawing via2 t t t t t ) + ( via2 grid via2 t nil nil nil nil ) + ( via2 blockage via2 t nil t t nil ) + ( via2 boundary via2Bnd t t t t t ) + ( via2 pin via2Pin t t t t nil ) + ( via2 net via2Net t t t t t ) + ( met3 drawing met3 t t t t t ) + ( met3 grid met3 t nil nil nil nil ) + ( met3 res met3Res t t t t nil ) + ( met3 cut met3Cut t t t t nil ) + ( met3 pin met3Pin t t t t t ) + ( met3 label met3Label t t t t t ) + ( met3 net met3Net t t t t t ) + ( met3 boundary met3Bnd t t t t t ) + ( met3 blockage met3Blkg t t t t t ) + ( met3 short met3Short t t t t t ) + ( met3 fuse met3Fuse t t t t nil ) + ( met3 probe met3Probe t t t t t ) + ( met3 option1 met3Metop1 t t t t nil ) + ( met3 option2 met3Metop2 t t t t nil ) + ( met3 option3 met3Metop3 t t t t nil ) + ( met3 option4 met3Metop4 t t t t nil ) + ( met3 option5 met3Metop5 t t t t nil ) + ( met3 option6 met3Metop6 t t t t nil ) + ( met3 option7 met3Metop7 t t t t nil ) + ( met3 option8 met3Metop8 t t t t nil ) + ( via3 drawing via3 t t t t t ) + ( via3 grid via3 t nil nil nil nil ) + ( via3 blockage via3 t nil t t nil ) + ( via3 boundary via3Bnd t t t t t ) + ( via3 pin via3Pin t t t t nil ) + ( via3 net via3Net t t t t t ) + ( met4 drawing met4 t t t t t ) + ( met4 grid met4 t nil nil nil nil ) + ( met4 res met4Res t t t t nil ) + ( met4 cut met4Cut t t t t nil ) + ( met4 pin met4Pin t t t t t ) + ( met4 label met4Label t t t t t ) + ( met4 net met4Net t t t t t ) + ( met4 boundary met4Bnd t t t t t ) + ( met4 blockage met4Blkg t t t t t ) + ( met4 short met4Short t t t t t ) + ( met4 fuse met4Fuse t t t t nil ) + ( met4 probe met4Probe t t t t t ) + ( met4 option1 met4Metop1 t t t t nil ) + ( met4 option2 met4Metop2 t t t t nil ) + ( met4 option3 met4Metop3 t t t t nil ) + ( met4 option4 met4Metop4 t t t t nil ) + ( met4 option5 met4Metop5 t t t t nil ) + ( met4 option6 met4Metop6 t t t t nil ) + ( met4 option7 met4Metop7 t t t t nil ) + ( met4 option8 met4Metop8 t t t t nil ) + ( via4 drawing via4 t t t t t ) + ( via4 grid via4 t nil nil nil nil ) + ( via4 blockage via4 t nil t t nil ) + ( via4 boundary via4Bnd t t t t t ) + ( via4 pin via4Pin t t t t nil ) + ( via4 net via4Net t t t t t ) + ( met5 drawing met5 t t t t t ) + ( met5 grid met5 t nil nil nil nil ) + ( met5 res met5Res t t t t nil ) + ( met5 cut met5Cut t t t t nil ) + ( met5 pin met5Pin t t t t t ) + ( met5 label met5Label t t t t t ) + ( met5 net met5Net t t t t t ) + ( met5 boundary met5Bnd t t t t t ) + ( met5 blockage met5Blkg t t t t t ) + ( met5 short met5Short t t t t t ) + ( met5 fuse met5Fuse t t t t nil ) + ( met5 probe met5Probe t t t t t ) + ( met5 option1 met5Metop1 t t t t nil ) + ( met5 option2 met5Metop2 t t t t nil ) + ( met5 option3 met5Metop3 t t t t nil ) + ( met5 option4 met5Metop4 t t t t nil ) + ( met5 option5 met5Metop5 t t t t nil ) + ( met5 option6 met5Metop6 t t t t nil ) + ( met5 option7 met5Metop7 t t t t nil ) + ( met5 option8 met5Metop8 t t t t nil ) + ( nsm drawing met8 t t t t t ) + ( pad drawing pad t t t t t ) + ( pad grid pad t nil nil nil nil ) + ( pad blockage pad t nil t t nil ) + ( pad label padLabel t t t t t ) + ( pad pin padPin t t t t t ) + ( pnp drawing pnp t t t t t ) + ( pnp label pnplabel t t t t t ) + ( npn drawing npn t t t t t ) + ( npn label npnlabel t t t t t ) + ( rpm drawing elm t t t t t ) + ( hvi drawing hvi t t t t t ) + ( capacitor drawing capacitor t t t t t ) + ( ncm drawing ncm t t t t t ) + ( cncm drawing cncm t nil t t t ) + ( cncm mask cncmmask t nil t t t ) + ( pmm drawing post2 t t t t t ) + ( pmm2 drawing cesdmask t t t t t ) + ( rdl drawing met7 t t t t t ) + ( rdl grid met7 t nil nil nil nil ) + ( rdl blockage met7 t nil t t nil ) + ( rdl pin met7Pin t t t t t ) + ( rdl label met7Label t t t t t ) + ( rdl res rpolyRes t t t t t ) + ( rdl cut rpolyCut t t t t t ) + ( rdl short met7Short t t t t nil ) + ( rdl option1 met7Metop1 t t t t nil ) + ( rdl option2 met7Metop2 t t t t nil ) + ( rdl option3 met7Metop3 t t t t nil ) + ( rdl option4 met7Metop4 t t t t nil ) + ( rdl option5 met7Metop5 t t t t nil ) + ( rdl option6 met7Metop6 t t t t nil ) + ( rdl option7 met7Metop7 t t t t nil ) + ( rdl option8 met7Metop8 t t t t nil ) + ( ubm drawing bpm t t t t t ) + ( bump drawing npm t t t t t ) + ( inductor drawing inductor t t t t t ) + ( inductor label inductorLabel t t t t t ) + ( inductor term1 inductorTerm1 t t t t t ) + ( inductor term2 inductorTerm2 t t t t t ) + ( inductor term3 inductorTerm3 t t t t t ) + ( cfom drawing cfom t t t t t ) + ( cfom mask cfommask t t t t t ) + ( cfom maskAdd cfommaskAdd t t t t t ) + ( cfom maskDrop cfommaskDrop t t t t t ) + ( cfom waffleDrop cfomwaffleDrop t t t t t ) + ( fom dummy cfom t t t t nil ) + ( cnwm drawing cnwm t t t t nil ) + ( cnwm mask cnwmmask t t t t t ) + ( cnwm maskAdd cnwmmaskAdd t t t t nil ) + ( cnwm maskDrop cnwmmaskDrop t t t t nil ) + ( cdnm drawing cdnm t t t t t ) + ( cdnm mask cdnmmask t t t t t ) + ( cdnm maskAdd cdnmmaskAdd t t t t t ) + ( cdnm maskDrop cdnmmaskDrop t t t t t ) + ( clvtnm drawing clvtnm t t t t nil ) + ( clvtnm mask clvtnmmask t t t t t ) + ( clvtnm maskAdd clvtnmmaskAdd t t t t nil ) + ( clvtnm maskDrop clvtnmmaskDrop t t t t nil ) + ( chvtpm drawing chvtpm t t t t nil ) + ( chvtpm mask chvtpmmask t t t t t ) + ( chvtpm maskAdd chvtpmmaskAdd t t t t nil ) + ( chvtpm maskDrop chvtpmmaskDrop t t t t nil ) + ( chvtrm drawing chvtrm t t t t nil ) + ( chvtrm mask chvtrmmask t t t t nil ) + ( chvtrm maskAdd chvtrmmaskAdd t t t t nil ) + ( chvtrm maskDrop chvtrmmaskDrop t t t t nil ) + ( ctunm drawing ctunm t t t t t ) + ( ctunm mask ctunmmask t t t t t ) + ( ctunm maskAdd ctunmmaskAdd t t t t t ) + ( ctunm maskDrop ctunmmaskDrop t t t t t ) + ( conom drawing conom t t t t t ) + ( conom mask conommask t t t t t ) + ( conom maskAdd conommaskAdd t t t t t ) + ( conom maskDrop conommaskDrop t t t t t ) + ( cnsdm drawing cnsdm t t t t t ) + ( cnsdm mask cnsdmmask t t t t t ) + ( cnsdm maskAdd cnsdmmaskAdd t t t t t ) + ( cnsdm maskDrop cnsdmmaskDrop t t t t t ) + ( cpsdm drawing cpsdm t t t t t ) + ( cpsdm mask cpsdmmask t t t t t ) + ( cpsdm maskAdd cpsdmmaskAdd t t t t t ) + ( cpsdm maskDrop cpsdmmaskDrop t t t t t ) + ( cntm drawing cntm t t t t t ) + ( cntm mask cntmmask t t t t t ) + ( cntm maskAdd cntmmaskAdd t t t t nil ) + ( cntm maskDrop cntmmaskDrop t t t t nil ) + ( hvntm drawing hvntm t t t t t ) + ( chvntm drawing chvntm t t t t t ) + ( chvntm mask chvntmmask t t t t t ) + ( chvntm maskAdd chvntmmaskAdd t t t t nil ) + ( chvntm maskDrop chvntmmaskDrop t t t t nil ) + ( cldntm drawing cmm8 t t t t nil ) + ( cldntm mask cmm8mask t t t t t ) + ( clvom drawing clvom t t t t t ) + ( clvom mask clvommask t t t t t ) + ( clvom maskAdd clvommaskAdd t t t t nil ) + ( clvom maskDrop clvommaskDrop t t t t nil ) + ( cp1m drawing cp1m t t t t nil ) + ( cp1m mask cp1mmask t t t t t ) + ( cp1m maskAdd cp1mmaskAdd t t t t t ) + ( cp1m waffleDrop cp1mwaffleDrop t t t t t ) + ( cp1m maskDrop cp1mmaskDrop t t t t t ) + ( cli1m drawing cli1m t t t t nil ) + ( cli1m mask cli1mmask t t t t t ) + ( cli1m maskAdd cli1mmaskAdd t t t t t ) + ( cli1m maskDrop cli1mmaskDrop t t t t t ) + ( clicm1 drawing clicm1 t t t t nil ) + ( clicm1 mask clicm1mask t t t t t ) + ( clicm1 maskAdd clicm1maskAdd t t t t t ) + ( clicm1 maskDrop clicm1maskDrop t t t t t ) + ( cmm1 drawing cmm1 t t t t nil ) + ( cmm1 mask cmm1mask t t t t t ) + ( cmm1 maskAdd cmm1maskAdd t t t t nil ) + ( cmm1 maskDrop cmm1maskDrop t t t t nil ) + ( cmm1 waffleDrop cmm1waffleDrop t t t t t ) + ( cviam drawing cviam t t t t nil ) + ( cviam mask cviammask t t t t t ) + ( cviam maskAdd cviammaskAdd t t t t nil ) + ( cviam maskDrop cviammaskDrop t t t t nil ) + ( cmm2 drawing cmm2 t t t t nil ) + ( cmm2 mask cmm2mask t t t t t ) + ( cmm2 maskAdd cmm2maskAdd t t t t nil ) + ( cmm2 maskDrop cmm2maskDrop t t t t nil ) + ( cmm2 waffleDrop cmm2waffleDrop t t t t t ) + ( cviam2 drawing cviam2 t t t t nil ) + ( cviam2 mask cviam2mask t t t t t ) + ( cviam2 maskAdd cviam2maskAdd t t t t nil ) + ( cviam2 maskDrop cviam2maskDrop t t t t nil ) + ( cmm3 drawing cmm3 t t t t nil ) + ( cmm3 mask cmm3mask t t t t t ) + ( cmm3 maskAdd cmm3maskAdd t t t t nil ) + ( cmm3 maskDrop cmm3maskDrop t t t t nil ) + ( cmm3 waffleDrop cmm3waffleDrop t t t t t ) + ( cnpc drawing csilm t t t t t ) + ( cnpc mask csilmmask t t t t t ) + ( cnpc maskAdd csilmmaskAdd t t t t nil ) + ( cnpc maskDrop csilmmaskDrop t t t t nil ) + ( cviam3 drawing cviam3 t t t t nil ) + ( cviam3 mask cviam3mask t t t t t ) + ( cviam3 maskAdd cviam3maskAdd t t t t nil ) + ( cviam3 maskDrop cviam3maskDrop t t t t nil ) + ( capm drawing b55capm t t t t t ) + ( cap2m drawing cmm8mask t t t t t ) + ( cnsm mask cmm8 t t t t t ) + ( cpdm drawing cpdm t t t t nil ) + ( cpdm mask cpdmmask t t t t t ) + ( cpdm maskAdd cpdmmaskAdd t t t t nil ) + ( cpdm maskDrop cpdmmaskDrop t t t t nil ) + ( cpmm drawing ccim t t t t t ) + ( cpbo mask ccimmask t t t t t ) + ( cmm4 mask cmm4mask t t t t t ) + ( cmm4 maskAdd cmm4maskAdd t t t t t ) + ( cmm4 maskDrop cmm4maskDrop t t t t t ) + ( cmm4 waffleDrop cmm4waffleDrop t t t t t ) + ( cviam4 drawing cviam4 t t t t nil ) + ( cviam4 mask cviam4mask t t t t t ) + ( cviam4 maskAdd cviam4maskAdd t t t t nil ) + ( cviam4 maskDrop cviam4maskDrop t t t t nil ) + ( cmm5 mask cmm5mask t t t t t ) + ( cmm5 waffleDrop cmm5waffleDrop t t t t t ) + ( target drawing target t t t t t ) + ( cctm1 drawing cctm1 t t t t nil ) + ( cctm1 mask cctm1mask t t t t t ) + ( cctm1 maskAdd cctm1maskAdd t t t t nil ) + ( cctm1 maskDrop cctm1maskDrop t t t t nil ) + ( crpm drawing crpm t t t t t ) + ( crpm mask crpmmask t t t t t ) + ( crpm maskAdd crpmmaskAdd t t t t t ) + ( crpm maskDrop crpmmaskDrop t t t t t ) + ( ccu1m mask met7 t t nil nil nil ) + ( cpmm2 mask cesdmask t t nil nil nil ) + ( cubm mask bpm t t nil nil nil ) + ( cbump mask npm t t nil nil nil ) + ( overlap drawing overlap t t t t t ) + ( overlap boundary overlapBnd t t t t t ) + ( areaid lowTapDensity areaidDualMemory t t t t t ) + ( areaid notCritSide areaidTcamMemory t t t t t ) + ( areaid injection per t t t t t ) + ( areaid rfdiode fix t t t t t ) + ( areaid seal areaidseal t t t t t ) + ( areaid core areaidcore t t t t t ) + ( areaid frame areaidframe t t t t t ) + ( areaid esd areaidesd t t t t t ) + ( areaid dieCut areaiddieCut t t t t t ) + ( areaid moduleCut areaidmoduleCut t t t t t ) + ( areaid frameRect areaidframeRect t t t t t ) + ( areaid substrateCut areaidsubstrateCut2 t t t t t ) + ( areaid diode areaidde t t t t t ) + ( areaid standardc areaidStandardc t t t t t ) + ( areaid deadZon areaiddn t t t t t ) + ( areaid critCorner areaidcr t t t t t ) + ( areaid critSid areaidcd t t t t t ) + ( areaid opcDrop areaidopcDrop t t t t t ) + ( areaid waffleWindow areaidWaffleWindow t t t t t ) + ( areaid extendedDrain areaidextendedDrain t t t t t ) + ( areaid lvNative areaidTcamMemory t t t t t ) + ( areaid photo areaidprobe t t t t t ) + ( areaid etest cmsm t t t t t ) + ( areaid hvnwell msm t t t t t ) + ( areaid rdlprobepad areaidprobe t t t t t ) + ( areaid sigPadDiff overlap t t t t t ) + ( areaid sigPadWell feedthru t t t t t ) + ( areaid sigPadMetNtr overlapBnd t t t t t ) + ( areaid analog areaidanalog t t t t t ) + ( prune drawing prunedg t t t t t ) + ( padCenter drawing target t t t t t ) + ( met1 psa1 met1Psa1 t t t t t ) + ( met2 psa1 met2Psa1 t t t t t ) + ( met3 psa1 met3Psa1 t t t t t ) + ( met4 psa1 met4Psa1 t t t t t ) + ( met5 psa1 met5Psa1 t t t t t ) + ( met1 psa2 met1Psa2 t t t t t ) + ( met2 psa2 met2Psa2 t t t t t ) + ( met3 psa2 met3Psa2 t t t t t ) + ( met4 psa2 met4Psa2 t t t t t ) + ( met5 psa2 met5Psa2 t t t t t ) + ( met1 psa3 met1Psa3 t t t t t ) + ( met2 psa3 met2Psa3 t t t t t ) + ( met3 psa3 met3Psa3 t t t t t ) + ( met4 psa3 met4Psa3 t t t t t ) + ( met5 psa3 met5Psa3 t t t t t ) + ( met1 psa4 met1Psa4 t t t t t ) + ( met2 psa4 met2Psa4 t t t t t ) + ( met3 psa4 met3Psa4 t t t t t ) + ( met4 psa4 met4Psa4 t t t t t ) + ( met5 psa4 met5Psa4 t t t t t ) + ( met1 psa5 met1Psa5 t t t t t ) + ( met2 psa5 met2Psa5 t t t t t ) + ( met3 psa5 met3Psa5 t t t t t ) + ( met4 psa5 met4Psa5 t t t t t ) + ( met5 psa5 met5Psa5 t t t t t ) + ( met1 psa6 met1Psa6 t t t t t ) + ( met2 psa6 met2Psa6 t t t t t ) + ( met3 psa6 met3Psa6 t t t t t ) + ( met4 psa6 met4Psa6 t t t t t ) + ( met5 psa6 met5Psa6 t t t t t ) + ( rdl psa1 met7Psa1 t t t t t ) + ( rdl psa2 met7Psa2 t t t t t ) + ( rdl psa3 met7Psa3 t t t t t ) + ( rdl psa4 met7Psa4 t t t t t ) + ( rdl psa5 met7Psa5 t t t t t ) + ( rdl psa6 met7Psa6 t t t t t ) + ( blanking drawing post2 t t t t nil ) + ) ;techDisplays + + techLayerProperties( + ;( PropName Layer1 [ Layer2 ] PropValue ) + ;( -------- ------ ---------- --------- ) + ( sheetResistance nwell 1700.000000 ) + ( sheetResistance diff 120.000000 ) + ( areaCapacitance poly 1.060000e-04 ) + ( edgeCapacitance poly 1.030000e-05 ) + ( sheetResistance poly 48.200001 ) + ( thickness poly 0.18 ) + ( areaCapacitance met1 2.580000e-05 ) + ( edgeCapacitance met1 1.790000e-06 ) + ( sheetResistance met1 0.125000 ) + ( thickness met1 0.35 ) + ( areaCapacitance met2 1.750000e-05 ) + ( edgeCapacitance met2 1.220000e-06 ) + ( sheetResistance met2 0.125000 ) + ( thickness met2 0.35 ) + ( areaCapacitance met3 1.260000e-05 ) + ( edgeCapacitance met3 1.860000e-06 ) + ( sheetResistance met3 0.047000 ) + ( thickness met3 0.8 ) + ( areaCapacitance met4 8.670000e-06 ) + ( edgeCapacitance met4 1.290000e-06 ) + ( sheetResistance met4 0.047000 ) + ( thickness met4 0.8 ) + ( areaCapacitance met5 6.480000e-06 ) + ( edgeCapacitance met5 4.960000e-06 ) + ( sheetResistance met5 0.028500 ) + ( thickness met5 1.2 ) + ( areaCapacitance li1 3.690000e-05 ) + ( edgeCapacitance li1 3.260000e-06 ) + ( sheetResistance li1 12.200000 ) + ( thickness li1 0.1 ) + ( areaCapacitance rdl 2.660000e-06 ) + ( edgeCapacitance rdl 6.200000e-06 ) + ( sheetResistance rdl 0.005000 ) + ( thickness rdl 2.0 ) + ) ;techLayerProperties + + techDerivedLayers( + ;( DerivedLayerName # composition ) + ;( ---------------- ------ ------------ ) + ) ;techDerivedLayers + +) ;layerDefinitions + + +;******************************** +; LAYER RULES +;******************************** +layerRules( + + equivalentLayers( + ;( list of layers ) + ;( -------------- ) + ) ;equivalentLayers + + functions( + ;( layer function [maskNumber]) + ;( ----- -------- ------------) + ( pwell "pwell" 1) + ( nwell "nwell" 2) + ( diff "ndiff" 3) + ( tap "ndiff" 4) + ( poly "poly" 5) + ( licon1 "cut" 6) + ( li1 "metal" 7) + ( mcon "cut" 8) + ( met1 "metal" 9) + ( via "cut" 10) + ( met2 "metal" 11) + ( via2 "cut" 12) + ( met3 "metal" 13) + ( via3 "cut" 14) + ( met4 "metal" 15) + ( via4 "cut" 16) + ( met5 "metal" 17) + ( rdl "metal" 18) + ) ;functions + + mfgResolutions( + ;( layer mfgResolution ) + ;( ----- ------------- ) + ) ;mfgResolutions + + routingDirections( + ;( layer direction ) + ;( ----- --------- ) + ) ;routingDirections + + incompatibleLayers( + ;( layer incompatibleLayers ) + ;( ----- ------------------ ) + ) ;incompatibleLayers + + labelLayers( + ;( textLayer layers ) + ;( --------- ---------------------------------- ) + ) ;labelLayers + + stampLabelLayers( + ;( textLayer layers ) + ;( --------- ---------------------------------- ) + ) ;stampLabelLayers + + backsideLayers( + ; layerName1 layerName2 ... + ; ---------------------------------------------------------------------- + + ) ;backsideLayers + + currentDensity( + ;( rule layer1 layer2 value ) + ;( ---- ------ ------ ----- ) + ) ;currentDensity + + currentDensityTables( + ;( rule layer1 + ; (( index1Definitions [index2Definitions]) [defaultValue] ) + ; (table)) + ;( ----------------------------------------------------------------------) + ) ;currentDensityTables + + cutClasses( + ;( layerName ) + ;( (cutClassName (width length)) ) + ;( ---------------------------------------------------------------------- ) + ) ;cutClasses + +) ;layerRules + + +;******************************** +; VIADEFS +;******************************** +viaDefs( + + standardViaDefs( + ;( viaDefName layer1 layer2 (cutLayer cutWidth cutHeight [resistancePerCut]) + ; (cutRows cutCol (cutSpace) [(l_cutPattern)]) + ; (layer1Enc) (layer2Enc) (layer1Offset) (layer2Offset) (origOffset) + ; [implant1 (implant1Enc) [implant2 (implant2Enc) [well/substrate]]]) + ;( -------------------------------------------------------------------------- ) + ( M4M5_C met5 met4 ("via4" 0.8 0.8 0.38) + (1 1 (-0.8 -0.8)) + (0.31 0.31) (0.19 0.19) (0.0 0.0) (0.0 0.0) (0.0 0.0) + ) + ( M3M4_C met4 met3 ("via3" 0.2 0.2 3.41) + (1 1 (-0.2 -0.2)) + (0.065 0.065) (0.09 0.09) (0.0 0.0) (0.0 0.0) (0.0 0.0) + ) + ( M2M3_C met3 met2 ("via2" 0.2 0.2 3.41) + (1 1 (-0.2 -0.2)) + (0.065 0.065) (0.085 0.085) (0.0 0.0) (0.0 0.0) (0.0 0.0) + ) + ( M1M2_C met2 met1 ("via" 0.15 0.15 4.5) + (1 1 (-0.15 -0.15)) + (0.085 0.085) (0.085 0.085) (0.0 0.0) (0.0 0.0) (0.0 0.0) + ) + ( L1M1_C met1 li1 ("mcon" 0.17 0.17 9.3) + (1 1 (-0.17 -0.17)) + (0.06 0.06) (0.0 0.0) (0.0 0.0) (0.0 0.0) (0.0 0.0) + ) + ( PYL1_C poly li1 ("licon1" 0.17 0.17 145.28) + (1 1 (-0.17 -0.17)) + (0.08 0.08) (0.08 0.08) (0.0 0.0) (0.0 0.0) (0.0 0.0) + nil nil npc (0.02 0.02) + ) + ( TPL1_C li1 tap ("licon1" 0.17 0.17 600.0) + (1 1 (-0.17 -0.17)) + (0.08 0.08) (0.12 0.12) (0.0 0.0) (0.0 0.0) (0.0 0.0) + ) + ) ;standardViaDefs + + customViaDefs( + ;( viaDefName libName cellName viewName layer1 layer2 resistancePerCut) + ;( ---------- ------- -------- -------- ------ ------ ----------------) +; ( M4M5_PR_R sky130 M4M5_PR_R symbolic met4 met5 0.38) +; ( M3M4_PR_R sky130 M3M4_PR_R symbolic met3 met4 3.41) +; ( M2M3_PR_R sky130 M2M3_PR_R symbolic met2 met3 3.41) +; ( M4M5_PR sky130 M4M5_PR symbolic met4 met5 0.38) +; ( M3M4_PR sky130 M3M4_PR symbolic met3 met4 3.41) +; ( M2M3_PR sky130 M2M3_PR symbolic met2 met3 3.41) +; ( M1M2_PR sky130 M1M2_PR symbolic met1 met2 4.5) +; ( L1M1_PR sky130 L1M1_PR symbolic li1 met1 9.3) +; ( M1M2_PR_R sky130 M1M2_PR_R symbolic met1 met2 4.5) +; ( pDFL1_PR sky130 pDFL1_PR symbolic diff li1 600.0) +; ( nDFL1_PR sky130 nDFL1_PR symbolic diff li1 182.0) +; ( pTPL1_PR sky130 pTPL1_PR symbolic tap li1 600.0) +; ( nTPL1_PR sky130 nTPL1_PR symbolic tap li1 182.0) +; ( PYL1_PR sky130 PYL1_PR symbolic poly li1 145.28) +; ( ruleVia4 sky130 ruleVia4 symbolic met4 met5 0.38) +; ( ruleVia3 sky130 ruleVia3 symbolic met3 met4 3.41) +; ( ruleVia2 sky130 ruleVia2 symbolic met2 met3 3.41) +; ( ruleVia1 sky130 ruleVia1 symbolic met1 met2 4.5) +; ( ruleVia sky130 ruleVia symbolic met1 met2 4.5) +; ( hvDFL1sd2 sky130 hvDFL1sd2 symbolic diff licon1 600.0) +; ( hvDFL1sd sky130 hvDFL1sd symbolic diff licon1 0.0) +; ( TPL1s sky130 TPL1s symbolic tap licon1 600.0) +; ( DFL1sd2 sky130 DFL1sd2 symbolic diff licon1 600.0) +; ( DFL1sdf sky130 DFL1sdf symbolic diff licon1 600.0) +; ( DFL1sd sky130 DFL1sd symbolic diff licon1 600.0) +; ( hvDFM1sd2 sky130 hvDFM1sd2 symbolic diff licon1 0.0) +; ( DFM1sd2 sky130 DFM1sd2 symbolic diff licon1 0.0) +; ( DFM1sd sky130 DFM1sd symbolic diff licon1 0.0) +; ( TPM1s sky130 TPM1s symbolic tap licon1 0.0) +; ( hvDFM1sd sky130 hvDFM1sd symbolic diff licon1 0.0) +; ( hvDFTPM1s2 sky130 hvDFTPM1s2 symbolic diff licon1 600.0) +; ( hvDFTPL1s2 sky130 hvDFTPL1s2 symbolic diff licon1 600.0) +; ( DFTPM1s2 sky130 DFTPM1s2 symbolic diff licon1 600.0) +; ( DFTPL1s2 sky130 DFTPL1s2 symbolic diff licon1 600.0) +; ( hvDFTPL1s sky130 hvDFTPL1s symbolic diff licon1 600.0) +; ( hvDFTPM1s sky130 hvDFTPM1s symbolic diff licon1 0.0) +; ( DFTPM1sw sky130 DFTPM1sw symbolic diff licon1 0.0) +; ( DFTPM1s sky130 DFTPM1s symbolic diff licon1 0.0) +; ( DFTPL1sw sky130 DFTPL1sw symbolic diff licon1 600.0) +; ( DFTPL1s sky130 DFTPL1s symbolic diff licon1 600.0) +; ( hvDFTPM1s2enh sky130 hvDFTPM1s2enh symbolic diff licon1 0.0) +; ( DFTPM1s2enh sky130 DFTPM1s2enh symbolic diff licon1 0.0) +; ( HRPoly_5p73_L1M1con sky130 HRPoly_5p73_L1M1con symbolic mcon li1 0.0) +; ( HRPoly_5p73_RPL1con sky130 HRPoly_5p73_RPL1con symbolic poly licon1 0.0) +; ( HRPoly_2p85_L1M1con sky130 HRPoly_2p85_L1M1con symbolic mcon li1 0.0) +; ( HRPoly_2p85_RPL1con sky130 HRPoly_2p85_RPL1con symbolic poly licon1 0.0) +; ( HRPoly_1p41_L1M1con sky130 HRPoly_1p41_L1M1con symbolic mcon li1 0.0) +; ( HRPoly_1p41_RPL1con sky130 HRPoly_1p41_RPL1con symbolic poly licon1 0.0) +; ( HRPoly_0p69_L1M1con sky130 HRPoly_0p69_L1M1con symbolic mcon li1 0.0) +; ( HRPoly_0p69_RPL1con sky130 HRPoly_0p69_RPL1con symbolic poly licon1 0.0) +; ( HRPoly_0p35_L1M1con sky130 HRPoly_0p35_L1M1con symbolic mcon li1 0.0) +; ( HRPoly_0p35_RPL1con sky130 HRPoly_0p35_RPL1con symbolic poly licon1 0.0) +; ( FUSE_M3M4 sky130 FUSE_M3M4 symbolic met3 met4 0.0) +; ( M4M5sq sky130 M4M5sq symbolic met4 met5 0.38) +; ( M3M4sq sky130 M3M4sq symbolic met3 met4 3.41) +; ( M2M3sq sky130 M2M3sq symbolic met2 met3 3.41) +; ( M4M5 sky130 M4M5 symbolic met4 met5 0.0) +; ( M3M4 sky130 M3M4 symbolic met3 met4 0.38) +; ( M2M3 sky130 M2M3 symbolic met2 met3 3.41) +; ( M1M2sq sky130 M1M2sq symbolic met1 met2 0.0) +; ( M1M2 sky130 M1M2 symbolic met1 met2 0.0) +; ( L1M1sq sky130 L1M1sq symbolic mcon li1 0.0) +; ( L1M1 sky130 L1M1 symbolic mcon li1 0.0) +; ( PYL1sq sky130 PYL1sq symbolic poly npc 0.0) +; ( PYL1 sky130 PYL1 symbolic poly npc 0.0) +; ( DFL1sq sky130 DFL1sq symbolic diff licon1 0.0) +; ( DFL1 sky130 DFL1 symbolic diff licon1 0.0) +; ( TPL1_fence sky130 TPL1_fence symbolic tap licon1 0.0) +; ( TPL1sq sky130 TPL1sq symbolic tap licon1 0.0) +; ( TPL1 sky130 TPL1 symbolic tap licon1 0.0) +; ( TPL1a sky130 TPL1a symbolic tap licon1 0.0) +; ( TPL1cen sky130 TPL1cen symbolic tap licon1 0.0) +; ( L1M2 sky130 L1M2 symbolic mcon li1 0.0) +; ( PYM1 sky130 PYM1 symbolic poly npc 0.0) +; ( M5RDLlg_atlas sky130 M5RDLlg_atlas symbolic pad rdl 0.0) +; ( M5RDL sky130 M5RDL symbolic pad rdl 0.0) +; ( TPM1 sky130 TPM1 symbolic tap licon1 0.0) +; ( DFM1 sky130 DFM1 symbolic diff licon1 0.0) + ) ;customViaDefs + + cdsGenViaDefs( +; (t_viaDefName +; (layers +; ** Base Layers ** +; (layer1 tx_layer1) +; (layer2 tx_layer2) +; (cutLayer tx_cutLayer) +; ) +; [(extraLayers +; ** Extra Layers ** +; [(layer1ExtraLayers l_extraLayers)] +; [(layer2ExtraLayers l_extraLayers)] +; [(cutExtraLayers l_extraLayers)] +; )] +; [(parameters +; ** Other Default Parameters ** +; [(layer1Purpose tx_purpose)] +; [(layer1Enc l_enc)] +; [(layer2Purpose tx_purpose)] +; [(layer2Enc l_enc)] +; [(cutPurpose tx_purpose)] +; [(cutWidth x_width)] +; [(cutHeight x_width)] +; [(cutSpacing x_spacingX x_spacingY)] +; [(cutRow x_cutRows)] +; [(cutColumns x_cutColumns)] +; [(cutPattern t_pattern)] +; [(alignment t_alignment)] +; [(originOffset l_originOffset)] +; [(layer1ExtraParams l_extraLayerParams)] +; [(layer2ExtraParams l_extraLayerParams)] +; [(cutLayerExtraParams l_extraLayerParams)] +; [(cutArraySpacing x_dX x_dY)] +; [(cutArrayPatternX l_cutArrayPattern)] +; [(cutArrayPatternY l_cutArrayPattern)] +; [(version x_version)] +; )] +; ) +; ( -------------------------------------------------------------------------- ) + ) ;cdsGenViaDefs + + standardViaVariants( + ;( viaVariantName viaDefName (cutLayer cutWidth cutHeight) + ; (cutRows cutCol (cutSpace)) + ; (layer1Enc) (layer2Enc) (layer1Offset) (layer2Offset) (origOffset) + ; (implant1Enc) (implant2Enc) (cut_pattern) ) + ;( -------------------------------------------------------------------------- ) + ) ;standardViaVariants + + customViaVariants( + ;(viaVariantName viaDefName (paramName paramValue) ...) + ;( -------------------------------------------------------------------------- ) + ) ;customViaVariants + +) ;viaDefs + + + +;******************************** +; CONSTRAINT GROUPS +;******************************** +constraintGroups( + + ;( group [override] [definition] [operator] ) + ;( ----- ---------- ------------ ---------- ) + ( "default" nil + ) ;default + + ; Adding for VirtuosoXL (bdj 20180324) + ;( group [override] [definition] [operator] ) + ;( ----- ---------- ------------ ---------- ) + ( "virtuosoDefaultSetup" nil + + interconnect( + ( validLayers (poly li1 met1 met2 met3 met4 met5 ) ) + ( validVias (TPL1_C PYL1_C L1M1_C M1M2_C M2M3_C M3M4_C M4M5_C ) ) + ) ;interconnect + + spacings( + ( minWidth "poly" 0.1 ) + ( minSpacing "poly" 0.18 ) + ( minWidth "li1" 0.13 ) + ( minSpacing "li1" 0.13 ) + ( minWidth "met1" 0.14 ) + ( minSpacing "met1" 0.14 ) + ( minWidth "met2" 0.14 ) + ( minSpacing "met2" 0.14 ) + ( minWidth "met3" 0.24 ) + ( minSpacing "met3" 0.24 ) + ( minWidth "met4" 0.24 ) + ( minSpacing "met4" 0.24 ) + ( minWidth "met5" 0.36 ) + ( minSpacing "met5" 0.36 ) + ) ;spacings + ) ;virtuosoDefaultSetup + + ;( group [override] [definition] [operator] ) + ;( ----- ---------- ------------ ---------- ) + ( "foundry" nil + + ; adding for LayoutXL (bdj 20180324) + interconnect( + ( validLayers (poly li1 met1 met2 met3 met4 met5 ) ) + ( validVias (TPL1_C PYL1_C L1M1_C M1M2_C M2M3_C M3M4_C M4M5_C ) ) + ) ;interconnect + + orderedSpacings( + ( minExtensionDistance "rdl" "pad" 10.75 ) + ( minExtensionDistance "met5" "via4" 0.31 ) + ( minExtensionDistance "met4" "via4" 0.19 ) + ( minExtensionDistance "met4" "via3" 0.065 ) + ( minExtensionDistance "met3" "via3" 0.06 ) + ( minExtensionDistance "met3" "via2" 0.065 ) + ( minExtensionDistance "met2" "via2" 0.04 ) + ( minExtensionDistance "poly" "licon1" 0.05 ) + ( minExtensionDistance "met5" "pad" 2.7 ) + ( minExtensionDistance "met2" "via" 0.085 ) + ( minExtensionDistance "met1" "via" 0.085 ) + ( minExtensionDistance "met1" "mcon" 0.06 ) + ( minExtensionDistance ("cap2m" "drawing") ("via4" "drawing") 0.2 ) + ( minExtensionDistance ("capm" "drawing") ("via3" "drawing") 0.14 ) + ( minExtensionDistance "nwell" "capacitor" 1.5 ) + ( minExtensionDistance "li1" "mcon" 0.0 ) + ( minExtensionDistance "npc" "licon1" 0.1 ) + ( minExtensionDistance "tap" "licon1" 0.12 ) + ( minExtensionDistance "diff" "licon1" 0.04 ) + ( minExtensionDistance "li1" "licon1" 0.08 ) + ( minExtensionDistance "nwell" "tap" 0.18 ) + ( minExtensionDistance "nwell" "diff" 0.18 ) + ( minExtensionDistance "dnwell" "nwell" 0.4 ) + ) ;orderedSpacings + + spacings( + ( minWidth "pad" 60.0 ) + ( minWidth "rdl" 10.0 ) + ( minWidth "met5" 1.6 ) + ( minWidth "via4" 0.8 ) + ( minWidth "met4" 0.3 ) + ( minWidth "via3" 0.2 ) + ( minWidth "met3" 0.3 ) + ( minWidth "via2" 0.2 ) + ( minWidth "hvtr" 0.38 ) + ( minWidth "hvntm" 0.7 ) + ( minWidth "hvtp" 0.38 ) + ( minWidth "ncm" 0.38 ) + ( minWidth "nsm" 3.0 ) + ( minWidth "met2" 0.14 ) + ( minWidth "via" 0.15 ) + ( minWidth "met1" 0.14 ) + ( minWidth "capacitor" 1.43 ) + ( minWidth "mcon" 0.17 ) + ( minWidth "licon1" 0.17 ) + ( minWidth "poly" 0.15 ) + ( minWidth "hvi" 0.6 ) + ( minWidth "ldntm" 0.7 ) + ( minWidth "lvtn" 0.38 ) + ( minWidth "li1" 0.17 ) + ( minWidth "npc" 0.27 ) + ( minWidth "psdm" 0.38 ) + ( minWidth "nsdm" 0.38 ) + ( minWidth "tunm" 0.41 ) + ( minWidth "tap" 0.15 ) + ( minWidth "diff" 0.15 ) + ( minWidth "nwell" 0.84 ) + ( minWidth "dnwell" 3.0 ) + ( minWidth ("cap2m" "drawing") 2.0 ) + ( minWidth ("capm" "drawing") 2.0 ) + ( minArea "met4" 0.24 ) + ( minArea "met3" 0.24 ) + ( minArea "met2" 0.0676 ) + ( minArea "met1" 0.083 ) + ( minArea "psdm" 0.255 ) + ( minArea "nsdm" 0.265 ) + ( minArea "tunm" 0.672 ) + ( minHoleArea "met2" 0.14 ) + ( minHoleArea "met1" 0.14 ) + ( minSpacing "rdl" 10.0 ) + ( minSpacing "met5" 1.6 ) + ( minSpacing "via4" 0.8 ) + ( minSpacing "via3" 0.2 ) + ( minSpacing "via2" 0.2 ) + ( minSpacing "hvtr" 0.38 ) + ( minSpacing "hvntm" 0.7 ) + ( minSpacing "hvtp" 0.38 ) + ( minSpacing "ncm" 0.38 ) + ( minSpacing "pad" 1.27 ) + ( minSpacing ("cap2m" "drawing") 0.84 ) + ( minSpacing ("capm" "drawing") 0.84 ) + ( minSpacing "nsm" 4.0 ) + ( minSpacing "via" 0.17 ) + ( minSpacing "mcon" 0.19 ) + ( minSpacing "licon1" 0.17 ) + ( minSpacing "poly" "tap" 0.055 ) + ( minSpacing "poly" "diff" 0.075 ) + ( minSpacing "poly" 0.21 ) + ( minSpacing "hvi" "nwell" 0.7 ) + ( minSpacing "hvi" 0.7 ) + ( minSpacing "ldntm" 0.7 ) + ( minSpacing "lvtn" "hvtp" 0.38 ) + ( minSpacing "lvtn" 0.38 ) + ( minSpacing "li1" 0.17 ) + ( minSpacing "npc" 0.27 ) + ( minSpacing "psdm" 0.38 ) + ( minSpacing "nsdm" 0.38 ) + ( minSpacing "tunm" 0.5 ) + ( minSpacing "tap" "nwell" 0.13 ) + ( minSpacing "diff" "nwell" 0.34 ) + ( minSpacing "diff" "tap" 0.27 ) + ( minSpacing "tap" 0.27 ) + ( minSpacing "diff" 0.27 ) + ( minSpacing "nwell" "dnwell" 4.5 ) + ( minSpacing "nwell" 1.27 ) + ( minSpacing "dnwell" 6.3 ) + ( minSameNetSpacing ("via3" "drawing") ("via4" "drawing") 0.0 ) + ( minSameNetSpacing ("via2" "drawing") ("via3" "drawing") 0.0 ) + ( minSameNetSpacing ("via" "drawing") ("via3" "drawing") 0.0 ) + ( minSameNetSpacing ("via" "drawing") ("via2" "drawing") 0.0 ) + ( minSameNetSpacing ("mcon" "drawing") ("via3" "drawing") 0.0 ) + ( minSameNetSpacing ("mcon" "drawing") ("via2" "drawing") 0.0 ) + ( minSameNetSpacing ("mcon" "drawing") ("via" "drawing") 0.0 ) + ( minSameNetSpacing ("met5" "drawing") 1.6 ) + ( minSameNetSpacing ("met4" "drawing") 0.3 ) + ( minSameNetSpacing ("via3" "drawing") 0.2 ) + ( minSameNetSpacing ("met3" "drawing") 0.3 ) + ( minSameNetSpacing ("via2" "drawing") 0.2 ) + ( minSameNetSpacing ("met2" "drawing") 0.14 ) + ( minSameNetSpacing ("via" "drawing") 0.17 ) + ( minSameNetSpacing ("met1" "drawing") 0.14 ) + ( minSameNetSpacing ("mcon" "drawing") 0.19 ) + ) ;spacings + + routingGrids( + ( horizontalOffset "met5" 1.555 ) + ( verticalOffset "met5" 1.555 ) + ( horizontalOffset "met4" 0.305 ) + ( verticalOffset "met4" 0.305 ) + ( horizontalOffset "met3" 0.305 ) + ( verticalOffset "met3" 0.305 ) + ( horizontalOffset "met2" 0.185 ) + ( verticalOffset "met2" 0.185 ) + ( horizontalOffset "met1" 0.185 ) + ( verticalOffset "met1" 0.185 ) + ) ;routingGrids + + spacingTables( + ;( constraint layer1 [layer2] + ; (( index1Definitions [index2Defintions]) [defaultValue] ) + ; ( table) ) + ;( --------------------------------------------) + ( minSpacing "met1" + (( "width" nil nil ) 0.14 ) + ( + 0.0 0.14 + 3.005 0.28 + ) + ) + ( minStubInfluenceSpacing "met1" + (( "width" nil nil "distance" nil nil ) ) + ( + (3.005 0.28 ) 0.28 + ) + ) + ( minSpacing "met2" + (( "width" nil nil ) 0.14 ) + ( + 0.0 0.14 + 3.005 0.28 + ) + ) + ( minStubInfluenceSpacing "met2" + (( "width" nil nil "distance" nil nil ) ) + ( + (3.005 0.28 ) 0.28 + ) + ) + ( minSpacing "met3" + (( "width" nil nil ) 0.3 ) + ( + 0.0 0.3 + 3.005 0.4 + ) + ) + ( minStubInfluenceSpacing "met3" + (( "width" nil nil "distance" nil nil ) ) + ( + (3.005 0.4 ) 0.4 + ) + ) + ( minSpacing "met4" + (( "width" nil nil ) 0.3 ) + ( + 0.0 0.3 + 3.005 0.4 + ) + ) + ( minStubInfluenceSpacing "met4" + (( "width" nil nil "distance" nil nil ) ) + ( + (3.005 0.4 ) 0.4 + ) + ) + ) ;spacingTables + + antennaModels( + ;( model ) + ;( ----- ) + ( "default" + antenna( + ( areaRatio "via4" 6.0 ) + ( diffAreaRatio "via4" + ( + ( 0.0 6.0 ) + ( 0.0125 6.0 ) + ( 0.0225 6.81 ) + ( 22.5 816.0 ) + ) + ) + ) ;antenna + antenna( + ( areaRatio "via3" 6.0 ) + ( diffAreaRatio "via3" + ( + ( 0.0 6.0 ) + ( 0.0125 6.0 ) + ( 0.0225 6.81 ) + ( 22.5 816.0 ) + ) + ) + ) ;antenna + antenna( + ( areaRatio "via2" 6.0 ) + ( diffAreaRatio "via2" + ( + ( 0.0 6.0 ) + ( 0.0125 6.0 ) + ( 0.0225 6.81 ) + ( 22.5 816.0 ) + ) + ) + ) ;antenna + antenna( + ( areaRatio "via" 6.0 ) + ( diffAreaRatio "via" + ( + ( 0.0 6.0 ) + ( 0.0125 6.0 ) + ( 0.0225 6.81 ) + ( 22.5 816.0 ) + ) + ) + ) ;antenna + antenna( + ( areaRatio "mcon" 3.0 ) + ( diffAreaRatio "mcon" + ( + ( 0.0 3.0 ) + ( 0.0125 3.0 ) + ( 0.0225 3.405 ) + ( 22.5 408.0 ) + ) + ) + ) ;antenna + antenna( + ( areaRatio "met5" 400.0 'side ) + ( diffAreaRatio "met5" + ( + ( 0.0 400.0 ) + ( 0.0125 400.0 ) + ( 0.0225 2609.0 ) + ( 22.5 11600.0 ) + ) + 'side ) + ) ;antenna + antenna( + ( areaRatio "met4" 400.0 'side ) + ( diffAreaRatio "met4" + ( + ( 0.0 400.0 ) + ( 0.0125 400.0 ) + ( 0.0225 2609.0 ) + ( 22.5 11600.0 ) + ) + 'side ) + ) ;antenna + antenna( + ( areaRatio "met3" 400.0 'side ) + ( diffAreaRatio "met3" + ( + ( 0.0 400.0 ) + ( 0.0125 400.0 ) + ( 0.0225 2609.0 ) + ( 22.5 11600.0 ) + ) + 'side ) + ) ;antenna + antenna( + ( areaRatio "met2" 400.0 'side ) + ( diffAreaRatio "met2" + ( + ( 0.0 400.0 ) + ( 0.0125 400.0 ) + ( 0.0225 2609.0 ) + ( 22.5 11600.0 ) + ) + 'side ) + ) ;antenna + antenna( + ( areaRatio "met1" 400.0 'side ) + ( diffAreaRatio "met1" + ( + ( 0.0 400.0 ) + ( 0.0125 400.0 ) + ( 0.0225 2609.0 ) + ( 22.5 11600.0 ) + ) + 'side ) + ) ;antenna + antenna( + ( areaRatio "li1" 75.0 'side ) + ( diffAreaRatio "li1" + ( + ( 0.0 75.0 ) + ( 0.0125 75.0 ) + ( 0.0225 85.125 ) + ( 22.5 10200.0 ) + ) + 'side ) + ) ;antenna + cumulativeMetalAntenna( + ( areaRatio 0.0 'side ) + ) ;cumulativeMetalAntenna + cumulativeViaAntenna( + ( areaRatio 0.0 ) + ) ;cumulativeViaAntenna + ) ;default + ) ;antennaModels + + orderedElectrical( + ;( constraint layer1 layer2 value ) + ;( ---------- ------ ------ ------ ) + ( parallelCap ("rdl" "drawing") ("diff" "drawing") 5.45e-05 ) + ( parallelCap ("met5" "drawing") ("diff" "drawing") 6.47e-05 ) + ( parallelCap ("met4" "drawing") ("diff" "drawing") 0.000108 ) + ( parallelCap ("met3" "drawing") ("diff" "drawing") 0.000107 ) + ( parallelCap ("met2" "drawing") ("diff" "drawing") 0.000106 ) + ( parallelCap ("met1" "drawing") ("diff" "drawing") 0.000105 ) + ( parallelCap ("li1" "drawing") ("diff" "drawing") 7.98e-05 ) + ( parallelCap ("poly" "drawing") ("diff" "drawing") 7.61e-05 ) + ) ;orderedElectrical + ) ;foundry +) ;constraintGroups + + +;******************************** +; DEVICES +;******************************** + +devices( +tcCreateCDSDeviceClass() + + +ruleContactDevice( +; ( viaName (layer1 purpose1 layer1BBox1 [layer1BBox2 ...]) +; (viaLayer viaPurpose viaLayerBBox1 [viaLayerBBox2 ...]) +; (layer2 purpose2 layer2BBox1 [layer2BBox2 ...]) +; ) + ( ruleVia + ( met1 drawing + ( -0.160000 -0.160000 0.160000 0.160000 ) + ) + ( via drawing + ( -0.075000 -0.075000 0.075000 0.075000 ) + ) + ( met2 drawing + ( -0.160000 -0.160000 0.160000 0.160000 ) + ) + ) + ( ruleVia1 + ( met1 drawing + ( -0.160000 -0.160000 0.160000 0.160000 ) + ) + ( via drawing + ( -0.075000 -0.075000 0.075000 0.075000 ) + ) + ( met2 drawing + ( -0.160000 -0.160000 0.160000 0.160000 ) + ) + ) + ( ruleVia2 + ( met2 drawing + ( -0.140000 -0.140000 0.140000 0.140000 ) + ) + ( via2 drawing + ( -0.100000 -0.100000 0.100000 0.100000 ) + ) + ( met3 drawing + ( -0.165000 -0.165000 0.165000 0.165000 ) + ) + ) + ( ruleVia3 + ( met3 drawing + ( -0.160000 -0.160000 0.160000 0.160000 ) + ) + ( via3 drawing + ( -0.100000 -0.100000 0.100000 0.100000 ) + ) + ( met4 drawing + ( -0.165000 -0.165000 0.165000 0.165000 ) + ) + ) + ( ruleVia4 + ( met4 drawing + ( -0.590000 -0.590000 0.590000 0.590000 ) + ) + ( via4 drawing + ( -0.400000 -0.400000 0.400000 0.400000 ) + ) + ( met5 drawing + ( -0.710000 -0.710000 0.710000 0.710000 ) + ) + ) +) + +; +; no syEnhancement devices +; + +; +; no syDepletion devices +; + + +; +; no cdsVia devices +; + +; +; no cdsMos devices +; + + +multipartPathTemplates( +; ( name [masterPath] [offsetSubpaths] [encSubPaths] [subRects] ) +; +; masterPath: +; (layer [width] [choppable] [endType] [beginExt] [endExt] [justify] [offset] +; [connectivity]) +; +; offsetSubpaths: +; (layer [width] [choppable] [separation] [justification] [begOffset] [endOffset] +; [connectivity]) +; +; encSubPaths: +; (layer [enclosure] [choppable] [begOffset] [endOffset] +; [connectivity]) +; +; subRects: +; (layer [width] [length] [choppable] [separation] [justification] [space] [begOffset] [endOffset] [gap] +; [connectivity] [beginSegOffset] [endSegOffset]) +; +; connectivity: +; ([I/O type] [pin] [accDir] [dispPinName] [height] [ layer] +; [layer] [justification] [font] [textOptions] [orientation] +; [refHandle] [offset]) +; +; ( --------------------------------------------------------------------- ) + (PYL1_MPP + (("poly" "drawing") 0.33 t truncate 0.0 0.0 center 0.0) + nil + ((("li1" "drawing") 0.08 t 0.0 0.0) + (("npc" "drawing") -0.02 t 0.02 0.02) + ) + ((("licon1" "drawing") nil nil t 0.0 center nil -0.1 -0.1 minimum nil 0.1 0.1) + ) + ) + (PYM1_MPP + (("poly" "drawing") 0.33 t truncate 0.0 0.0 center 0.0) + nil + ((("li1" "drawing") 0.08 t 0.0 0.0) + (("npc" "drawing") -0.02 t 0.02 0.02) + (("met1" "drawing") 0.02 t 0.0 0.0) + ) + ((("licon1" "drawing") nil nil t 0.0 center nil -0.1 -0.1 minimum nil 0.1 0.1) + (("mcon" "drawing") nil nil t 0.0 center nil -0.06 -0.06 minimum nil 0.06 0.06) + ) + ) + (L1M1_MPP + (("met1" "drawing") 0.23 t truncate 0.0 0.0 center 0.0) + nil + ((("li1" "drawing") nil t 0.0 0.0) + ) + ((("mcon" "drawing") nil nil t 0.0 center nil -0.06 -0.06 minimum nil 0.06 0.06) + ) + ) + (L1M2_MPP + (("met2" "drawing") 0.26 t truncate 0.0 0.0 center 0.0) + nil + ((("li1" "drawing") nil t 0.0 0.0) + (("met1" "drawing") nil t 0.0 0.0) + ) + ((("mcon" "drawing") nil nil t 0.0 center nil -0.06 -0.06 minimum nil 0.06 0.06) + (("via" "drawing") nil nil t 0.0 center nil -0.085 -0.085 minimum nil 0.085 0.085) + ) + ) + (M1M2_MPP + (("met2" "drawing") 0.26 t truncate 0.0 0.0 center 0.0) + nil + ((("met1" "drawing") nil t 0.0 0.0) + ) + ((("via" "drawing") nil nil t 0.0 center nil -0.085 -0.085 minimum nil 0.085 0.085) + ) + ) + (M2M3_MPP + (("met2" "drawing") 0.28 t truncate 0.0 0.0 center 0.0) + nil + ((("met3" "drawing") -0.025 t 0.0 0.0) + ) + ((("via2" "drawing") nil nil t 0.0 center nil -0.085 -0.065 minimum nil 0.085 0.065) + ) + ) + (PTPL1_MPP + (("tap" "drawing") 0.17 t truncate 0.0 0.0 center 0.0) + nil + ((("li1" "drawing") nil t 0.0 0.0) + (("psdm" "drawing") -0.125 t 0.125 0.125) + ) + ((("licon1" "drawing") nil nil t 0.0 center nil -0.12 -0.12 minimum nil 0.12 0.12) + ) + ) + (PTPM1_MPP + (("tap" "drawing") 0.17 t truncate 0.0 0.0 center 0.0) + nil + ((("li1" "drawing") nil t 0.0 0.0) + (("met1" "drawing") -0.06 t 0.0 0.0) + (("psdm" "drawing") -0.125 t 0.125 0.125) + ) + ((("licon1" "drawing") nil nil t 0.0 center nil -0.12 -0.12 minimum nil 0.12 0.12) + (("mcon" "drawing") nil nil t 0.0 center nil -0.06 -0.06 minimum nil 0.06 0.06) + ) + ) + (NTPL1_MPP + (("tap" "drawing") 0.17 t truncate 0.0 0.0 center 0.0) + nil + ((("li1" "drawing") nil t 0.0 0.0) + (("nsdm" "drawing") -0.125 t 0.125 0.125) + (("nwell" "drawing") -0.18 t 0.18 0.18) + ) + ((("licon1" "drawing") nil nil t 0.0 center nil -0.12 -0.12 minimum nil 0.12 0.12) + ) + ) + (NTPM1_MPP + (("tap" "drawing") 0.17 t truncate 0.0 0.0 center 0.0) + nil + ((("li1" "drawing") nil t 0.0 0.0) + (("met1" "drawing") -0.06 t 0.0 0.0) + (("nsdm" "drawing") -0.125 t 0.125 0.125) + (("nwell" "drawing") -0.18 t 0.18 0.18) + ) + ((("licon1" "drawing") nil nil t 0.0 center nil -0.12 -0.12 minimum nil 0.12 0.12) + (("mcon" "drawing") nil nil t 0.0 center nil -0.06 -0.06 minimum nil 0.06 0.06) + ) + ) +) ;multipartPathTemplates +; +; no syRectPin devices +; + +; +; Opus Symbolic Device Class Definitions removed +; + +; +; Opus Symbolic Device Declarations removed +; + + +) ;devices + + + +;******************************** +; LE RULES +;******************************** +leRules( + + leLswLayers( + ;( layer purpose ) + ;( ----- ------- ) + ) ;leLswLayers + +) ;leRules + + +;******************************** +; SITEDEFS +;******************************** +siteDefs( + + scalarSiteDefs( + ;( siteDefName type width height symInX symInY symInR90) + ;( ----------- ---- ----- ------ ------ ------ -------) + ) ;scalarSiteDefs + + arraySiteDefs( + ; ( name type + ; ((siteDefName dx dy orientation) ...) + ; [symX] [symY] [symR90] ) + + ) ;arraySiteDefs + +) ;siteDefs + + +;******************************** +; VIASPECS +;******************************** + +viaSpecs( + ;(layer1 layer2 (viaDefName ...) + ; [( + ; (layer1MinWidth layer1MaxWidth layer2MinWidth layer2MaxWidth + ; (viaDefName ...)) + ; ... + ; )]) + ;( ------------------------------------------------------------------------ ) +) ;viaSpecs diff --git a/sky130_cds/VirtuosoOA/sky130/.oalib b/sky130_cds/VirtuosoOA/sky130/.oalib new file mode 100644 index 000000000..21ffef899 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130/.oalib @@ -0,0 +1,6 @@ + + + + + diff --git a/sky130_cds/VirtuosoOA/sky130/cdsinfo.tag b/sky130_cds/VirtuosoOA/sky130/cdsinfo.tag new file mode 100644 index 000000000..b75aa95c9 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130/cdsinfo.tag @@ -0,0 +1,41 @@ +# +# This is a cdsinfo.tag file. +# +# See the "Cadence Application Infrastructure Reference Manual" for +# details on the format of this file, its semantics, and its use. +# +# The `#' character denotes a comment. Removing the leading `#' +# character from any of the entries below will activate them. +# +# CDSLIBRARY entry - add this entry if the directory containing +# this cdsinfo.tag file is the root of a Cadence library. +# CDSLIBRARY +# +# CDSLIBCHECK - set this entry to require that libraries have +# a cdsinfo.tag file with a CDSLIBRARY entry. Legal values are +# ON and OFF. By default (OFF), directories named in a cds.lib file +# do not have to have a cdsinfo.tag file with a CDSLIBRARY entry. +# CDSLIBCHECK ON +# +# DMTYPE - set this entry to define the DM system for Cadence's +# Generic DM facility. Values will be shifted to lower case. +# DMTYPE none +# DMTYPE crcs +# DMTYPE tdm +# DMTYPE sync +# +# NAMESPACE - set this entry to define the library namespace according +# to the type of machine on which the data is stored. Legal values are +# `LibraryNT' and +# `LibraryUnix'. +# NAMESPACE LibraryUnix +# +# Other entries may be added for use by specific applications as +# name-value pairs. Application documentation will describe the +# use and behaviour of these entries when appropriate. +# +# Current Settings: +# +CDSLIBRARY +DMTYPE none +NAMESPACE LibraryUnix diff --git a/sky130_cds/VirtuosoOA/sky130/data.dm b/sky130_cds/VirtuosoOA/sky130/data.dm new file mode 100644 index 000000000..df840aca7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/data.dm differ diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia/symbolic/layout.oa b/sky130_cds/VirtuosoOA/sky130/ruleVia/symbolic/layout.oa new file mode 100644 index 000000000..f15d3c83b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/ruleVia/symbolic/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia/symbolic/master.tag b/sky130_cds/VirtuosoOA/sky130/ruleVia/symbolic/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130/ruleVia/symbolic/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia/symbolic/thumbnail_128x128.png b/sky130_cds/VirtuosoOA/sky130/ruleVia/symbolic/thumbnail_128x128.png new file mode 100644 index 000000000..ff9ddbecb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/ruleVia/symbolic/thumbnail_128x128.png differ diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia1/symbolic/layout.oa b/sky130_cds/VirtuosoOA/sky130/ruleVia1/symbolic/layout.oa new file mode 100644 index 000000000..43f1418b4 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/ruleVia1/symbolic/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia1/symbolic/master.tag b/sky130_cds/VirtuosoOA/sky130/ruleVia1/symbolic/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130/ruleVia1/symbolic/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia1/symbolic/thumbnail_128x128.png b/sky130_cds/VirtuosoOA/sky130/ruleVia1/symbolic/thumbnail_128x128.png new file mode 100644 index 000000000..ff9ddbecb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/ruleVia1/symbolic/thumbnail_128x128.png differ diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia2/symbolic/layout.oa b/sky130_cds/VirtuosoOA/sky130/ruleVia2/symbolic/layout.oa new file mode 100644 index 000000000..08479654d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/ruleVia2/symbolic/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia2/symbolic/master.tag b/sky130_cds/VirtuosoOA/sky130/ruleVia2/symbolic/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130/ruleVia2/symbolic/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia2/symbolic/thumbnail_128x128.png b/sky130_cds/VirtuosoOA/sky130/ruleVia2/symbolic/thumbnail_128x128.png new file mode 100644 index 000000000..a553cc485 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/ruleVia2/symbolic/thumbnail_128x128.png differ diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia3/symbolic/layout.oa b/sky130_cds/VirtuosoOA/sky130/ruleVia3/symbolic/layout.oa new file mode 100644 index 000000000..29bbb085e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/ruleVia3/symbolic/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia3/symbolic/master.tag b/sky130_cds/VirtuosoOA/sky130/ruleVia3/symbolic/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130/ruleVia3/symbolic/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia3/symbolic/thumbnail_128x128.png b/sky130_cds/VirtuosoOA/sky130/ruleVia3/symbolic/thumbnail_128x128.png new file mode 100644 index 000000000..6b00f4761 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/ruleVia3/symbolic/thumbnail_128x128.png differ diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia4/symbolic/layout.oa b/sky130_cds/VirtuosoOA/sky130/ruleVia4/symbolic/layout.oa new file mode 100644 index 000000000..6db0dc915 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/ruleVia4/symbolic/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia4/symbolic/master.tag b/sky130_cds/VirtuosoOA/sky130/ruleVia4/symbolic/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130/ruleVia4/symbolic/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130/ruleVia4/symbolic/thumbnail_128x128.png b/sky130_cds/VirtuosoOA/sky130/ruleVia4/symbolic/thumbnail_128x128.png new file mode 100644 index 000000000..5f8a1e89e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/ruleVia4/symbolic/thumbnail_128x128.png differ diff --git a/sky130_cds/VirtuosoOA/sky130/sample/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130/sample/layout/layout.oa new file mode 100644 index 000000000..14416e63d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/sample/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130/sample/layout/master.tag b/sky130_cds/VirtuosoOA/sky130/sample/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130/sample/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130/sample/layout/thumbnail_128x128.png b/sky130_cds/VirtuosoOA/sky130/sample/layout/thumbnail_128x128.png new file mode 100644 index 000000000..86e9a615d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/sample/layout/thumbnail_128x128.png differ diff --git a/sky130_cds/VirtuosoOA/sky130/tech.db b/sky130_cds/VirtuosoOA/sky130/tech.db new file mode 100644 index 000000000..6bfe5a812 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130/tech.db differ diff --git a/sky130_cds/VirtuosoOA/sky130_drcRules.pvl b/sky130_cds/VirtuosoOA/sky130_drcRules.pvl new file mode 100755 index 000000000..fbe6504e0 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_drcRules.pvl @@ -0,0 +1,420 @@ + +incr_conn YES +results_db -drc mult_seq.drc_errors.ascii -ascii + +/// Tolerance for round-off errors on skew edges +tolerance 0.001 + +/// Unused MaskLayers: (FOM DNM NWM HVTRM TUNM ONOM LVOM P1M NPCM LDNTM NSDM PSDM LICM1 LI1M CTM1 MM1 VIM MM2 VIM2 MM3 VIM3 MM4 VIM4 MM5 NSM PDM PBO RPM CU1M PMM2) +layer_def nwell 1000 +layer_map 64 -datatype 20 1000 // nwell drawing + +layer_def diff 1001 +layer_map 65 -datatype 20 1001 // diff drawing + +layer_def poly 1008 +layer_map 66 -datatype 20 1008 // poly drawing + +layer_def licon1 1012 +layer_map 66 -datatype 44 1012 // licon1 drawing + +layer_def li1 1013 +layer_map 67 -datatype 20 1013 // li1 drawing + +layer_def mcon 1014 +layer_map 67 -datatype 44 1014 // mcon drawing + +layer_def met1 1015 +layer_map 68 -datatype 20 1015 // met1 drawing + +layer_def via 1016 +layer_map 68 -datatype 44 1016 // via drawing + +layer_def met2 1017 +layer_map 69 -datatype 20 1017 // met2 drawing + +layer_def via2 1019 +layer_map 69 -datatype 44 1019 // via2 drawing + +layer_def met3 1020 +layer_map 70 -datatype 20 1020 // met3 drawing + +layer_def via3 1021 +layer_map 70 -datatype 44 1021 // via3 drawing + +layer_def met4 1022 +layer_map 71 -datatype 20 1022 // met4 drawing + +layer_def via4 1023 +layer_map 71 -datatype 44 1023 // via4 drawing + +layer_def met5 1024 +layer_map 72 -datatype 20 1024 // met5 drawing + +layer_def pad 1026 +layer_map 76 -datatype 20 1026 // pad drawing + +layer_def capacitor 1031 +layer_map 82 -datatype 64 1031 // capacitor drawing + +layer_def inductor 1034 +layer_map 82 -datatype 24 1034 // inductor drawing + +layer_def polyGate 1074 +layer_map 66 -datatype 9 1074 // poly gate + +layer_def padText 1089 +layer_map 76 -texttype 5 1089 // pad label + +layer_def diffLabel 1090 +layer_map 65 -datatype 6 1090 // diff label + +layer_def nwellLabel 1092 +layer_map 64 -datatype 5 1092 // nwell label + +layer_def polyLabel 1093 +layer_map 66 -datatype 5 1093 // poly label + +layer_def met1Label 1094 +layer_map 68 -datatype 5 1094 // met1 label + +layer_def met2Label 1095 +layer_map 69 -datatype 5 1095 // met2 label + +layer_def met3Label 1096 +layer_map 70 -datatype 5 1096 // met3 label + +layer_def met4Label 1097 +layer_map 71 -datatype 5 1097 // met4 label + +layer_def met5Label 1098 +layer_map 72 -datatype 5 1098 // met5 label + +layer_def li1Block 1099 +layer_map 67 -datatype 10 1099 // li1 blockage + +layer_def met1Block 1100 +layer_map 68 -datatype 10 1100 // met1 blockage + +layer_def met2Block 1101 +layer_map 69 -datatype 10 1101 // met2 blockage + +layer_def met3Block 1102 +layer_map 70 -datatype 10 1102 // met3 blockage + +layer_def met4Block 1103 +layer_map 71 -datatype 10 1103 // met4 blockage + +layer_def met5Block 1104 +layer_map 72 -datatype 10 1104 // met5 blockage + +layer_def diffBndry 1106 +layer_map 65 -datatype 4 1106 // diff boundary + +layer_def mconBndry 1108 +layer_map 67 -datatype 60 1108 // mcon boundary + +layer_def polyBndry 1109 +layer_map 66 -datatype 4 1109 // poly boundary + +layer_def viaBndry 1110 +layer_map 68 -datatype 60 1110 // via boundary + +layer_def via2Bndry 1111 +layer_map 69 -datatype 60 1111 // via2 boundary + +layer_def via3Bndry 1112 +layer_map 70 -datatype 60 1112 // via3 boundary + +layer_def via4Bndry 1113 +layer_map 71 -datatype 60 1113 // via4 boundary + +layer_def li1tt 1114 1115 1116 1117 +layer_map 67 -texttype 20 1114 // li1 drawing +layer_map 67 -texttype 5 1115 // li1 label +layer_map 67 -texttype 23 1116 // li1 net +layer_map 67 -texttype 16 1117 // li1 pin + +layer_def met1tt 1118 1119 1120 1121 +layer_map 68 -texttype 20 1118 // met1 drawing +layer_map 68 -texttype 5 1119 // met1 label +layer_map 68 -texttype 23 1120 // met1 net +layer_map 68 -texttype 16 1121 // met1 pin + +layer_def met2tt 1122 1123 1124 1125 +layer_map 69 -texttype 20 1122 // met2 drawing +layer_map 69 -texttype 5 1123 // met2 label +layer_map 69 -texttype 23 1124 // met2 net +layer_map 69 -texttype 16 1125 // met2 pin + +layer_def met3tt 1126 1127 1128 1129 +layer_map 70 -texttype 20 1126 // met3 drawing +layer_map 70 -texttype 5 1127 // met3 label +layer_map 70 -texttype 23 1128 // met3 net +layer_map 70 -texttype 16 1129 // met3 pin + +layer_def met4tt 1130 1131 1132 1133 +layer_map 71 -texttype 20 1130 // met4 drawing +layer_map 71 -texttype 5 1131 // met4 label +layer_map 71 -texttype 23 1132 // met4 net +layer_map 71 -texttype 16 1133 // met4 pin + +layer_def met5tt 1134 1135 1136 1137 +layer_map 72 -texttype 20 1134 // met5 drawing +layer_map 72 -texttype 5 1135 // met5 label +layer_map 72 -texttype 23 1136 // met5 net +layer_map 72 -texttype 16 1137 // met5 pin + +layer_def polytt 1138 1139 1140 1141 +layer_map 66 -texttype 20 1138 // poly drawing +layer_map 66 -texttype 5 1139 // poly label +layer_map 66 -texttype 23 1140 // poly net +layer_map 66 -texttype 16 1141 // poly pin + +layer_def difftt 1142 1143 1144 1145 +layer_map 65 -texttype 20 1142 // diff drawing +layer_map 65 -texttype 6 1143 // diff label +layer_map 65 -texttype 23 1144 // diff net +layer_map 65 -texttype 16 1145 // diff pin + +layer_def poly_pin 1146 +layer_map 66 -datatype 16 1146 // poly pin + +layer_def li1_pin 1147 +layer_map 67 -datatype 16 1147 // li1 pin + +layer_def met1_pin 1148 +layer_map 68 -datatype 16 1148 // met1 pin + +layer_def met2_pin 1149 +layer_map 69 -datatype 16 1149 // met2 pin + +layer_def met3_pin 1150 +layer_map 70 -datatype 16 1150 // met3 pin + +layer_def met4_pin 1151 +layer_map 71 -datatype 16 1151 // met4 pin + +layer_def met5_pin 1152 +layer_map 72 -datatype 16 1152 // met5 pin + +layer_def nwellpt 1153 +layer_map 64 -texttype 16 1153 // nwell pin +layer_map 64 -texttype 0 1153 // nwell pin + +layer_def polypt 1154 +layer_map 66 -texttype 16 1154 // poly pin +layer_map 66 -texttype 0 1154 // poly pin + +layer_def li1pt 1155 +layer_map 67 -texttype 16 1155 // li1 pin +layer_map 67 -texttype 0 1155 // li1 pin + +layer_def met1pt 1156 +layer_map 68 -texttype 16 1156 // met1 pin +layer_map 68 -texttype 0 1156 // met1 pin + +layer_def met2pt 1157 +layer_map 69 -texttype 16 1157 // met2 pin +layer_map 69 -texttype 0 1157 // met2 pin + +layer_def met3pt 1158 +layer_map 70 -texttype 16 1158 // met3 pin +layer_map 70 -texttype 0 1158 // met3 pin + +layer_def met4pt 1159 +layer_map 71 -texttype 16 1159 // met4 pin +layer_map 71 -texttype 0 1159 // met4 pin + +layer_def met5pt 1160 +layer_map 72 -texttype 16 1160 // met5 pin +layer_map 72 -texttype 0 1160 // met5 pin + +layer_def padtt 1167 1089 +layer_map 76 -texttype 20 1167 // pad drawing + // 1089 -> pad label + +layer_def pad_pin 1168 +layer_map 76 -datatype 16 1168 // pad pin + +layer_def padpt 1169 +layer_map 76 -texttype 16 1169 // pad pin +layer_map 76 -texttype 0 1169 // pad pin + +layer_def met5Pin 1152 + // 1152 -> met5 pin + +layer_def met4Pin 1151 + // 1151 -> met4 pin + +layer_def met3Pin 1150 + // 1150 -> met3 pin + +layer_def met2Pin 1149 + // 1149 -> met2 pin + +layer_def met1Pin 1148 + // 1148 -> met1 pin + +layer_def li1Pin 1147 + // 1147 -> li1 pin + +layer_def polyPin 1146 + // 1146 -> poly pin + +layer_def diffPin 1222 +layer_map 65 -datatype 16 1222 // diff pin + +treat_non_baselayer_as_toplayer yes +base_layer diff +base_layer poly +layer_def pwellLabel 1229 +layer_map 64 -datatype 59 1229 // pwell label + +layer_def pwelltt 1230 +layer_map 64 -texttype 59 1230 // pwell label + +layer_def pwell_pin 1231 +layer_map 122 -datatype 16 1231 // pwell pin + +layer_def pwellpt 1232 +layer_map 122 -texttype 16 1232 // pwell pin +layer_map 122 -texttype 0 1232 // pwell pin + +copy inductor -outputlayer inductor_exempt +and diff nwell -outputlayer PDIFF +not diff nwell -outputlayer NDIFF +not diff poly -outputlayer SRCDRN +and poly diff -outputlayer POLYandDIFF +copy POLYandDIFF -outputlayer GATE +edge_boolean -inside GATE diff -outputlayer GATESIDE +edge_boolean -coincident_only -inside GATE diff -outputlayer GATEEND +//edge_boolean -coincident_only -outside diff tap -outputlayer diffTapEdge +copy GATE -outputlayer MOSGATE +copy MOSGATE -outputlayer EMOSGATE +disconnect +//and npc licon1 -outputlayer npccon +//connect dnwell nwell +//connect nwell tap -by NTAP +//connect tap li1 -by licon1 +//connect poly li1 -by npccon +connect li1 met1 -by mcon +connect met1 met2 -by via +connect met3 met2 -by via2 +connect met3 met4 -by via3 +connect met4 met5 -by via4 +connect met5 pad +rule "R0_nwell_X1" { +caption "nwell_X1: off 0.005 grid nwell vertex" +offgrid nwell 5 +} +rule "R1_diff_X1" { +caption "diff_X1: off 0.005 grid diff vertex" +offgrid diff 5 +} +rule "R2_poly_X1" { +caption "poly_X1: off 0.005 grid poly vertex" +offgrid poly 5 +} +rule "R3_li1_X1" { +caption "li1_X1: off 0.005 grid li1 vertex" +offgrid li1 5 +} +rule "R4_mcon_X1" { +caption "mcon_X1: off 0.005 grid mcon vertex" +offgrid mcon 5 +} +rule "R5_met1_X1" { +caption "met1_X1: off 0.005 grid met1 vertex" +offgrid met1 5 +} +rule "R6_via_X1" { +caption "via_X1: off 0.005 grid via vertex" +offgrid via 5 +} +rule "R7_met2_X1" { +caption "met2_X1: off 0.005 grid met2 vertex" +offgrid met2 5 +} +rule "R8_via2_X1" { +caption "via2_X1: off 0.005 grid via2 vertex" +offgrid via2 5 +} +rule "R9_met3_X1" { +caption "met3_X1: off 0.005 grid met3 vertex" +offgrid met3 5 +} +rule "R10_via3_X1" { +caption "via3_X1: off 0.005 grid via3 vertex" +offgrid via3 5 +} +rule "R11_met4_X1" { +caption "met4_X1: off 0.005 grid met4 vertex" +offgrid met4 5 +} +rule "R12_via4_X1" { +caption "via4_X1: off 0.005 grid via4 vertex" +offgrid via4 5 +} +rule "R13_met5_X1" { +caption "met5_X1: off 0.005 grid met5 vertex" +offgrid met5 5 +} +rule "R14_pad_X1" { +caption "pad_X1: off 0.005 grid pad vertex" +offgrid pad 5 +} +rule "R15_cap_X1" { +caption "cap_X1: off 0.005 grid capacitor vertex" +offgrid capacitor 5 +} +rule "R16_ind_X1" { +caption "ind_X1: off 0.005 grid inductor vertex" +offgrid inductor 5 +} +rule "R17_nwell_X2" { +caption "nwell_X2: non-octagonal nwell edge" +angle nwell -ltgt 0 45 +angle nwell -ltgt 45 90 +} +rule "R18_diff_X2" { +caption "diff_X2: non-octagonal diff edge" +angle diff -ltgt 0 45 +angle diff -ltgt 45 90 +} +rule "R19_met1_X2" { +caption "met1_X2: non-octagonal met1 edge" +angle met1 -ltgt 0 45 +angle met1 -ltgt 45 90 +} +rule "R20_met2_X2" { +caption "met2_X2: non-octagonal met2 edge" +angle met2 -ltgt 0 45 +angle met2 -ltgt 45 90 +} +rule "R21_met3_X2" { +caption "met3_X2: non-octagonal met3 edge" +angle met3 -ltgt 0 45 +angle met3 -ltgt 45 90 +} +rule "R22_met4_X2" { +caption "met4_X2: non-octagonal met4 edge" +angle met4 -ltgt 0 45 +angle met4 -ltgt 45 90 +} +rule "R23_met5_X2" { +caption "met5_X2: non-octagonal met5 edge" +angle met5 -ltgt 0 45 +angle met5 -ltgt 45 90 +} +rule "R24_cap_X2" { +caption "cap_X2: non-octagonal capacitor edge" +angle capacitor -ltgt 0 45 +angle capacitor -ltgt 45 90 +} +rule "R25_ind_X2" { +caption "ind_X2: non-octagonal inductor edge" +angle inductor -ltgt 0 45 +angle inductor -ltgt 45 90 +} + diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/.oalib b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/.oalib new file mode 100644 index 000000000..21ffef899 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/.oalib @@ -0,0 +1,6 @@ + + + + + diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/cdsinfo.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/cdsinfo.tag new file mode 100644 index 000000000..b75aa95c9 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/cdsinfo.tag @@ -0,0 +1,41 @@ +# +# This is a cdsinfo.tag file. +# +# See the "Cadence Application Infrastructure Reference Manual" for +# details on the format of this file, its semantics, and its use. +# +# The `#' character denotes a comment. Removing the leading `#' +# character from any of the entries below will activate them. +# +# CDSLIBRARY entry - add this entry if the directory containing +# this cdsinfo.tag file is the root of a Cadence library. +# CDSLIBRARY +# +# CDSLIBCHECK - set this entry to require that libraries have +# a cdsinfo.tag file with a CDSLIBRARY entry. Legal values are +# ON and OFF. By default (OFF), directories named in a cds.lib file +# do not have to have a cdsinfo.tag file with a CDSLIBRARY entry. +# CDSLIBCHECK ON +# +# DMTYPE - set this entry to define the DM system for Cadence's +# Generic DM facility. Values will be shifted to lower case. +# DMTYPE none +# DMTYPE crcs +# DMTYPE tdm +# DMTYPE sync +# +# NAMESPACE - set this entry to define the library namespace according +# to the type of machine on which the data is stored. Legal values are +# `LibraryNT' and +# `LibraryUnix'. +# NAMESPACE LibraryUnix +# +# Other entries may be added for use by specific applications as +# name-value pairs. Application documentation will describe the +# use and behaviour of these entries when appropriate. +# +# Current Settings: +# +CDSLIBRARY +DMTYPE none +NAMESPACE LibraryUnix diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/data.dm b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/data.dm new file mode 100644 index 000000000..e9974146e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/data.dm differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addf_1/layout/layout.oa new file mode 100644 index 000000000..ea6ca1981 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addf_l/layout/layout.oa new file mode 100644 index 000000000..bf509509c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addh_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addh_1/layout/layout.oa new file mode 100644 index 000000000..13156b5ce Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addh_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addh_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addh_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addh_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addh_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addh_l/layout/layout.oa new file mode 100644 index 000000000..2ca0cd608 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addh_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addh_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addh_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__addh_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_1/layout/layout.oa new file mode 100644 index 000000000..d9729b2c1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_2/layout/layout.oa new file mode 100644 index 000000000..ea717f604 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_4/layout/layout.oa new file mode 100644 index 000000000..5522841eb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_6/layout/layout.oa new file mode 100644 index 000000000..3f9cbda76 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_8/layout/layout.oa new file mode 100644 index 000000000..39b190b56 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_l/layout/layout.oa new file mode 100644 index 000000000..01724003e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__and2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ant/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ant/layout/layout.oa new file mode 100644 index 000000000..501fbd1eb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ant/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ant/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ant/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ant/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__antfill/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__antfill/layout/layout.oa new file mode 100644 index 000000000..55bb99f4a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__antfill/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__antfill/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__antfill/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__antfill/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__aoi21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__aoi21_l/layout/layout.oa new file mode 100644 index 000000000..90ce8ea7a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__aoi21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__aoi21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__aoi21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__aoi21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__aoi22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__aoi22_l/layout/layout.oa new file mode 100644 index 000000000..c38b0fcee Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__aoi22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__aoi22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__aoi22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__aoi22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_1/layout/layout.oa new file mode 100644 index 000000000..48a7f15f7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_2/layout/layout.oa new file mode 100644 index 000000000..a53c7f1fc Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_4/layout/layout.oa new file mode 100644 index 000000000..ab77c282b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_6/layout/layout.oa new file mode 100644 index 000000000..8ca47298d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_8/layout/layout.oa new file mode 100644 index 000000000..6b9b62c65 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_l/layout/layout.oa new file mode 100644 index 000000000..75ae35a76 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__buf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__decap_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__decap_1/layout/layout.oa new file mode 100644 index 000000000..ead61a116 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__decap_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__decap_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__decap_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__decap_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__decap_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__decap_l/layout/layout.oa new file mode 100644 index 000000000..71086477d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__decap_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__decap_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__decap_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__decap_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dff_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dff_1/layout/layout.oa new file mode 100644 index 000000000..d416eb5a4 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dff_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dff_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dff_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dff_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dff_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dff_l/layout/layout.oa new file mode 100644 index 000000000..8a05e4d82 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dff_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dff_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dff_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dff_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffr_1/layout/layout.oa new file mode 100644 index 000000000..d0d28da6c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffr_l/layout/layout.oa new file mode 100644 index 000000000..795402944 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffs_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffs_1/layout/layout.oa new file mode 100644 index 000000000..80cb589b6 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffs_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffs_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffs_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffs_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffs_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffs_l/layout/layout.oa new file mode 100644 index 000000000..3883af725 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffs_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffs_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffs_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffs_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffsr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffsr_1/layout/layout.oa new file mode 100644 index 000000000..d20b96a01 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffsr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffsr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffsr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffsr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffsr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffsr_l/layout/layout.oa new file mode 100644 index 000000000..7c751fe76 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffsr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffsr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffsr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dffsr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dlat_1/layout/layout.oa new file mode 100644 index 000000000..df5e3a22b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dlat_l/layout/layout.oa new file mode 100644 index 000000000..a661cc5a3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__dlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_1/layout/layout.oa new file mode 100644 index 000000000..b3f3ab030 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_16/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_16/layout/layout.oa new file mode 100644 index 000000000..ca7de6073 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_16/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_16/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_16/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_16/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_2/layout/layout.oa new file mode 100644 index 000000000..2be29bc7f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_32/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_32/layout/layout.oa new file mode 100644 index 000000000..12cc34c46 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_32/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_32/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_32/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_32/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_4/layout/layout.oa new file mode 100644 index 000000000..72463f33c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_8/layout/layout.oa new file mode 100644 index 000000000..6cc28d518 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__fill_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_1/layout/layout.oa new file mode 100644 index 000000000..7a6ef97fe Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_10/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_10/layout/layout.oa new file mode 100644 index 000000000..e86344179 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_10/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_10/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_10/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_10/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_2/layout/layout.oa new file mode 100644 index 000000000..6dde253aa Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_3/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_3/layout/layout.oa new file mode 100644 index 000000000..a40cacf98 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_3/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_3/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_3/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_3/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_4/layout/layout.oa new file mode 100644 index 000000000..e0e151658 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_6/layout/layout.oa new file mode 100644 index 000000000..05173f26e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_8/layout/layout.oa new file mode 100644 index 000000000..d06c960ad Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_l/layout/layout.oa new file mode 100644 index 000000000..e65fc4b73 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__inv_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__mux2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__mux2_1/layout/layout.oa new file mode 100644 index 000000000..c6ff6cc30 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__mux2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__mux2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__mux2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__mux2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nand2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nand2_1/layout/layout.oa new file mode 100644 index 000000000..c001a51ff Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nand2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nand2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nand2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nand2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nand2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nand2_l/layout/layout.oa new file mode 100644 index 000000000..1bb32a08e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nand2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nand2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nand2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nand2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ncgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ncgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..09f475d0d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ncgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ncgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ncgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ncgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ncgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ncgate_1/layout/layout.oa new file mode 100644 index 000000000..3e903ce6d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ncgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ncgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ncgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ncgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ndlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ndlat_1/layout/layout.oa new file mode 100644 index 000000000..327280220 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ndlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ndlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ndlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ndlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ndlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ndlat_l/layout/layout.oa new file mode 100644 index 000000000..a38261d23 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ndlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ndlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ndlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__ndlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nor2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nor2_1/layout/layout.oa new file mode 100644 index 000000000..a88912468 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nor2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nor2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nor2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nor2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nor2_l/layout/layout.oa new file mode 100644 index 000000000..f110b20cd Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__nor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__oai21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__oai21_l/layout/layout.oa new file mode 100644 index 000000000..97d423cfd Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__oai21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__oai21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__oai21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__oai21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__oai22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__oai22_l/layout/layout.oa new file mode 100644 index 000000000..fa2676886 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__oai22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__oai22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__oai22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__oai22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_1/layout/layout.oa new file mode 100644 index 000000000..c48e6058f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_2/layout/layout.oa new file mode 100644 index 000000000..8fa6f960a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_4/layout/layout.oa new file mode 100644 index 000000000..8e742b7f4 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_8/layout/layout.oa new file mode 100644 index 000000000..6b1c60b74 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_l/layout/layout.oa new file mode 100644 index 000000000..297fef04e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__or2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__pcgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__pcgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..8d1d53596 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__pcgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__pcgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__pcgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__pcgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__pcgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__pcgate_1/layout/layout.oa new file mode 100644 index 000000000..424c48616 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__pcgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__pcgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__pcgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__pcgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tbufi_1/layout/layout.oa new file mode 100644 index 000000000..91cd7d470 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tbufi_l/layout/layout.oa new file mode 100644 index 000000000..aa16455a3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tiehi/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tiehi/layout/layout.oa new file mode 100644 index 000000000..d0fda6f07 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tiehi/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tiehi/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tiehi/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tiehi/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tielo/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tielo/layout/layout.oa new file mode 100644 index 000000000..ab147fc4b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tielo/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tielo/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tielo/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tielo/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tnbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tnbufi_1/layout/layout.oa new file mode 100644 index 000000000..22b362e55 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tnbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tnbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tnbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tnbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tnbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tnbufi_l/layout/layout.oa new file mode 100644 index 000000000..309cc7f2f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tnbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tnbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tnbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__tnbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__xnor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__xnor2_l/layout/layout.oa new file mode 100644 index 000000000..621965173 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__xnor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__xnor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__xnor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__xnor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__xor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__xor2_l/layout/layout.oa new file mode 100644 index 000000000..0b215ee76 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__xor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__xor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__xor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_hs__xor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addf_1/layout/layout.oa new file mode 100644 index 000000000..1ce8b6c17 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addf_l/layout/layout.oa new file mode 100644 index 000000000..ad3d0dfa6 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addh_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addh_1/layout/layout.oa new file mode 100644 index 000000000..03b144348 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addh_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addh_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addh_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addh_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addh_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addh_l/layout/layout.oa new file mode 100644 index 000000000..bf4eda805 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addh_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addh_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addh_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__addh_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_1/layout/layout.oa new file mode 100644 index 000000000..756013fb3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_2/layout/layout.oa new file mode 100644 index 000000000..9b16ebfba Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_4/layout/layout.oa new file mode 100644 index 000000000..e4cda5eb0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_6/layout/layout.oa new file mode 100644 index 000000000..0ac00c12e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_8/layout/layout.oa new file mode 100644 index 000000000..b771eafa1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_l/layout/layout.oa new file mode 100644 index 000000000..7c1f912d1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__and2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ant/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ant/layout/layout.oa new file mode 100644 index 000000000..f7f2140f1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ant/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ant/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ant/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ant/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__antfill/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__antfill/layout/layout.oa new file mode 100644 index 000000000..6ad8e0466 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__antfill/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__antfill/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__antfill/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__antfill/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__aoi21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__aoi21_l/layout/layout.oa new file mode 100644 index 000000000..12b535470 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__aoi21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__aoi21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__aoi21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__aoi21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__aoi22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__aoi22_l/layout/layout.oa new file mode 100644 index 000000000..2396f02f5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__aoi22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__aoi22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__aoi22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__aoi22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_1/layout/layout.oa new file mode 100644 index 000000000..0c7861fb3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_2/layout/layout.oa new file mode 100644 index 000000000..f8a40d9d6 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_4/layout/layout.oa new file mode 100644 index 000000000..6215158b2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_6/layout/layout.oa new file mode 100644 index 000000000..0a4881846 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_8/layout/layout.oa new file mode 100644 index 000000000..13caf38fd Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_l/layout/layout.oa new file mode 100644 index 000000000..c25625440 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__buf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__decap_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__decap_1/layout/layout.oa new file mode 100644 index 000000000..668ec0ad3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__decap_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__decap_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__decap_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__decap_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__decap_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__decap_l/layout/layout.oa new file mode 100644 index 000000000..f4097e599 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__decap_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__decap_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__decap_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__decap_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dff_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dff_1/layout/layout.oa new file mode 100644 index 000000000..71dcc6dcb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dff_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dff_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dff_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dff_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dff_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dff_l/layout/layout.oa new file mode 100644 index 000000000..571aeecbe Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dff_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dff_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dff_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dff_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffr_1/layout/layout.oa new file mode 100644 index 000000000..5c47c5909 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffr_l/layout/layout.oa new file mode 100644 index 000000000..13bf9a38a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffs_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffs_1/layout/layout.oa new file mode 100644 index 000000000..da661cd68 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffs_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffs_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffs_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffs_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffs_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffs_l/layout/layout.oa new file mode 100644 index 000000000..570fe6815 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffs_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffs_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffs_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffs_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffsr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffsr_1/layout/layout.oa new file mode 100644 index 000000000..d17346182 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffsr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffsr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffsr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffsr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffsr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffsr_l/layout/layout.oa new file mode 100644 index 000000000..208cc4613 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffsr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffsr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffsr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dffsr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dlat_1/layout/layout.oa new file mode 100644 index 000000000..2e62e9e02 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dlat_l/layout/layout.oa new file mode 100644 index 000000000..e8c7cae99 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__dlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_1/layout/layout.oa new file mode 100644 index 000000000..e0a8233f7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_16/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_16/layout/layout.oa new file mode 100644 index 000000000..1b65ef28d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_16/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_16/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_16/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_16/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_2/layout/layout.oa new file mode 100644 index 000000000..bc64fe980 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_32/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_32/layout/layout.oa new file mode 100644 index 000000000..0b010fb16 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_32/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_32/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_32/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_32/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_4/layout/layout.oa new file mode 100644 index 000000000..c311e64af Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_8/layout/layout.oa new file mode 100644 index 000000000..e513ccdd6 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__fill_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_1/layout/layout.oa new file mode 100644 index 000000000..57fff2bcb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_10/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_10/layout/layout.oa new file mode 100644 index 000000000..d14a41ade Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_10/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_10/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_10/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_10/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_2/layout/layout.oa new file mode 100644 index 000000000..a7c2b1fef Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_3/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_3/layout/layout.oa new file mode 100644 index 000000000..26a1d84b5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_3/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_3/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_3/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_3/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_4/layout/layout.oa new file mode 100644 index 000000000..d8bd70baf Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_6/layout/layout.oa new file mode 100644 index 000000000..74893b4b0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_8/layout/layout.oa new file mode 100644 index 000000000..ae90e4955 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_l/layout/layout.oa new file mode 100644 index 000000000..ed1efa4e5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__inv_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__mux2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__mux2_1/layout/layout.oa new file mode 100644 index 000000000..3a13e0ad1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__mux2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__mux2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__mux2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__mux2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nand2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nand2_1/layout/layout.oa new file mode 100644 index 000000000..a8ff9a122 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nand2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nand2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nand2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nand2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nand2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nand2_l/layout/layout.oa new file mode 100644 index 000000000..e32d80b0b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nand2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nand2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nand2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nand2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ncgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ncgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..d3ce867c8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ncgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ncgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ncgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ncgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ncgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ncgate_1/layout/layout.oa new file mode 100644 index 000000000..d5fa4f0c1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ncgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ncgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ncgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ncgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ndlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ndlat_1/layout/layout.oa new file mode 100644 index 000000000..c9c16058d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ndlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ndlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ndlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ndlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ndlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ndlat_l/layout/layout.oa new file mode 100644 index 000000000..35ae13f32 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ndlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ndlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ndlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__ndlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nor2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nor2_1/layout/layout.oa new file mode 100644 index 000000000..c95981ae7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nor2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nor2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nor2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nor2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nor2_l/layout/layout.oa new file mode 100644 index 000000000..e4bff58af Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__nor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__oai21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__oai21_l/layout/layout.oa new file mode 100644 index 000000000..210c85aa8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__oai21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__oai21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__oai21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__oai21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__oai22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__oai22_l/layout/layout.oa new file mode 100644 index 000000000..a99d828a0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__oai22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__oai22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__oai22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__oai22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_1/layout/layout.oa new file mode 100644 index 000000000..d72f59dc9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_2/layout/layout.oa new file mode 100644 index 000000000..9596045ab Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_4/layout/layout.oa new file mode 100644 index 000000000..ae2142944 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_8/layout/layout.oa new file mode 100644 index 000000000..b6e803726 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_l/layout/layout.oa new file mode 100644 index 000000000..722fdca56 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__or2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__pcgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__pcgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..9433539d6 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__pcgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__pcgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__pcgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__pcgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__pcgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__pcgate_1/layout/layout.oa new file mode 100644 index 000000000..c6054b736 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__pcgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__pcgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__pcgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__pcgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tbufi_1/layout/layout.oa new file mode 100644 index 000000000..add175ca3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tbufi_l/layout/layout.oa new file mode 100644 index 000000000..e1b738d7d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tiehi/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tiehi/layout/layout.oa new file mode 100644 index 000000000..f94e51142 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tiehi/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tiehi/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tiehi/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tiehi/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tielo/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tielo/layout/layout.oa new file mode 100644 index 000000000..404221f6d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tielo/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tielo/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tielo/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tielo/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tnbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tnbufi_1/layout/layout.oa new file mode 100644 index 000000000..71fa6d0fe Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tnbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tnbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tnbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tnbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tnbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tnbufi_l/layout/layout.oa new file mode 100644 index 000000000..06a9cdcf9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tnbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tnbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tnbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__tnbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__xnor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__xnor2_l/layout/layout.oa new file mode 100644 index 000000000..3fce8c63d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__xnor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__xnor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__xnor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__xnor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__xor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__xor2_l/layout/layout.oa new file mode 100644 index 000000000..09d301e9c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__xor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__xor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__xor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ls__xor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addf_1/layout/layout.oa new file mode 100644 index 000000000..2aa314f09 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addf_l/layout/layout.oa new file mode 100644 index 000000000..f4fdd37bd Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addh_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addh_1/layout/layout.oa new file mode 100644 index 000000000..90269ba51 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addh_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addh_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addh_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addh_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addh_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addh_l/layout/layout.oa new file mode 100644 index 000000000..4c45b10a5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addh_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addh_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addh_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__addh_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_1/layout/layout.oa new file mode 100644 index 000000000..869d94853 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_2/layout/layout.oa new file mode 100644 index 000000000..3f162774c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_4/layout/layout.oa new file mode 100644 index 000000000..a033244a5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_6/layout/layout.oa new file mode 100644 index 000000000..f74f3bc79 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_8/layout/layout.oa new file mode 100644 index 000000000..6bd051572 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_l/layout/layout.oa new file mode 100644 index 000000000..7986b8b6a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__and2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ant/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ant/layout/layout.oa new file mode 100644 index 000000000..83901eb6e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ant/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ant/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ant/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ant/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__antfill/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__antfill/layout/layout.oa new file mode 100644 index 000000000..a446cdd82 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__antfill/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__antfill/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__antfill/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__antfill/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__aoi21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__aoi21_l/layout/layout.oa new file mode 100644 index 000000000..0fef8f15d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__aoi21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__aoi21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__aoi21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__aoi21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__aoi22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__aoi22_l/layout/layout.oa new file mode 100644 index 000000000..6d39045b7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__aoi22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__aoi22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__aoi22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__aoi22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_1/layout/layout.oa new file mode 100644 index 000000000..7b25c5131 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_2/layout/layout.oa new file mode 100644 index 000000000..46567f1e2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_4/layout/layout.oa new file mode 100644 index 000000000..8a21cc28f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_6/layout/layout.oa new file mode 100644 index 000000000..27350f375 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_8/layout/layout.oa new file mode 100644 index 000000000..125274101 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_l/layout/layout.oa new file mode 100644 index 000000000..720ea97aa Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__buf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__decap_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__decap_1/layout/layout.oa new file mode 100644 index 000000000..d9cf70862 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__decap_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__decap_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__decap_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__decap_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__decap_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__decap_l/layout/layout.oa new file mode 100644 index 000000000..23d315ab1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__decap_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__decap_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__decap_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__decap_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dff_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dff_1/layout/layout.oa new file mode 100644 index 000000000..bc9640eac Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dff_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dff_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dff_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dff_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dff_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dff_l/layout/layout.oa new file mode 100644 index 000000000..671658b55 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dff_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dff_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dff_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dff_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffnr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffnr_1/layout/layout.oa new file mode 100644 index 000000000..9325020b0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffnr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffnr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffnr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffnr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffnr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffnr_l/layout/layout.oa new file mode 100644 index 000000000..b215d9723 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffnr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffnr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffnr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffnr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffr_1/layout/layout.oa new file mode 100644 index 000000000..db91f51bc Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffr_l/layout/layout.oa new file mode 100644 index 000000000..9bb26ffe9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffs_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffs_1/layout/layout.oa new file mode 100644 index 000000000..384c41bbf Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffs_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffs_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffs_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffs_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffs_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffs_l/layout/layout.oa new file mode 100644 index 000000000..6a6d712a7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffs_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffs_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffs_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffs_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffsr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffsr_1/layout/layout.oa new file mode 100644 index 000000000..5e0b05952 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffsr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffsr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffsr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffsr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffsr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffsr_l/layout/layout.oa new file mode 100644 index 000000000..3b6be91b1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffsr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffsr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffsr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dffsr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dlat_1/layout/layout.oa new file mode 100644 index 000000000..cb344f509 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dlat_l/layout/layout.oa new file mode 100644 index 000000000..04a32aeb3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__dlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_1/layout/layout.oa new file mode 100644 index 000000000..f47da001e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_16/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_16/layout/layout.oa new file mode 100644 index 000000000..227bef56d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_16/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_16/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_16/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_16/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_2/layout/layout.oa new file mode 100644 index 000000000..0fce454bc Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_32/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_32/layout/layout.oa new file mode 100644 index 000000000..a0c316a5e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_32/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_32/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_32/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_32/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_4/layout/layout.oa new file mode 100644 index 000000000..808f61824 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_8/layout/layout.oa new file mode 100644 index 000000000..9a5c5bb42 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__fill_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_1/layout/layout.oa new file mode 100644 index 000000000..37e399d2a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_10/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_10/layout/layout.oa new file mode 100644 index 000000000..412325f58 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_10/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_10/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_10/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_10/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_2/layout/layout.oa new file mode 100644 index 000000000..bbc4df492 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_3/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_3/layout/layout.oa new file mode 100644 index 000000000..0030aebbb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_3/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_3/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_3/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_3/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_4/layout/layout.oa new file mode 100644 index 000000000..fcc2d9436 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_6/layout/layout.oa new file mode 100644 index 000000000..e0f9d04ad Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_8/layout/layout.oa new file mode 100644 index 000000000..8c27739fd Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_l/layout/layout.oa new file mode 100644 index 000000000..249b819e0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__inv_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__mux2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__mux2_1/layout/layout.oa new file mode 100644 index 000000000..fc6d05ad3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__mux2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__mux2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__mux2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__mux2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nand2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nand2_1/layout/layout.oa new file mode 100644 index 000000000..acace96f2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nand2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nand2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nand2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nand2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nand2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nand2_l/layout/layout.oa new file mode 100644 index 000000000..4f87e9ea5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nand2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nand2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nand2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nand2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ncgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ncgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..cf4ea5736 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ncgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ncgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ncgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ncgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ncgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ncgate_1/layout/layout.oa new file mode 100644 index 000000000..3ee530b4d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ncgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ncgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ncgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ncgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ndlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ndlat_1/layout/layout.oa new file mode 100644 index 000000000..5bc63532a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ndlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ndlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ndlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ndlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ndlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ndlat_l/layout/layout.oa new file mode 100644 index 000000000..4ed899f9f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ndlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ndlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ndlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__ndlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nor2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nor2_1/layout/layout.oa new file mode 100644 index 000000000..58e8f182a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nor2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nor2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nor2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nor2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nor2_l/layout/layout.oa new file mode 100644 index 000000000..6f3d3227f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__nor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__oai21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__oai21_l/layout/layout.oa new file mode 100644 index 000000000..1e047195a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__oai21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__oai21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__oai21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__oai21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__oai22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__oai22_l/layout/layout.oa new file mode 100644 index 000000000..81afab8ee Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__oai22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__oai22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__oai22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__oai22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_1/layout/layout.oa new file mode 100644 index 000000000..029164a3b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_2/layout/layout.oa new file mode 100644 index 000000000..375176295 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_4/layout/layout.oa new file mode 100644 index 000000000..e1b072a02 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_8/layout/layout.oa new file mode 100644 index 000000000..07e120e4c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_l/layout/layout.oa new file mode 100644 index 000000000..e806fd4f5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__or2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__pcgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__pcgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..2bdcbf47f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__pcgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__pcgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__pcgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__pcgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__pcgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__pcgate_1/layout/layout.oa new file mode 100644 index 000000000..032e47ba5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__pcgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__pcgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__pcgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__pcgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tbufi_1/layout/layout.oa new file mode 100644 index 000000000..dad044924 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tbufi_l/layout/layout.oa new file mode 100644 index 000000000..fe686b729 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tiehi/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tiehi/layout/layout.oa new file mode 100644 index 000000000..1558983fe Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tiehi/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tiehi/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tiehi/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tiehi/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tielo/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tielo/layout/layout.oa new file mode 100644 index 000000000..70c46f379 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tielo/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tielo/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tielo/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tielo/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tnbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tnbufi_1/layout/layout.oa new file mode 100644 index 000000000..61722e38c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tnbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tnbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tnbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tnbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tnbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tnbufi_l/layout/layout.oa new file mode 100644 index 000000000..292fe2746 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tnbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tnbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tnbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__tnbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__xnor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__xnor2_l/layout/layout.oa new file mode 100644 index 000000000..dd951d0a8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__xnor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__xnor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__xnor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__xnor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__xor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__xor2_l/layout/layout.oa new file mode 100644 index 000000000..6b7eb6d37 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__xor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__xor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__xor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t12/sky130_osu_sc_12T_ms__xor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/.oalib b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/.oalib new file mode 100644 index 000000000..21ffef899 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/.oalib @@ -0,0 +1,6 @@ + + + + + diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/cdsinfo.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/cdsinfo.tag new file mode 100644 index 000000000..b75aa95c9 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/cdsinfo.tag @@ -0,0 +1,41 @@ +# +# This is a cdsinfo.tag file. +# +# See the "Cadence Application Infrastructure Reference Manual" for +# details on the format of this file, its semantics, and its use. +# +# The `#' character denotes a comment. Removing the leading `#' +# character from any of the entries below will activate them. +# +# CDSLIBRARY entry - add this entry if the directory containing +# this cdsinfo.tag file is the root of a Cadence library. +# CDSLIBRARY +# +# CDSLIBCHECK - set this entry to require that libraries have +# a cdsinfo.tag file with a CDSLIBRARY entry. Legal values are +# ON and OFF. By default (OFF), directories named in a cds.lib file +# do not have to have a cdsinfo.tag file with a CDSLIBRARY entry. +# CDSLIBCHECK ON +# +# DMTYPE - set this entry to define the DM system for Cadence's +# Generic DM facility. Values will be shifted to lower case. +# DMTYPE none +# DMTYPE crcs +# DMTYPE tdm +# DMTYPE sync +# +# NAMESPACE - set this entry to define the library namespace according +# to the type of machine on which the data is stored. Legal values are +# `LibraryNT' and +# `LibraryUnix'. +# NAMESPACE LibraryUnix +# +# Other entries may be added for use by specific applications as +# name-value pairs. Application documentation will describe the +# use and behaviour of these entries when appropriate. +# +# Current Settings: +# +CDSLIBRARY +DMTYPE none +NAMESPACE LibraryUnix diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/data.dm b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/data.dm new file mode 100644 index 000000000..96bd06f22 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/data.dm differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addf_1/layout/layout.oa new file mode 100644 index 000000000..0780e81ea Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addf_l/layout/layout.oa new file mode 100644 index 000000000..b5cae7579 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addh_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addh_1/layout/layout.oa new file mode 100644 index 000000000..f869253e7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addh_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addh_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addh_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addh_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addh_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addh_l/layout/layout.oa new file mode 100644 index 000000000..dbd8d1e68 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addh_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addh_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addh_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__addh_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_1/layout/layout.oa new file mode 100644 index 000000000..d0b776a93 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_2/layout/layout.oa new file mode 100644 index 000000000..3d5ccddaa Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_4/layout/layout.oa new file mode 100644 index 000000000..c029bcf35 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_6/layout/layout.oa new file mode 100644 index 000000000..c09e255ad Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_8/layout/layout.oa new file mode 100644 index 000000000..3437f9f25 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_l/layout/layout.oa new file mode 100644 index 000000000..c5236f660 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__and2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ant/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ant/layout/layout.oa new file mode 100644 index 000000000..340acbd7a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ant/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ant/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ant/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ant/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__antfill/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__antfill/layout/layout.oa new file mode 100644 index 000000000..b0d43d235 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__antfill/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__antfill/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__antfill/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__antfill/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__aoi21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__aoi21_l/layout/layout.oa new file mode 100644 index 000000000..dfbdc86ec Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__aoi21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__aoi21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__aoi21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__aoi21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__aoi22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__aoi22_l/layout/layout.oa new file mode 100644 index 000000000..19d9d20d8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__aoi22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__aoi22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__aoi22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__aoi22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_1/layout/layout.oa new file mode 100644 index 000000000..5d1a009c1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_2/layout/layout.oa new file mode 100644 index 000000000..1d80e0df6 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_4/layout/layout.oa new file mode 100644 index 000000000..6e7922e62 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_6/layout/layout.oa new file mode 100644 index 000000000..0f0313871 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_8/layout/layout.oa new file mode 100644 index 000000000..3bee40e81 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_l/layout/layout.oa new file mode 100644 index 000000000..b3127b62b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__buf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__decap_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__decap_1/layout/layout.oa new file mode 100644 index 000000000..747ab5e92 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__decap_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__decap_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__decap_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__decap_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__decap_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__decap_l/layout/layout.oa new file mode 100644 index 000000000..4ebc2b0ad Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__decap_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__decap_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__decap_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__decap_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dff_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dff_1/layout/layout.oa new file mode 100644 index 000000000..deafb1b25 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dff_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dff_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dff_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dff_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dff_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dff_l/layout/layout.oa new file mode 100644 index 000000000..02a161702 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dff_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dff_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dff_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dff_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffr_1/layout/layout.oa new file mode 100644 index 000000000..04851ca67 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffr_l/layout/layout.oa new file mode 100644 index 000000000..94a6aeef4 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffs_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffs_1/layout/layout.oa new file mode 100644 index 000000000..f8080372d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffs_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffs_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffs_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffs_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffs_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffs_l/layout/layout.oa new file mode 100644 index 000000000..da52f5471 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffs_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffs_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffs_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffs_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffsr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffsr_1/layout/layout.oa new file mode 100644 index 000000000..b01b47f37 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffsr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffsr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffsr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffsr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffsr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffsr_l/layout/layout.oa new file mode 100644 index 000000000..d21eaf06e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffsr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffsr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffsr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dffsr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dlat_1/layout/layout.oa new file mode 100644 index 000000000..dba6222cb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dlat_l/layout/layout.oa new file mode 100644 index 000000000..4d42431da Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__dlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_1/layout/layout.oa new file mode 100644 index 000000000..383c69b32 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_16/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_16/layout/layout.oa new file mode 100644 index 000000000..d00c8f686 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_16/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_16/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_16/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_16/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_2/layout/layout.oa new file mode 100644 index 000000000..493654dd4 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_32/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_32/layout/layout.oa new file mode 100644 index 000000000..99bbc1f7a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_32/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_32/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_32/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_32/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_4/layout/layout.oa new file mode 100644 index 000000000..41d6004ad Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_8/layout/layout.oa new file mode 100644 index 000000000..fa16b0b6e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__fill_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_1/layout/layout.oa new file mode 100644 index 000000000..1d9f7ba81 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_10/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_10/layout/layout.oa new file mode 100644 index 000000000..575d074da Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_10/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_10/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_10/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_10/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_2/layout/layout.oa new file mode 100644 index 000000000..0875ff7c2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_3/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_3/layout/layout.oa new file mode 100644 index 000000000..5bf48829d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_3/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_3/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_3/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_3/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_4/layout/layout.oa new file mode 100644 index 000000000..44f63be7e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_6/layout/layout.oa new file mode 100644 index 000000000..e542beecf Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_8/layout/layout.oa new file mode 100644 index 000000000..485bcd8d2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_l/layout/layout.oa new file mode 100644 index 000000000..911f80532 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__inv_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__mux2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__mux2_1/layout/layout.oa new file mode 100644 index 000000000..05f6c14ac Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__mux2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__mux2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__mux2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__mux2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nand2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nand2_1/layout/layout.oa new file mode 100644 index 000000000..db373b933 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nand2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nand2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nand2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nand2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nand2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nand2_l/layout/layout.oa new file mode 100644 index 000000000..5f3b7aea7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nand2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nand2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nand2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nand2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ncgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ncgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..b3d3eb1f1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ncgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ncgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ncgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ncgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ncgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ncgate_1/layout/layout.oa new file mode 100644 index 000000000..45f2f6dd2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ncgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ncgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ncgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ncgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ndlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ndlat_1/layout/layout.oa new file mode 100644 index 000000000..145bf189d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ndlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ndlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ndlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ndlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ndlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ndlat_l/layout/layout.oa new file mode 100644 index 000000000..a96e980e6 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ndlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ndlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ndlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__ndlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nor2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nor2_1/layout/layout.oa new file mode 100644 index 000000000..58574c6da Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nor2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nor2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nor2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nor2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nor2_l/layout/layout.oa new file mode 100644 index 000000000..bf8b88981 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__nor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__oai21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__oai21_l/layout/layout.oa new file mode 100644 index 000000000..bdfebc2bc Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__oai21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__oai21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__oai21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__oai21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__oai22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__oai22_l/layout/layout.oa new file mode 100644 index 000000000..f7d02808f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__oai22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__oai22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__oai22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__oai22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_1/layout/layout.oa new file mode 100644 index 000000000..08c12055d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_2/layout/layout.oa new file mode 100644 index 000000000..525e70417 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_4/layout/layout.oa new file mode 100644 index 000000000..4012e38f1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_8/layout/layout.oa new file mode 100644 index 000000000..71398d4ba Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_l/layout/layout.oa new file mode 100644 index 000000000..bb48c2200 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__or2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__pcgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__pcgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..db8f5cbf8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__pcgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__pcgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__pcgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__pcgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__pcgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__pcgate_1/layout/layout.oa new file mode 100644 index 000000000..df5b68840 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__pcgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__pcgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__pcgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__pcgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tbufi_1/layout/layout.oa new file mode 100644 index 000000000..cfc5e6754 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tbufi_l/layout/layout.oa new file mode 100644 index 000000000..6f10ec1d4 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tiehi/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tiehi/layout/layout.oa new file mode 100644 index 000000000..8bada7897 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tiehi/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tiehi/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tiehi/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tiehi/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tielo/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tielo/layout/layout.oa new file mode 100644 index 000000000..ed9655a18 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tielo/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tielo/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tielo/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tielo/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tnbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tnbufi_1/layout/layout.oa new file mode 100644 index 000000000..263e1d698 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tnbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tnbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tnbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tnbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tnbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tnbufi_l/layout/layout.oa new file mode 100644 index 000000000..7a9aa5839 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tnbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tnbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tnbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__tnbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__xnor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__xnor2_l/layout/layout.oa new file mode 100644 index 000000000..447090cf2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__xnor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__xnor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__xnor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__xnor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__xor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__xor2_l/layout/layout.oa new file mode 100644 index 000000000..d8eff34f8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__xor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__xor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__xor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_hs__xor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addf_1/layout/layout.oa new file mode 100644 index 000000000..2e2344e81 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addf_l/layout/layout.oa new file mode 100644 index 000000000..0dbb044cf Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addh_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addh_1/layout/layout.oa new file mode 100644 index 000000000..286b813fe Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addh_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addh_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addh_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addh_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addh_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addh_l/layout/layout.oa new file mode 100644 index 000000000..8c15dee49 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addh_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addh_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addh_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__addh_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_1/layout/layout.oa new file mode 100644 index 000000000..63f68c6b5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_2/layout/layout.oa new file mode 100644 index 000000000..a2ba09679 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_4/layout/layout.oa new file mode 100644 index 000000000..5c778e957 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_6/layout/layout.oa new file mode 100644 index 000000000..050d78c11 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_8/layout/layout.oa new file mode 100644 index 000000000..69e7451c8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_l/layout/layout.oa new file mode 100644 index 000000000..2ab1fea3b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__and2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ant/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ant/layout/layout.oa new file mode 100644 index 000000000..b81ba6a9f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ant/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ant/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ant/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ant/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__antfill/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__antfill/layout/layout.oa new file mode 100644 index 000000000..8aa06bb38 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__antfill/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__antfill/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__antfill/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__antfill/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__aoi21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__aoi21_l/layout/layout.oa new file mode 100644 index 000000000..b141cf92a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__aoi21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__aoi21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__aoi21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__aoi21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__aoi22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__aoi22_l/layout/layout.oa new file mode 100644 index 000000000..f6afd7039 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__aoi22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__aoi22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__aoi22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__aoi22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_1/layout/layout.oa new file mode 100644 index 000000000..b68a9001d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_2/layout/layout.oa new file mode 100644 index 000000000..4a88eda5f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_4/layout/layout.oa new file mode 100644 index 000000000..440e6cedc Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_6/layout/layout.oa new file mode 100644 index 000000000..05cc3f768 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_8/layout/layout.oa new file mode 100644 index 000000000..3ba072280 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_l/layout/layout.oa new file mode 100644 index 000000000..62683f773 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__buf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__decap_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__decap_1/layout/layout.oa new file mode 100644 index 000000000..e5dae88b4 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__decap_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__decap_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__decap_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__decap_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__decap_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__decap_l/layout/layout.oa new file mode 100644 index 000000000..c211c9e7f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__decap_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__decap_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__decap_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__decap_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dff_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dff_1/layout/layout.oa new file mode 100644 index 000000000..e52711585 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dff_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dff_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dff_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dff_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dff_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dff_l/layout/layout.oa new file mode 100644 index 000000000..a8c7de08c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dff_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dff_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dff_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dff_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffr_1/layout/layout.oa new file mode 100644 index 000000000..8cecbe30e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffr_l/layout/layout.oa new file mode 100644 index 000000000..991e1aed4 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffs_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffs_1/layout/layout.oa new file mode 100644 index 000000000..7e157aa87 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffs_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffs_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffs_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffs_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffs_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffs_l/layout/layout.oa new file mode 100644 index 000000000..5e0d82da5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffs_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffs_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffs_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffs_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffsr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffsr_1/layout/layout.oa new file mode 100644 index 000000000..9fec9ec22 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffsr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffsr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffsr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffsr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffsr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffsr_l/layout/layout.oa new file mode 100644 index 000000000..e1c762597 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffsr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffsr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffsr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dffsr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dlat_1/layout/layout.oa new file mode 100644 index 000000000..cf02dc99d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dlat_l/layout/layout.oa new file mode 100644 index 000000000..431fe959a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__dlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_1/layout/layout.oa new file mode 100644 index 000000000..226996edf Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_16/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_16/layout/layout.oa new file mode 100644 index 000000000..3a86b18b3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_16/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_16/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_16/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_16/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_2/layout/layout.oa new file mode 100644 index 000000000..fbc9be39d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_32/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_32/layout/layout.oa new file mode 100644 index 000000000..30b625834 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_32/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_32/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_32/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_32/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_4/layout/layout.oa new file mode 100644 index 000000000..d6a02f37b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_8/layout/layout.oa new file mode 100644 index 000000000..f2731202a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__fill_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_1/layout/layout.oa new file mode 100644 index 000000000..06dedc19e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_10/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_10/layout/layout.oa new file mode 100644 index 000000000..77dde5277 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_10/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_10/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_10/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_10/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_2/layout/layout.oa new file mode 100644 index 000000000..d306bdc2f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_3/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_3/layout/layout.oa new file mode 100644 index 000000000..611f32e17 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_3/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_3/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_3/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_3/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_4/layout/layout.oa new file mode 100644 index 000000000..41a048c82 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_6/layout/layout.oa new file mode 100644 index 000000000..710cf0c12 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_8/layout/layout.oa new file mode 100644 index 000000000..d8797b7bf Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_l/layout/layout.oa new file mode 100644 index 000000000..ca8592715 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__inv_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__mux2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__mux2_1/layout/layout.oa new file mode 100644 index 000000000..9a28f590d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__mux2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__mux2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__mux2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__mux2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nand2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nand2_1/layout/layout.oa new file mode 100644 index 000000000..3399ddafa Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nand2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nand2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nand2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nand2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nand2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nand2_l/layout/layout.oa new file mode 100644 index 000000000..e96f9664a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nand2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nand2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nand2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nand2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ncgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ncgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..2279b4064 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ncgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ncgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ncgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ncgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ncgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ncgate_1/layout/layout.oa new file mode 100644 index 000000000..de6c304d2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ncgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ncgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ncgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ncgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ndlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ndlat_1/layout/layout.oa new file mode 100644 index 000000000..9e70e34eb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ndlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ndlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ndlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ndlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ndlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ndlat_l/layout/layout.oa new file mode 100644 index 000000000..9cb6c472c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ndlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ndlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ndlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__ndlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nor2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nor2_1/layout/layout.oa new file mode 100644 index 000000000..2369984e3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nor2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nor2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nor2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nor2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nor2_l/layout/layout.oa new file mode 100644 index 000000000..51b90e5df Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__nor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__oai21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__oai21_l/layout/layout.oa new file mode 100644 index 000000000..e125435ad Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__oai21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__oai21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__oai21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__oai21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__oai22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__oai22_l/layout/layout.oa new file mode 100644 index 000000000..482feacab Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__oai22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__oai22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__oai22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__oai22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_1/layout/layout.oa new file mode 100644 index 000000000..df83a5f0c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_2/layout/layout.oa new file mode 100644 index 000000000..52943115e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_4/layout/layout.oa new file mode 100644 index 000000000..cf0123cef Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_8/layout/layout.oa new file mode 100644 index 000000000..4971e8db9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_l/layout/layout.oa new file mode 100644 index 000000000..bcb661a58 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__or2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__pcgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__pcgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..527640236 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__pcgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__pcgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__pcgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__pcgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__pcgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__pcgate_1/layout/layout.oa new file mode 100644 index 000000000..6ff7d3fe5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__pcgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__pcgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__pcgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__pcgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tbufi_1/layout/layout.oa new file mode 100644 index 000000000..c59049cea Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tbufi_l/layout/layout.oa new file mode 100644 index 000000000..7ff32064e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tiehi/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tiehi/layout/layout.oa new file mode 100644 index 000000000..c202e2a39 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tiehi/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tiehi/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tiehi/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tiehi/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tielo/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tielo/layout/layout.oa new file mode 100644 index 000000000..ff4a8afd0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tielo/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tielo/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tielo/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tielo/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tnbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tnbufi_1/layout/layout.oa new file mode 100644 index 000000000..8bccfbcd8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tnbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tnbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tnbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tnbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tnbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tnbufi_l/layout/layout.oa new file mode 100644 index 000000000..f2bc4b89c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tnbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tnbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tnbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__tnbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__xnor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__xnor2_l/layout/layout.oa new file mode 100644 index 000000000..527fa1f58 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__xnor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__xnor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__xnor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__xnor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__xor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__xor2_l/layout/layout.oa new file mode 100644 index 000000000..c948f71fb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__xor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__xor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__xor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ls__xor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addf_1/layout/layout.oa new file mode 100644 index 000000000..d0d07d435 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addf_l/layout/layout.oa new file mode 100644 index 000000000..b7fc14796 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addh_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addh_1/layout/layout.oa new file mode 100644 index 000000000..1908421ed Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addh_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addh_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addh_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addh_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addh_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addh_l/layout/layout.oa new file mode 100644 index 000000000..f28bc03f9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addh_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addh_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addh_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__addh_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_1/layout/layout.oa new file mode 100644 index 000000000..c4224a74a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_2/layout/layout.oa new file mode 100644 index 000000000..dade24e01 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_4/layout/layout.oa new file mode 100644 index 000000000..83ced69aa Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_6/layout/layout.oa new file mode 100644 index 000000000..1e6b269d0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_8/layout/layout.oa new file mode 100644 index 000000000..48f8708f1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_l/layout/layout.oa new file mode 100644 index 000000000..c5cf14f7b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__and2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ant/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ant/layout/layout.oa new file mode 100644 index 000000000..7f8718446 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ant/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ant/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ant/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ant/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__antfill/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__antfill/layout/layout.oa new file mode 100644 index 000000000..ea86d3379 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__antfill/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__antfill/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__antfill/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__antfill/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__aoi21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__aoi21_l/layout/layout.oa new file mode 100644 index 000000000..2a752ffc4 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__aoi21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__aoi21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__aoi21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__aoi21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__aoi22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__aoi22_l/layout/layout.oa new file mode 100644 index 000000000..0298bbea7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__aoi22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__aoi22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__aoi22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__aoi22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_1/layout/layout.oa new file mode 100644 index 000000000..107d18c09 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_2/layout/layout.oa new file mode 100644 index 000000000..76ff9bd40 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_4/layout/layout.oa new file mode 100644 index 000000000..2f6685d8f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_6/layout/layout.oa new file mode 100644 index 000000000..da7657d2d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_8/layout/layout.oa new file mode 100644 index 000000000..5fc26b51c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_l/layout/layout.oa new file mode 100644 index 000000000..271b08fba Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__buf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__decap_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__decap_1/layout/layout.oa new file mode 100644 index 000000000..33eedb37b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__decap_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__decap_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__decap_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__decap_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__decap_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__decap_l/layout/layout.oa new file mode 100644 index 000000000..fd6a6c28f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__decap_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__decap_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__decap_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__decap_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dff_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dff_1/layout/layout.oa new file mode 100644 index 000000000..d48d15423 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dff_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dff_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dff_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dff_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dff_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dff_l/layout/layout.oa new file mode 100644 index 000000000..e60a7d238 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dff_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dff_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dff_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dff_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffr_1/layout/layout.oa new file mode 100644 index 000000000..921fada48 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffr_l/layout/layout.oa new file mode 100644 index 000000000..901014cf9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffs_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffs_1/layout/layout.oa new file mode 100644 index 000000000..f798a0213 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffs_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffs_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffs_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffs_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffs_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffs_l/layout/layout.oa new file mode 100644 index 000000000..e30014ee9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffs_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffs_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffs_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffs_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffsr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffsr_1/layout/layout.oa new file mode 100644 index 000000000..8a9d27a82 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffsr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffsr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffsr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffsr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffsr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffsr_l/layout/layout.oa new file mode 100644 index 000000000..0f86e83d5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffsr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffsr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffsr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dffsr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dlat_1/layout/layout.oa new file mode 100644 index 000000000..305257f85 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dlat_l/layout/layout.oa new file mode 100644 index 000000000..fc3762a2e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__dlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_1/layout/layout.oa new file mode 100644 index 000000000..238e64d6b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_16/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_16/layout/layout.oa new file mode 100644 index 000000000..275bde80f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_16/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_16/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_16/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_16/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_2/layout/layout.oa new file mode 100644 index 000000000..8b3906cbd Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_32/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_32/layout/layout.oa new file mode 100644 index 000000000..3793d5d48 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_32/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_32/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_32/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_32/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_4/layout/layout.oa new file mode 100644 index 000000000..c63b4e5a5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_8/layout/layout.oa new file mode 100644 index 000000000..0dece5033 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__fill_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_1/layout/layout.oa new file mode 100644 index 000000000..22c4765e0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_10/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_10/layout/layout.oa new file mode 100644 index 000000000..605771ce8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_10/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_10/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_10/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_10/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_2/layout/layout.oa new file mode 100644 index 000000000..44adc35bb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_3/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_3/layout/layout.oa new file mode 100644 index 000000000..87ad0e8a5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_3/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_3/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_3/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_3/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_4/layout/layout.oa new file mode 100644 index 000000000..8a26bfca4 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_6/layout/layout.oa new file mode 100644 index 000000000..864a2aebf Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_8/layout/layout.oa new file mode 100644 index 000000000..1925e2d12 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_l/layout/layout.oa new file mode 100644 index 000000000..514b77c9f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__inv_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__mux2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__mux2_1/layout/layout.oa new file mode 100644 index 000000000..bbc395ef7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__mux2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__mux2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__mux2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__mux2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nand2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nand2_1/layout/layout.oa new file mode 100644 index 000000000..30d7b91c2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nand2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nand2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nand2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nand2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nand2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nand2_l/layout/layout.oa new file mode 100644 index 000000000..94b135da9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nand2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nand2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nand2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nand2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ncgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ncgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..de17e0c52 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ncgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ncgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ncgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ncgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ncgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ncgate_1/layout/layout.oa new file mode 100644 index 000000000..a6285f655 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ncgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ncgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ncgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ncgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ndlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ndlat_1/layout/layout.oa new file mode 100644 index 000000000..da5c90908 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ndlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ndlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ndlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ndlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ndlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ndlat_l/layout/layout.oa new file mode 100644 index 000000000..88767b79f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ndlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ndlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ndlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__ndlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nor2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nor2_1/layout/layout.oa new file mode 100644 index 000000000..4929e1d77 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nor2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nor2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nor2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nor2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nor2_l/layout/layout.oa new file mode 100644 index 000000000..94d6ce9ed Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__nor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__oai21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__oai21_l/layout/layout.oa new file mode 100644 index 000000000..61cc7f1b5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__oai21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__oai21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__oai21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__oai21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__oai22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__oai22_l/layout/layout.oa new file mode 100644 index 000000000..c24ce75e2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__oai22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__oai22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__oai22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__oai22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_1/layout/layout.oa new file mode 100644 index 000000000..43d535478 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_2/layout/layout.oa new file mode 100644 index 000000000..5c624d723 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_4/layout/layout.oa new file mode 100644 index 000000000..d2c05a15c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_8/layout/layout.oa new file mode 100644 index 000000000..414406dfb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_l/layout/layout.oa new file mode 100644 index 000000000..a314891b7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__or2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__pcgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__pcgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..84616bf5a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__pcgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__pcgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__pcgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__pcgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__pcgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__pcgate_1/layout/layout.oa new file mode 100644 index 000000000..a50ac6901 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__pcgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__pcgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__pcgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__pcgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tbufi_1/layout/layout.oa new file mode 100644 index 000000000..58b4f0b1c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tbufi_l/layout/layout.oa new file mode 100644 index 000000000..3e0df3efb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tiehi/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tiehi/layout/layout.oa new file mode 100644 index 000000000..d4c2a509f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tiehi/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tiehi/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tiehi/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tiehi/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tielo/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tielo/layout/layout.oa new file mode 100644 index 000000000..be20bfc69 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tielo/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tielo/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tielo/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tielo/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tnbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tnbufi_1/layout/layout.oa new file mode 100644 index 000000000..ae9cdaa7c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tnbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tnbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tnbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tnbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tnbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tnbufi_l/layout/layout.oa new file mode 100644 index 000000000..fd0573dce Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tnbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tnbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tnbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__tnbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__xnor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__xnor2_l/layout/layout.oa new file mode 100644 index 000000000..1e0f0d634 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__xnor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__xnor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__xnor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__xnor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__xor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__xor2_l/layout/layout.oa new file mode 100644 index 000000000..738124595 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__xor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__xor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__xor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t15/sky130_osu_sc_15T_ms__xor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/.oalib b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/.oalib new file mode 100644 index 000000000..21ffef899 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/.oalib @@ -0,0 +1,6 @@ + + + + + diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/cdsinfo.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/cdsinfo.tag new file mode 100644 index 000000000..b75aa95c9 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/cdsinfo.tag @@ -0,0 +1,41 @@ +# +# This is a cdsinfo.tag file. +# +# See the "Cadence Application Infrastructure Reference Manual" for +# details on the format of this file, its semantics, and its use. +# +# The `#' character denotes a comment. Removing the leading `#' +# character from any of the entries below will activate them. +# +# CDSLIBRARY entry - add this entry if the directory containing +# this cdsinfo.tag file is the root of a Cadence library. +# CDSLIBRARY +# +# CDSLIBCHECK - set this entry to require that libraries have +# a cdsinfo.tag file with a CDSLIBRARY entry. Legal values are +# ON and OFF. By default (OFF), directories named in a cds.lib file +# do not have to have a cdsinfo.tag file with a CDSLIBRARY entry. +# CDSLIBCHECK ON +# +# DMTYPE - set this entry to define the DM system for Cadence's +# Generic DM facility. Values will be shifted to lower case. +# DMTYPE none +# DMTYPE crcs +# DMTYPE tdm +# DMTYPE sync +# +# NAMESPACE - set this entry to define the library namespace according +# to the type of machine on which the data is stored. Legal values are +# `LibraryNT' and +# `LibraryUnix'. +# NAMESPACE LibraryUnix +# +# Other entries may be added for use by specific applications as +# name-value pairs. Application documentation will describe the +# use and behaviour of these entries when appropriate. +# +# Current Settings: +# +CDSLIBRARY +DMTYPE none +NAMESPACE LibraryUnix diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/data.dm b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/data.dm new file mode 100644 index 000000000..d8123179a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/data.dm differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addf_1/layout/layout.oa new file mode 100644 index 000000000..2a8a43e74 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addf_l/layout/layout.oa new file mode 100644 index 000000000..ffde888df Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addh_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addh_1/layout/layout.oa new file mode 100644 index 000000000..16e107917 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addh_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addh_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addh_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addh_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addh_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addh_l/layout/layout.oa new file mode 100644 index 000000000..9184fd8c1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addh_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addh_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addh_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__addh_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_1/layout/layout.oa new file mode 100644 index 000000000..6785b0dde Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_2/layout/layout.oa new file mode 100644 index 000000000..ed5a59e4e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_4/layout/layout.oa new file mode 100644 index 000000000..4af6a5b70 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_6/layout/layout.oa new file mode 100644 index 000000000..dbd951560 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_8/layout/layout.oa new file mode 100644 index 000000000..5a90aeab1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_l/layout/layout.oa new file mode 100644 index 000000000..b01fda710 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__and2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ant/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ant/layout/layout.oa new file mode 100644 index 000000000..6163712a7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ant/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ant/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ant/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ant/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__antfill/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__antfill/layout/layout.oa new file mode 100644 index 000000000..ed8d5594a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__antfill/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__antfill/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__antfill/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__antfill/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__aoi21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__aoi21_l/layout/layout.oa new file mode 100644 index 000000000..d2e0cf0ac Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__aoi21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__aoi21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__aoi21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__aoi21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__aoi22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__aoi22_l/layout/layout.oa new file mode 100644 index 000000000..c0432b33e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__aoi22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__aoi22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__aoi22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__aoi22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_1/layout/layout.oa new file mode 100644 index 000000000..d35e2e461 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_2/layout/layout.oa new file mode 100644 index 000000000..97ab09861 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_4/layout/layout.oa new file mode 100644 index 000000000..34ebaea48 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_6/layout/layout.oa new file mode 100644 index 000000000..804a593e8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_8/layout/layout.oa new file mode 100644 index 000000000..60a0f41a1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_l/layout/layout.oa new file mode 100644 index 000000000..9f1a2750f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__buf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__decap_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__decap_1/layout/layout.oa new file mode 100644 index 000000000..361d30edd Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__decap_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__decap_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__decap_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__decap_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__decap_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__decap_l/layout/layout.oa new file mode 100644 index 000000000..500a6ba57 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__decap_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__decap_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__decap_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__decap_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dff_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dff_1/layout/layout.oa new file mode 100644 index 000000000..f2348bf83 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dff_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dff_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dff_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dff_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dff_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dff_l/layout/layout.oa new file mode 100644 index 000000000..1bc6ec89e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dff_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dff_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dff_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dff_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffr_1/layout/layout.oa new file mode 100644 index 000000000..458a3e2c5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffr_l/layout/layout.oa new file mode 100644 index 000000000..07a03f317 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffs_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffs_1/layout/layout.oa new file mode 100644 index 000000000..5077c48c3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffs_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffs_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffs_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffs_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffs_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffs_l/layout/layout.oa new file mode 100644 index 000000000..b0d041c1d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffs_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffs_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffs_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffs_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffsr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffsr_1/layout/layout.oa new file mode 100644 index 000000000..67ac283bd Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffsr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffsr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffsr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffsr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffsr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffsr_l/layout/layout.oa new file mode 100644 index 000000000..60c4f856f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffsr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffsr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffsr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dffsr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dlat_1/layout/layout.oa new file mode 100644 index 000000000..7759f3e25 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dlat_l/layout/layout.oa new file mode 100644 index 000000000..458561899 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__dlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_1/layout/layout.oa new file mode 100644 index 000000000..8a3d90ffb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_16/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_16/layout/layout.oa new file mode 100644 index 000000000..cdb91b1fd Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_16/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_16/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_16/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_16/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_2/layout/layout.oa new file mode 100644 index 000000000..a79dca45b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_32/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_32/layout/layout.oa new file mode 100644 index 000000000..ddabf8d63 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_32/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_32/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_32/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_32/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_4/layout/layout.oa new file mode 100644 index 000000000..68e9f5acd Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_8/layout/layout.oa new file mode 100644 index 000000000..8bffa8ad2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__fill_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_1/layout/layout.oa new file mode 100644 index 000000000..237b76899 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_10/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_10/layout/layout.oa new file mode 100644 index 000000000..d65500462 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_10/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_10/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_10/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_10/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_2/layout/layout.oa new file mode 100644 index 000000000..6b5aa08b3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_3/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_3/layout/layout.oa new file mode 100644 index 000000000..f8ba44b87 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_3/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_3/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_3/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_3/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_4/layout/layout.oa new file mode 100644 index 000000000..2c576b750 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_6/layout/layout.oa new file mode 100644 index 000000000..0c7d9c68f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_8/layout/layout.oa new file mode 100644 index 000000000..b74e642d8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_l/layout/layout.oa new file mode 100644 index 000000000..c6d67cf88 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__inv_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__mux2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__mux2_1/layout/layout.oa new file mode 100644 index 000000000..ea641f423 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__mux2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__mux2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__mux2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__mux2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nand2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nand2_1/layout/layout.oa new file mode 100644 index 000000000..b54d77198 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nand2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nand2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nand2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nand2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nand2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nand2_l/layout/layout.oa new file mode 100644 index 000000000..0f6c99a11 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nand2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nand2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nand2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nand2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ncgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ncgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..45a34b981 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ncgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ncgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ncgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ncgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ncgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ncgate_1/layout/layout.oa new file mode 100644 index 000000000..0059cfdb5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ncgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ncgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ncgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ncgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ndlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ndlat_1/layout/layout.oa new file mode 100644 index 000000000..11d8ed265 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ndlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ndlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ndlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ndlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ndlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ndlat_l/layout/layout.oa new file mode 100644 index 000000000..b52c085a0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ndlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ndlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ndlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__ndlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nor2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nor2_1/layout/layout.oa new file mode 100644 index 000000000..2d37bf492 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nor2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nor2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nor2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nor2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nor2_l/layout/layout.oa new file mode 100644 index 000000000..74ddb0f30 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__nor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__oai21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__oai21_l/layout/layout.oa new file mode 100644 index 000000000..38bd0d3cd Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__oai21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__oai21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__oai21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__oai21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__oai22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__oai22_l/layout/layout.oa new file mode 100644 index 000000000..2a59657f8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__oai22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__oai22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__oai22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__oai22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_1/layout/layout.oa new file mode 100644 index 000000000..79be3433f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_2/layout/layout.oa new file mode 100644 index 000000000..0a759edc2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_4/layout/layout.oa new file mode 100644 index 000000000..9b226311f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_8/layout/layout.oa new file mode 100644 index 000000000..e47281cc7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_l/layout/layout.oa new file mode 100644 index 000000000..98cd8a8e3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__or2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__pcgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__pcgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..10524bd6f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__pcgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__pcgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__pcgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__pcgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__pcgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__pcgate_1/layout/layout.oa new file mode 100644 index 000000000..6e687bba3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__pcgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__pcgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__pcgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__pcgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tbufi_1/layout/layout.oa new file mode 100644 index 000000000..ca772b936 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tbufi_l/layout/layout.oa new file mode 100644 index 000000000..695eb9e1c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tiehi/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tiehi/layout/layout.oa new file mode 100644 index 000000000..bd483424f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tiehi/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tiehi/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tiehi/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tiehi/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tielo/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tielo/layout/layout.oa new file mode 100644 index 000000000..d44b50f0c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tielo/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tielo/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tielo/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tielo/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tnbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tnbufi_1/layout/layout.oa new file mode 100644 index 000000000..e1490de16 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tnbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tnbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tnbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tnbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tnbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tnbufi_l/layout/layout.oa new file mode 100644 index 000000000..bbaccb5ac Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tnbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tnbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tnbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__tnbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__xnor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__xnor2_l/layout/layout.oa new file mode 100644 index 000000000..1d9d2ac84 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__xnor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__xnor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__xnor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__xnor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__xor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__xor2_l/layout/layout.oa new file mode 100644 index 000000000..1377a21e9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__xor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__xor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__xor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_hs__xor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addf_1/layout/layout.oa new file mode 100644 index 000000000..211908c18 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addf_l/layout/layout.oa new file mode 100644 index 000000000..601100f8b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addh_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addh_1/layout/layout.oa new file mode 100644 index 000000000..28ebeb7b9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addh_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addh_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addh_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addh_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addh_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addh_l/layout/layout.oa new file mode 100644 index 000000000..7d58843bb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addh_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addh_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addh_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__addh_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_1/layout/layout.oa new file mode 100644 index 000000000..36554105e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_2/layout/layout.oa new file mode 100644 index 000000000..0bda7a9bb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_4/layout/layout.oa new file mode 100644 index 000000000..bb0e07c9b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_6/layout/layout.oa new file mode 100644 index 000000000..01bdf3ab3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_8/layout/layout.oa new file mode 100644 index 000000000..0500dac73 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_l/layout/layout.oa new file mode 100644 index 000000000..2603d5975 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__and2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ant/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ant/layout/layout.oa new file mode 100644 index 000000000..0f2d978f7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ant/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ant/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ant/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ant/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__antfill/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__antfill/layout/layout.oa new file mode 100644 index 000000000..e2f162e5e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__antfill/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__antfill/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__antfill/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__antfill/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__aoi21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__aoi21_l/layout/layout.oa new file mode 100644 index 000000000..866533356 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__aoi21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__aoi21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__aoi21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__aoi21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__aoi22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__aoi22_l/layout/layout.oa new file mode 100644 index 000000000..674ce52a9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__aoi22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__aoi22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__aoi22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__aoi22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_1/layout/layout.oa new file mode 100644 index 000000000..eb31985a6 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_2/layout/layout.oa new file mode 100644 index 000000000..a1148fcc0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_4/layout/layout.oa new file mode 100644 index 000000000..26c86bf33 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_6/layout/layout.oa new file mode 100644 index 000000000..b8a3dc5fe Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_8/layout/layout.oa new file mode 100644 index 000000000..690c9723b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_l/layout/layout.oa new file mode 100644 index 000000000..378ede7c9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__buf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__decap_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__decap_1/layout/layout.oa new file mode 100644 index 000000000..d49345a11 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__decap_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__decap_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__decap_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__decap_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__decap_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__decap_l/layout/layout.oa new file mode 100644 index 000000000..184dbde9c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__decap_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__decap_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__decap_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__decap_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dff_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dff_1/layout/layout.oa new file mode 100644 index 000000000..fc4a831a5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dff_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dff_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dff_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dff_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dff_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dff_l/layout/layout.oa new file mode 100644 index 000000000..0249e917e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dff_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dff_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dff_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dff_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffr_1/layout/layout.oa new file mode 100644 index 000000000..0b140500e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffr_l/layout/layout.oa new file mode 100644 index 000000000..0db25f852 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffs_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffs_1/layout/layout.oa new file mode 100644 index 000000000..75a9dde4b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffs_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffs_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffs_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffs_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffs_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffs_l/layout/layout.oa new file mode 100644 index 000000000..4efc5f64c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffs_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffs_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffs_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffs_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffsr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffsr_1/layout/layout.oa new file mode 100644 index 000000000..28edf8c3d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffsr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffsr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffsr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffsr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffsr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffsr_l/layout/layout.oa new file mode 100644 index 000000000..84c0dfddc Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffsr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffsr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffsr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dffsr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dlat_1/layout/layout.oa new file mode 100644 index 000000000..0bdacd16b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dlat_l/layout/layout.oa new file mode 100644 index 000000000..89a8b62ae Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__dlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_1/layout/layout.oa new file mode 100644 index 000000000..5aa11d3c0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_16/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_16/layout/layout.oa new file mode 100644 index 000000000..e3c2ddc08 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_16/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_16/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_16/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_16/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_2/layout/layout.oa new file mode 100644 index 000000000..02bef799a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_32/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_32/layout/layout.oa new file mode 100644 index 000000000..a728c4f9e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_32/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_32/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_32/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_32/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_4/layout/layout.oa new file mode 100644 index 000000000..425045a36 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_8/layout/layout.oa new file mode 100644 index 000000000..51ec26b73 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__fill_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_1/layout/layout.oa new file mode 100644 index 000000000..fd634eb2b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_10/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_10/layout/layout.oa new file mode 100644 index 000000000..9d9d3513c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_10/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_10/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_10/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_10/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_2/layout/layout.oa new file mode 100644 index 000000000..9dfae59f7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_3/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_3/layout/layout.oa new file mode 100644 index 000000000..b782b45e8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_3/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_3/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_3/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_3/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_4/layout/layout.oa new file mode 100644 index 000000000..3a84ec3d4 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_6/layout/layout.oa new file mode 100644 index 000000000..8cdec0aa8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_8/layout/layout.oa new file mode 100644 index 000000000..4a1bc2235 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_l/layout/layout.oa new file mode 100644 index 000000000..59631a07f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__inv_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__mux2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__mux2_1/layout/layout.oa new file mode 100644 index 000000000..f456f334a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__mux2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__mux2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__mux2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__mux2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nand2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nand2_1/layout/layout.oa new file mode 100644 index 000000000..f0d188da2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nand2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nand2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nand2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nand2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nand2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nand2_l/layout/layout.oa new file mode 100644 index 000000000..ceccecbc6 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nand2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nand2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nand2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nand2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ncgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ncgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..1cd0d3313 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ncgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ncgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ncgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ncgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ncgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ncgate_1/layout/layout.oa new file mode 100644 index 000000000..96b5b15a0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ncgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ncgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ncgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ncgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ndlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ndlat_1/layout/layout.oa new file mode 100644 index 000000000..a26794908 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ndlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ndlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ndlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ndlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ndlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ndlat_l/layout/layout.oa new file mode 100644 index 000000000..966aa65b7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ndlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ndlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ndlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__ndlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nor2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nor2_1/layout/layout.oa new file mode 100644 index 000000000..b6f754c3f Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nor2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nor2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nor2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nor2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nor2_l/layout/layout.oa new file mode 100644 index 000000000..b41df9edc Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__nor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__oai21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__oai21_l/layout/layout.oa new file mode 100644 index 000000000..f51564b2b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__oai21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__oai21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__oai21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__oai21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__oai22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__oai22_l/layout/layout.oa new file mode 100644 index 000000000..7ba084ea8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__oai22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__oai22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__oai22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__oai22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_1/layout/layout.oa new file mode 100644 index 000000000..4328b6be6 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_2/layout/layout.oa new file mode 100644 index 000000000..2fbc7f8cb Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_4/layout/layout.oa new file mode 100644 index 000000000..33496bc5d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_8/layout/layout.oa new file mode 100644 index 000000000..e6afd6e7b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_l/layout/layout.oa new file mode 100644 index 000000000..7b938d891 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__or2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__pcgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__pcgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..17a3d62e7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__pcgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__pcgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__pcgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__pcgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__pcgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__pcgate_1/layout/layout.oa new file mode 100644 index 000000000..9aed43d84 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__pcgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__pcgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__pcgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__pcgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tbufi_1/layout/layout.oa new file mode 100644 index 000000000..8c8d62529 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tbufi_l/layout/layout.oa new file mode 100644 index 000000000..cc271026a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tiehi/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tiehi/layout/layout.oa new file mode 100644 index 000000000..a55812285 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tiehi/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tiehi/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tiehi/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tiehi/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tielo/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tielo/layout/layout.oa new file mode 100644 index 000000000..11ffb4b2c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tielo/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tielo/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tielo/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tielo/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tnbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tnbufi_1/layout/layout.oa new file mode 100644 index 000000000..06547c354 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tnbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tnbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tnbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tnbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tnbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tnbufi_l/layout/layout.oa new file mode 100644 index 000000000..4c647018d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tnbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tnbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tnbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__tnbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__xnor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__xnor2_l/layout/layout.oa new file mode 100644 index 000000000..e41c703d5 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__xnor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__xnor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__xnor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__xnor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__xor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__xor2_l/layout/layout.oa new file mode 100644 index 000000000..3c4f191d9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__xor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__xor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__xor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ls__xor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addf_1/layout/layout.oa new file mode 100644 index 000000000..ffe630c8c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addf_l/layout/layout.oa new file mode 100644 index 000000000..e6ca5f9e2 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addh_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addh_1/layout/layout.oa new file mode 100644 index 000000000..27b557d48 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addh_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addh_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addh_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addh_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addh_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addh_l/layout/layout.oa new file mode 100644 index 000000000..14640f1e0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addh_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addh_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addh_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__addh_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_1/layout/layout.oa new file mode 100644 index 000000000..d20908911 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_2/layout/layout.oa new file mode 100644 index 000000000..9782064d8 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_4/layout/layout.oa new file mode 100644 index 000000000..e87659701 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_6/layout/layout.oa new file mode 100644 index 000000000..49f4e32c9 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_8/layout/layout.oa new file mode 100644 index 000000000..88c12831b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_l/layout/layout.oa new file mode 100644 index 000000000..e7cae40d3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__and2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ant/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ant/layout/layout.oa new file mode 100644 index 000000000..047918d7a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ant/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ant/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ant/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ant/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__antfill/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__antfill/layout/layout.oa new file mode 100644 index 000000000..117ca2190 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__antfill/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__antfill/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__antfill/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__antfill/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__aoi21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__aoi21_l/layout/layout.oa new file mode 100644 index 000000000..d8dd9ab75 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__aoi21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__aoi21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__aoi21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__aoi21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__aoi22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__aoi22_l/layout/layout.oa new file mode 100644 index 000000000..5816e888d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__aoi22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__aoi22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__aoi22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__aoi22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_1/layout/layout.oa new file mode 100644 index 000000000..ce47474be Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_2/layout/layout.oa new file mode 100644 index 000000000..3b35ae122 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_4/layout/layout.oa new file mode 100644 index 000000000..fec725129 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_6/layout/layout.oa new file mode 100644 index 000000000..f47eea7cf Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_8/layout/layout.oa new file mode 100644 index 000000000..029573d8b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_l/layout/layout.oa new file mode 100644 index 000000000..31e142054 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__buf_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__decap_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__decap_1/layout/layout.oa new file mode 100644 index 000000000..0d710c5a1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__decap_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__decap_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__decap_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__decap_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__decap_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__decap_l/layout/layout.oa new file mode 100644 index 000000000..c324a17cd Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__decap_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__decap_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__decap_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__decap_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dff_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dff_1/layout/layout.oa new file mode 100644 index 000000000..f551c16fc Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dff_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dff_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dff_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dff_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dff_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dff_l/layout/layout.oa new file mode 100644 index 000000000..e9c9dbb26 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dff_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dff_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dff_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dff_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffr_1/layout/layout.oa new file mode 100644 index 000000000..7d67197ac Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffr_l/layout/layout.oa new file mode 100644 index 000000000..ad088ed89 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffs_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffs_1/layout/layout.oa new file mode 100644 index 000000000..487eeb640 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffs_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffs_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffs_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffs_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffs_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffs_l/layout/layout.oa new file mode 100644 index 000000000..59ae058f7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffs_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffs_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffs_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffs_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffsr_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffsr_1/layout/layout.oa new file mode 100644 index 000000000..7fc55e616 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffsr_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffsr_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffsr_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffsr_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffsr_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffsr_l/layout/layout.oa new file mode 100644 index 000000000..5cf44bb0d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffsr_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffsr_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffsr_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dffsr_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dlat_1/layout/layout.oa new file mode 100644 index 000000000..9ed34a52e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dlat_l/layout/layout.oa new file mode 100644 index 000000000..9145f3452 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__dlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_1/layout/layout.oa new file mode 100644 index 000000000..34a4d53e7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_16/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_16/layout/layout.oa new file mode 100644 index 000000000..15c6059c4 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_16/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_16/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_16/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_16/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_2/layout/layout.oa new file mode 100644 index 000000000..4730c9532 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_32/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_32/layout/layout.oa new file mode 100644 index 000000000..1cfd32447 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_32/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_32/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_32/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_32/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_4/layout/layout.oa new file mode 100644 index 000000000..2d6853f41 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_8/layout/layout.oa new file mode 100644 index 000000000..1008b6fc7 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__fill_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_1/layout/layout.oa new file mode 100644 index 000000000..03b5d845d Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_10/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_10/layout/layout.oa new file mode 100644 index 000000000..622aa1202 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_10/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_10/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_10/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_10/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_2/layout/layout.oa new file mode 100644 index 000000000..6c12212fc Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_3/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_3/layout/layout.oa new file mode 100644 index 000000000..b7ce73aee Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_3/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_3/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_3/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_3/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_4/layout/layout.oa new file mode 100644 index 000000000..fbb6e9998 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_6/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_6/layout/layout.oa new file mode 100644 index 000000000..9fdae650c Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_6/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_6/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_6/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_6/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_8/layout/layout.oa new file mode 100644 index 000000000..6be5148c1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_l/layout/layout.oa new file mode 100644 index 000000000..90d3c7992 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__inv_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__mux2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__mux2_1/layout/layout.oa new file mode 100644 index 000000000..5fed73e4a Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__mux2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__mux2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__mux2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__mux2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nand2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nand2_1/layout/layout.oa new file mode 100644 index 000000000..fae6b6eb0 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nand2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nand2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nand2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nand2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nand2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nand2_l/layout/layout.oa new file mode 100644 index 000000000..a7edc4264 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nand2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nand2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nand2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nand2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ncgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ncgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..d7f87b172 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ncgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ncgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ncgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ncgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ncgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ncgate_1/layout/layout.oa new file mode 100644 index 000000000..8161d5783 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ncgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ncgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ncgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ncgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ndlat_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ndlat_1/layout/layout.oa new file mode 100644 index 000000000..cb5147330 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ndlat_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ndlat_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ndlat_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ndlat_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ndlat_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ndlat_l/layout/layout.oa new file mode 100644 index 000000000..4a1e80e92 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ndlat_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ndlat_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ndlat_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__ndlat_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nor2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nor2_1/layout/layout.oa new file mode 100644 index 000000000..98c991d45 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nor2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nor2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nor2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nor2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nor2_l/layout/layout.oa new file mode 100644 index 000000000..c4a991c5b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__nor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__oai21_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__oai21_l/layout/layout.oa new file mode 100644 index 000000000..b1d1b3e89 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__oai21_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__oai21_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__oai21_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__oai21_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__oai22_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__oai22_l/layout/layout.oa new file mode 100644 index 000000000..275ff239e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__oai22_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__oai22_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__oai22_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__oai22_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_1/layout/layout.oa new file mode 100644 index 000000000..dd04a988e Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_2/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_2/layout/layout.oa new file mode 100644 index 000000000..8234836ab Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_2/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_2/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_2/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_2/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_4/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_4/layout/layout.oa new file mode 100644 index 000000000..86e95a287 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_4/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_4/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_4/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_4/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_8/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_8/layout/layout.oa new file mode 100644 index 000000000..bfe8659ae Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_8/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_8/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_8/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_8/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_l/layout/layout.oa new file mode 100644 index 000000000..a276b2953 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__or2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__pcgateCKa_new/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__pcgateCKa_new/layout/layout.oa new file mode 100644 index 000000000..431b32b40 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__pcgateCKa_new/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__pcgateCKa_new/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__pcgateCKa_new/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__pcgateCKa_new/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__pcgate_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__pcgate_1/layout/layout.oa new file mode 100644 index 000000000..66aad22e3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__pcgate_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__pcgate_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__pcgate_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__pcgate_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tbufi_1/layout/layout.oa new file mode 100644 index 000000000..2a97cdcfe Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tbufi_l/layout/layout.oa new file mode 100644 index 000000000..4983981b3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tiehi/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tiehi/layout/layout.oa new file mode 100644 index 000000000..8dffb2a60 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tiehi/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tiehi/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tiehi/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tiehi/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tielo/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tielo/layout/layout.oa new file mode 100644 index 000000000..64746648b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tielo/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tielo/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tielo/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tielo/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tnbufi_1/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tnbufi_1/layout/layout.oa new file mode 100644 index 000000000..a2238b3c3 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tnbufi_1/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tnbufi_1/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tnbufi_1/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tnbufi_1/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tnbufi_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tnbufi_l/layout/layout.oa new file mode 100644 index 000000000..3d9c9bf3b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tnbufi_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tnbufi_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tnbufi_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__tnbufi_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__xnor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__xnor2_l/layout/layout.oa new file mode 100644 index 000000000..eeb1ff5b1 Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__xnor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__xnor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__xnor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__xnor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__xor2_l/layout/layout.oa b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__xor2_l/layout/layout.oa new file mode 100644 index 000000000..36f97492b Binary files /dev/null and b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__xor2_l/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__xor2_l/layout/master.tag b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__xor2_l/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/sky130_osu_sc_t18/sky130_osu_sc_18T_ms__xor2_l/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/test_sky130/.oalib b/sky130_cds/VirtuosoOA/test_sky130/.oalib new file mode 100644 index 000000000..21ffef899 --- /dev/null +++ b/sky130_cds/VirtuosoOA/test_sky130/.oalib @@ -0,0 +1,6 @@ + + + + + diff --git a/sky130_cds/VirtuosoOA/test_sky130/cdsinfo.tag b/sky130_cds/VirtuosoOA/test_sky130/cdsinfo.tag new file mode 100644 index 000000000..b75aa95c9 --- /dev/null +++ b/sky130_cds/VirtuosoOA/test_sky130/cdsinfo.tag @@ -0,0 +1,41 @@ +# +# This is a cdsinfo.tag file. +# +# See the "Cadence Application Infrastructure Reference Manual" for +# details on the format of this file, its semantics, and its use. +# +# The `#' character denotes a comment. Removing the leading `#' +# character from any of the entries below will activate them. +# +# CDSLIBRARY entry - add this entry if the directory containing +# this cdsinfo.tag file is the root of a Cadence library. +# CDSLIBRARY +# +# CDSLIBCHECK - set this entry to require that libraries have +# a cdsinfo.tag file with a CDSLIBRARY entry. Legal values are +# ON and OFF. By default (OFF), directories named in a cds.lib file +# do not have to have a cdsinfo.tag file with a CDSLIBRARY entry. +# CDSLIBCHECK ON +# +# DMTYPE - set this entry to define the DM system for Cadence's +# Generic DM facility. Values will be shifted to lower case. +# DMTYPE none +# DMTYPE crcs +# DMTYPE tdm +# DMTYPE sync +# +# NAMESPACE - set this entry to define the library namespace according +# to the type of machine on which the data is stored. Legal values are +# `LibraryNT' and +# `LibraryUnix'. +# NAMESPACE LibraryUnix +# +# Other entries may be added for use by specific applications as +# name-value pairs. Application documentation will describe the +# use and behaviour of these entries when appropriate. +# +# Current Settings: +# +CDSLIBRARY +DMTYPE none +NAMESPACE LibraryUnix diff --git a/sky130_cds/VirtuosoOA/test_sky130/data.dm b/sky130_cds/VirtuosoOA/test_sky130/data.dm new file mode 100644 index 000000000..918cd3ef4 Binary files /dev/null and b/sky130_cds/VirtuosoOA/test_sky130/data.dm differ diff --git a/sky130_cds/VirtuosoOA/test_sky130/sample/layout/layout.oa b/sky130_cds/VirtuosoOA/test_sky130/sample/layout/layout.oa new file mode 100644 index 000000000..f4f7f20dc Binary files /dev/null and b/sky130_cds/VirtuosoOA/test_sky130/sample/layout/layout.oa differ diff --git a/sky130_cds/VirtuosoOA/test_sky130/sample/layout/master.tag b/sky130_cds/VirtuosoOA/test_sky130/sample/layout/master.tag new file mode 100644 index 000000000..431d8f043 --- /dev/null +++ b/sky130_cds/VirtuosoOA/test_sky130/sample/layout/master.tag @@ -0,0 +1,2 @@ +-- Master.tag File, Rev:1.0 +layout.oa diff --git a/sky130_cds/VirtuosoOA/test_sky130/sample/layout/thumbnail_128x128.png b/sky130_cds/VirtuosoOA/test_sky130/sample/layout/thumbnail_128x128.png new file mode 100644 index 000000000..f3570415e Binary files /dev/null and b/sky130_cds/VirtuosoOA/test_sky130/sample/layout/thumbnail_128x128.png differ diff --git a/sky130_cds/VirtuosoOA/xStrmOut_layerMap.txt b/sky130_cds/VirtuosoOA/xStrmOut_layerMap.txt new file mode 100644 index 000000000..9ce6c7251 --- /dev/null +++ b/sky130_cds/VirtuosoOA/xStrmOut_layerMap.txt @@ -0,0 +1,8 @@ +#################################################################### +# This layer map file is generated by XStream/strmout +#It can be used during Stream In to preserve original layer/purpose. +# +# OA OA Stream Stream +# Layer Purpose LayerNum Datatype +#################################################################### + diff --git a/sky130_cds/deleteDS.sh b/sky130_cds/deleteDS.sh new file mode 100755 index 000000000..d7ca3110e --- /dev/null +++ b/sky130_cds/deleteDS.sh @@ -0,0 +1,4 @@ +#!/bin/sh +find . -name '.DS_Store' -type f -delete + + diff --git a/sky130_cds/doc/SV.pptx b/sky130_cds/doc/SV.pptx new file mode 100755 index 000000000..0b20e2538 Binary files /dev/null and b/sky130_cds/doc/SV.pptx differ diff --git a/sky130_cds/doc/SV2.pptx b/sky130_cds/doc/SV2.pptx new file mode 100644 index 000000000..4b1b21233 Binary files /dev/null and b/sky130_cds/doc/SV2.pptx differ diff --git a/sky130_cds/doc/SoC.pptx b/sky130_cds/doc/SoC.pptx new file mode 100755 index 000000000..113f021b6 Binary files /dev/null and b/sky130_cds/doc/SoC.pptx differ diff --git a/sky130_cds/doc/fabs.pptx b/sky130_cds/doc/fabs.pptx new file mode 100755 index 000000000..bee189c1e Binary files /dev/null and b/sky130_cds/doc/fabs.pptx differ diff --git a/sky130_cds/doc/layout-info.pptx b/sky130_cds/doc/layout-info.pptx new file mode 100755 index 000000000..67529b0bf Binary files /dev/null and b/sky130_cds/doc/layout-info.pptx differ diff --git a/sky130_cds/doc/magic.pptx b/sky130_cds/doc/magic.pptx new file mode 100755 index 000000000..21d48e818 Binary files /dev/null and b/sky130_cds/doc/magic.pptx differ diff --git a/sky130_cds/doc/sample.zip b/sky130_cds/doc/sample.zip new file mode 100644 index 000000000..cb2cb3173 Binary files /dev/null and b/sky130_cds/doc/sample.zip differ diff --git a/sky130_cds/doc/stick.pptx b/sky130_cds/doc/stick.pptx new file mode 100755 index 000000000..7d670fa02 Binary files /dev/null and b/sky130_cds/doc/stick.pptx differ diff --git a/sky130_cds/images/mult_seq.png b/sky130_cds/images/mult_seq.png new file mode 100755 index 000000000..c7fc40851 Binary files /dev/null and b/sky130_cds/images/mult_seq.png differ diff --git a/sky130_cds/images/mult_seq.vsdx b/sky130_cds/images/mult_seq.vsdx new file mode 100755 index 000000000..de1d83f1b Binary files /dev/null and b/sky130_cds/images/mult_seq.vsdx differ diff --git a/sky130_cds/pnr/.gitignore b/sky130_cds/pnr/.gitignore new file mode 100755 index 000000000..4fde0b3bb --- /dev/null +++ b/sky130_cds/pnr/.gitignore @@ -0,0 +1,11 @@ +innovus.logv* +innovus.log* +innovus.cmd* +LOG +DBS +RPT +FF +timingReports +mult_pad_via_layer* +make +checkDesign diff --git a/sky130_cds/pnr/.tapeout.tcl.swp b/sky130_cds/pnr/.tapeout.tcl.swp new file mode 100755 index 000000000..ebcd7ffdc Binary files /dev/null and b/sky130_cds/pnr/.tapeout.tcl.swp differ diff --git a/sky130_cds/pnr/.test.def.swp b/sky130_cds/pnr/.test.def.swp new file mode 100755 index 000000000..28badc780 Binary files /dev/null and b/sky130_cds/pnr/.test.def.swp differ diff --git a/sky130_cds/pnr/COPYRIGHT b/sky130_cds/pnr/COPYRIGHT new file mode 100755 index 000000000..7c5e172f5 --- /dev/null +++ b/sky130_cds/pnr/COPYRIGHT @@ -0,0 +1,33 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### diff --git a/sky130_cds/pnr/INNOVUS/run_cts.tcl b/sky130_cds/pnr/INNOVUS/run_cts.tcl new file mode 100755 index 000000000..849ae041b --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_cts.tcl @@ -0,0 +1,102 @@ +#################################################################### +# Innovus Foundation Flow Code Generator, Fri Jun 24 13:02:02 CDT 2022 +# Version : 17.10-p003_1 +#################################################################### + +if {[file exists FF/vars.tcl]} { + source FF/vars.tcl +} +foreach file $vars(config_files) { + source $file +} + +source FF/procs.tcl +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 + +if {$vars(restore_design)} { restoreDesign DBS/place.enc.dat mult_seq } + +um::enable_metrics -on +puts " Plugin -> always_source_tcl" + +#------------------------------------------------------------- +set vars(step) cts +set vars(cts,start_time) [clock seconds] +um::push_snapshot_stack +#------------------------------------------------------------- + +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(process) +# - vars(enable_cppr) +# - vars(route_clock_nets) +# - vars(ccopt_integration) +# - vars(cts_inverter_cells) +# - vars(update_io_latency) +# - vars(ccopt_effort) +# - vars(litho_driven_routing) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(power_effort) "low or high" +# - vars(enable_ocv) "pre_cts" +# - vars(enable_aocv) "true" +# - vars(enable_socv) "true" +# - vars(clk_tree_top_layer) +# - vars(clk_leaf_top_layer) +# - vars(clk_tree_bottom_layer) +# - vars(clk_leaf_bottom_layer) +# - vars(clk_tree_ndr) +# - vars(clk_tree_extra_space) +# - vars(clk_leaf_ndr) +# - vars(clk_leaf_extra_space) +# - vars(cts_buffer_cells) +# - vars(clock_gate_cells) +# - vars(cts_use_inverters) +# - vars(cts_io_opt) +# - vars(cts_target_skew) +# - vars(cts_target_slew) +# - vars(ccopt_executable) +# - vars(clk_tree_shield_net) +# - vars(multi_cut_effort) +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(cts,active_setup_views) +# - vars(cts,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(cts,active_setup_views) -hold $vars(cts,active_hold_views) +# +setDesignMode -process 130 +setAnalysisMode -cppr none +set_ccopt_mode -integration "native" \ + -cts_inverter_cells "sky130_osu_sc_18T_ms__inv_l sky130_osu_sc_18T_ms__inv_1 sky130_osu_sc_18T_ms__inv_2 sky130_osu_sc_18T_ms__inv_3 sky130_osu_sc_18T_ms__inv_4" \ + -ccopt_modify_clock_latency true + +setNanoRouteMode -routeWithLithoDriven false +Puts " RUNNING CLOCK TREE SYNTHESIS ..." +source FF/timingderate.sdc +puts " Plugin -> pre_cts_tcl" +ff_procs::source_plug pre_cts_tcl +create_ccopt_clock_tree_spec +ccopt_design -outDir RPT -prefix cts +puts " Plugin -> post_cts_tcl" +ff_procs::source_plug post_cts_tcl +#------------------------------------------------------------- + +um::pop_snapshot_stack +create_snapshot -name cts -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/cts.enc -compress +saveNetlist DBS/LEC/cts.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/cts} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +if {![info exists vars(single)]} { + exit 0 +} + diff --git a/sky130_cds/pnr/INNOVUS/run_init.tcl b/sky130_cds/pnr/INNOVUS/run_init.tcl new file mode 100755 index 000000000..7779116c7 --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_init.tcl @@ -0,0 +1,82 @@ +#################################################################### +# Innovus Foundation Flow Code Generator, Fri Jun 24 18:45:41 CDT 2022 +# Version : 17.10-p003_1 +#################################################################### + +if {[file exists FF/vars.tcl]} { + source FF/vars.tcl +} +foreach file $vars(config_files) { + source $file +} + +source FF/procs.tcl +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(report_run_time) +# - vars(add_tracks) +# - vars(max_route_layer) +# - vars(process) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(ilm_list) "" +# - vars(,ilm_dir) "" +# - vars(,lef_file) "" +# - vars(,setup_lib) "" +# - vars(fp_tcl_file) +# - vars(fp_tcl_proc) +# - vars(fp_file) +# - vars(oa_fp) +# - vars(def_files) +# - vars(ilm_non_sdc_file) +# - vars(activity_file) +# - vars(activity_file_format) +# - vars(scan_def) +# - vars(spare_cells) +# - vars(dont_use_list) +# - vars(dont_use_file) +# - vars(use_list) +# - vars(power_effort) "low or high" +# - vars(welltaps) +# - vars(pre_endcap) +# - vars(post_endcap) +###################################################################### +set vars(step) init +set vars(init,start_time) [clock seconds] +exec mkdir -p $env(VPATH) +puts " Plugin -> pre_init_tcl" +ff_procs::source_plug pre_init_tcl +source FF/init.tcl +init_design +um::enable_metrics -on +um::push_snapshot_stack +puts " Plugin -> always_source_tcl" +add_tracks +source FF/timingderate.sdc +setMaxRouteLayer 5 +setDesignMode -process 130 +puts " Plugin -> post_init_tcl" +ff_procs::source_plug post_init_tcl +timeDesign -preplace -prefix preplace -outDir RPT +checkDesign -all +check_timing +#------------------------------------------------------------- + +um::pop_snapshot_stack +create_snapshot -name init -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/init.enc -compress +saveNetlist DBS/LEC/init.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/init} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +if {![info exists vars(single)]} { + exit 0 +} + diff --git a/sky130_cds/pnr/INNOVUS/run_place.tcl b/sky130_cds/pnr/INNOVUS/run_place.tcl new file mode 100755 index 000000000..a7db498f0 --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_place.tcl @@ -0,0 +1,92 @@ +#################################################################### +# Innovus Foundation Flow Code Generator, Fri Jun 24 13:01:40 CDT 2022 +# Version : 17.10-p003_1 +#################################################################### + +if {[file exists FF/vars.tcl]} { + source FF/vars.tcl +} +foreach file $vars(config_files) { + source $file +} + +source FF/procs.tcl +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 + +if {$vars(restore_design)} { restoreDesign DBS/init.enc.dat mult_seq } + +um::enable_metrics -on +puts " Plugin -> always_source_tcl" + +#------------------------------------------------------------- +set vars(step) place +set vars(place,start_time) [clock seconds] +um::push_snapshot_stack +#------------------------------------------------------------- + +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(process) +# - vars(enable_ocv) +# - vars(place_io_pins) +# - vars(in_place_opt) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(power_effort) "low or high" +# - vars(enable_aocv) +# - vars(enable_socv) +# - vars(enable_ss) "pre_place" +# - vars(congestion_effort) "auto low medium high" +# - vars(clock_gate_aware) "true" +# - vars(size_only_file) "" +# - vars(leakage_power_effort) "low or high" +# - vars(dynamic_power_effort) "low or high" +# - vars(clock_gate_aware_opt) "true" +# - vars(all_end_points) "true" +# - vars(fix_fanout_load) "" +# - vars(useful_skew) "true" +# - vars(skew_buffers) "" +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(place,active_setup_views) +# - vars(place,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(place,active_setup_views) -hold $vars(place,active_hold_views) +# +setDesignMode -process 130 +setAnalysisMode -analysisType onChipVariation +setPlaceMode -place_global_place_io_pins true +Puts " RUNNING PLACEMENT ..." +puts " Plugin -> pre_place_tcl" +ff_procs::source_plug pre_place_tcl +place_opt_design -out_dir RPT -prefix place +puts " Plugin -> post_place_tcl" +setTieHiLoMode -cell "sky130_osu_sc_18T_ms__tiehi sky130_osu_sc_18T_ms__tielo" +foreach cell {sky130_osu_sc_18T_ms__tiehi sky130_osu_sc_18T_ms__tielo} { + setDontUse $cell false +} +addTieHiLo +foreach cell {sky130_osu_sc_18T_ms__tiehi sky130_osu_sc_18T_ms__tielo} { + setDontUse $cell true +} +#------------------------------------------------------------- + +um::pop_snapshot_stack +create_snapshot -name place -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/place.enc -compress +saveNetlist DBS/LEC/place.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/place} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +if {![info exists vars(single)]} { + exit 0 +} + diff --git a/sky130_cds/pnr/INNOVUS/run_postcts_hold.tcl b/sky130_cds/pnr/INNOVUS/run_postcts_hold.tcl new file mode 100755 index 000000000..4de67c28d --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_postcts_hold.tcl @@ -0,0 +1,68 @@ +#################################################################### +# Innovus Foundation Flow Code Generator, Fri Jun 24 13:03:00 CDT 2022 +# Version : 17.10-p003_1 +#################################################################### + +if {[file exists FF/vars.tcl]} { + source FF/vars.tcl +} +foreach file $vars(config_files) { + source $file +} + +source FF/procs.tcl +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 + +if {$vars(restore_design)} { restoreDesign DBS/cts.enc.dat mult_seq } + +um::enable_metrics -on +puts " Plugin -> always_source_tcl" + +#------------------------------------------------------------- +set vars(step) postcts_hold +set vars(postcts_hold,start_time) [clock seconds] +um::push_snapshot_stack +#------------------------------------------------------------- + +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(process) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(power_effort) "low or high" +# - vars(delay_cells) +# - vars(fix_hold_allow_tns_degradation) +# - vars(fix_hold_ignore_ios) +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(postcts_hold,active_setup_views) +# - vars(postcts_hold,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(postcts_hold,active_setup_views) -hold $vars(postcts_hold,active_hold_views) +# +setDesignMode -process 130 +Puts " RUNNING POST-CTS HOLD FIXING ..." +puts " Plugin -> pre_postcts_hold_tcl" +optDesign -postCTS -hold -outDir RPT -prefix postcts_hold +puts " Plugin -> post_postcts_hold_tcl" +#------------------------------------------------------------- + +um::pop_snapshot_stack +create_snapshot -name postcts_hold -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/postcts_hold.enc -compress +saveNetlist DBS/LEC/postcts_hold.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/postcts_hold} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +if {![info exists vars(single)]} { + exit 0 +} + diff --git a/sky130_cds/pnr/INNOVUS/run_postroute.tcl b/sky130_cds/pnr/INNOVUS/run_postroute.tcl new file mode 100755 index 000000000..d852f7186 --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_postroute.tcl @@ -0,0 +1,107 @@ +#################################################################### +# Innovus Foundation Flow Code Generator, Fri Jun 24 13:05:05 CDT 2022 +# Version : 17.10-p003_1 +#################################################################### + +if {[file exists FF/vars.tcl]} { + source FF/vars.tcl +} +foreach file $vars(config_files) { + source $file +} + +source FF/procs.tcl +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 + +if {$vars(restore_design)} { restoreDesign DBS/route.enc.dat mult_seq } + +um::enable_metrics -on +puts " Plugin -> always_source_tcl" + +#------------------------------------------------------------- +set vars(step) postroute +set vars(postroute,start_time) [clock seconds] +um::push_snapshot_stack +#------------------------------------------------------------- + +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(process) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(power_effort) "low or high" +# - vars(postroute_extraction_effort) +# - vars(total_c_thresh) +# - vars(relative_c_thresh) +# - vars(coupling_c_thresh) +# - vars(qrc_layer_map) +# - vars(delay_cells) +# - vars(fix_hold_allow_tns_degradation) +# - vars(fix_hold_ignore_ios) +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(postroute_hold,active_setup_views) +# - vars(postroute_hold,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(postroute_hold,active_setup_views) -hold $vars(postroute_hold,active_hold_views) +# +setDesignMode -process 130 +setExtractRCMode -engine postRoute +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(process) +# - vars(process) +# - vars(enable_cppr) +# - vars(enable_si_aware) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(power_effort) "low or high" +# - vars(postroute_extraction_effort) +# - vars(total_c_thresh) +# - vars(relative_c_thresh) +# - vars(relative_c_thresh) +# - vars(qrc_layer_map) +# - vars(enable_ocv) "pre_postroute" +# - vars(enable_aocv) "true" +# - vars(enable_socv) "true" +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(postroute,active_setup_views) +# - vars(postroute,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(postroute,active_setup_views) -hold $vars(postroute,active_hold_views) +# +setDesignMode -process 130 +setExtractRCMode -engine postRoute +setAnalysisMode -cppr none +setDelayCalMode -siAware true -engine aae +Puts " RUNNING POST-ROUTE OPTIMIZATION ..." +puts " Plugin -> pre_postroute_tcl" +puts " Plugin -> pre_postroute_hold_tcl" +optDesign -postRoute -outDir RPT -prefix postroute -setup -hold +puts " Plugin -> post_postroute_tcl" +#------------------------------------------------------------- + +um::pop_snapshot_stack +create_snapshot -name postroute -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/postroute.enc -compress +saveNetlist DBS/LEC/postroute.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/postroute} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +if {![info exists vars(single)]} { + exit 0 +} + diff --git a/sky130_cds/pnr/INNOVUS/run_route.tcl b/sky130_cds/pnr/INNOVUS/run_route.tcl new file mode 100755 index 000000000..6cba66acb --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_route.tcl @@ -0,0 +1,76 @@ +#################################################################### +# Innovus Foundation Flow Code Generator, Fri Jun 24 13:03:44 CDT 2022 +# Version : 17.10-p003_1 +#################################################################### + +if {[file exists FF/vars.tcl]} { + source FF/vars.tcl +} +foreach file $vars(config_files) { + source $file +} + +source FF/procs.tcl +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 + +if {$vars(restore_design)} { restoreDesign DBS/postcts_hold.enc.dat mult_seq } + +um::enable_metrics -on +puts " Plugin -> always_source_tcl" + +#------------------------------------------------------------- +set vars(step) route +set vars(route,start_time) [clock seconds] +um::push_snapshot_stack +#------------------------------------------------------------- + +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(enable_cppr) +# - vars(track_opt) +# - vars(enable_si_aware) +# - vars(litho_driven_routing) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(multi_cut_effort) +# - vars(antenna_diode) +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(route,active_setup_views) +# - vars(route,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(route,active_setup_views) -hold $vars(route,active_hold_views) +# +setAnalysisMode -cppr both +setDelayCalMode -siAware true -engine aae + +setNanoRouteMode -routeWithLithoDriven false +setFillerMode -core "sky130_osu_sc_18T_ms__fill_1 sky130_osu_sc_18T_ms__fill_2 sky130_osu_sc_18T_ms__fill_4 sky130_osu_sc_18T_ms__fill_8 sky130_osu_sc_18T_ms__fill_16" \ + -corePrefix FILL +addFiller +Puts " RUNNING GLOBAL/DETAIL ROUTING ..." +puts " Plugin -> pre_route_tcl" +routeDesign +setExtractRCMode -engine postRoute +puts " Plugin -> post_route_tcl" +#------------------------------------------------------------- + +um::pop_snapshot_stack +create_snapshot -name route -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/route.enc -compress +saveNetlist DBS/LEC/route.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/route} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +if {![info exists vars(single)]} { + exit 0 +} + diff --git a/sky130_cds/pnr/INNOVUS/run_signoff.tcl b/sky130_cds/pnr/INNOVUS/run_signoff.tcl new file mode 100755 index 000000000..7b4c1a53e --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_signoff.tcl @@ -0,0 +1,111 @@ +#################################################################### +# Innovus Foundation Flow Code Generator, Fri Jun 24 13:06:16 CDT 2022 +# Version : 17.10-p003_1 +#################################################################### + +if {[file exists FF/vars.tcl]} { + source FF/vars.tcl +} +foreach file $vars(config_files) { + source $file +} + +source FF/procs.tcl +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 + +if {$vars(restore_design)} { restoreDesign DBS/postroute.enc.dat mult_seq } + +um::enable_metrics -on +puts " Plugin -> always_source_tcl" + +#------------------------------------------------------------- +set vars(step) signoff +set vars(signoff,start_time) [clock seconds] +um::push_snapshot_stack +#------------------------------------------------------------- + +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(process) +# - vars(signoff_extraction_effort) +# - vars(enable_ocv) +# - vars(enable_cppr) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(total_c_thresh) +# - vars(relative_c_thresh) +# - vars(coupling_c_thresh) +# - vars(qrc_layer_map) +# - vars(delta_delay_threshold) +# - vars(celtic_settings) +# - vars(si_analysis_type) +# - vars(enable_aocv) +# - vars(enable_socv) +# - vars(enable_ss) "pre_signoff" +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(signoff,active_setup_views) +# - vars(signoff,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(signoff,active_setup_views) -hold $vars(signoff,active_hold_views) +# +setDesignMode -process 130 +setExtractRCMode -coupled true -effortLevel low +setAnalysisMode -analysisType onChipVariation -cppr none +set vars(active_rc_corners) [list] +foreach view [concat [all_setup_analysis_views] [all_hold_analysis_views]] { + set corner [get_delay_corner [get_analysis_view $view -delay_corner] \ + -rc_corner] + if {[lsearch $vars(active_rc_corners) $corner] == -1 } { + lappend vars(active_rc_corners) $corner + } +} +Puts " ACTIVE RC CORNER LIST: $vars(active_rc_corners)" +set empty_corners [list] +foreach corner $vars(active_rc_corners) { + if {![file exists [get_rc_corner $corner -qx_tech_file]]} { + lappend empty_corners $corner + } +} +if {[llength $empty_corners] == 0} { + setExtractRCMode -engine postRoute -effortLevel low -coupled true +} else { + Puts " CAN'T RUN SIGNOFF EXTRACTION BECAUSE qx_tech_file IS NOT DEFINED FOR these corners: $empty_corners" + setExtractRCMode -engine postRoute -effortLevel low -coupled true +} +puts " Plugin -> pre_signoff_tcl" +Puts " RUNNING FINAL SIGNOFF ..." +extractRC +foreach corner $vars(active_rc_corners) { + rcOut -rc_corner $corner -spef $corner.spef.gz +} +timeDesign -prefix signoff -signoff -reportOnly -outDir RPT +timeDesign -prefix signoff -signoff -reportOnly -hold -outDir RPT +summaryReport -outDir RPT +verifyConnectivity -noAntenna +verify_drc +verifyMetalDensity +verifyProcessAntenna +puts " Plugin -> post_signoff_tcl" +ff_procs::source_plug post_signoff_tcl +#------------------------------------------------------------- + +um::pop_snapshot_stack +create_snapshot -name signoff -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/signoff.enc -compress +saveNetlist DBS/LEC/signoff.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/signoff} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +if {![info exists vars(single)]} { + exit 0 +} + diff --git a/sky130_cds/pnr/INNOVUS/run_simple.cts.tcl b/sky130_cds/pnr/INNOVUS/run_simple.cts.tcl new file mode 100755 index 000000000..40bd13e62 --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_simple.cts.tcl @@ -0,0 +1,96 @@ +##################################################################### +# SINGLE SCRIPT FLOW +##################################################################### + +source FF/vars.tcl +source FF/procs.tcl + +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 + + +if {$vars(restore_design)} { restoreDesign DBS/place.enc.dat mult_seq } + +um::enable_metrics -on +puts " Plugin -> always_source_tcl" + + +#------------------------------------------------------------- +set vars(step) cts +set vars(cts,start_time) [clock seconds] +um::push_snapshot_stack +#------------------------------------------------------------- + +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(process) +# - vars(enable_cppr) +# - vars(route_clock_nets) +# - vars(ccopt_integration) +# - vars(cts_inverter_cells) +# - vars(update_io_latency) +# - vars(ccopt_effort) +# - vars(litho_driven_routing) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(power_effort) "low or high" +# - vars(enable_ocv) "pre_cts" +# - vars(enable_aocv) "true" +# - vars(enable_socv) "true" +# - vars(clk_tree_top_layer) +# - vars(clk_leaf_top_layer) +# - vars(clk_tree_bottom_layer) +# - vars(clk_leaf_bottom_layer) +# - vars(clk_tree_ndr) +# - vars(clk_tree_extra_space) +# - vars(clk_leaf_ndr) +# - vars(clk_leaf_extra_space) +# - vars(cts_buffer_cells) +# - vars(clock_gate_cells) +# - vars(cts_use_inverters) +# - vars(cts_io_opt) +# - vars(cts_target_skew) +# - vars(cts_target_slew) +# - vars(ccopt_executable) +# - vars(clk_tree_shield_net) +# - vars(multi_cut_effort) +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(cts,active_setup_views) +# - vars(cts,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(cts,active_setup_views) -hold $vars(cts,active_hold_views) +# +setDesignMode -process 130 +setAnalysisMode -cppr none +set_ccopt_mode -integration "native" \ + -cts_inverter_cells "sky130_osu_sc_18T_ms__inv_l sky130_osu_sc_18T_ms__inv_1 sky130_osu_sc_18T_ms__inv_2 sky130_osu_sc_18T_ms__inv_3 sky130_osu_sc_18T_ms__inv_4" \ + -ccopt_modify_clock_latency true + +setNanoRouteMode -routeWithLithoDriven false +Puts " RUNNING CLOCK TREE SYNTHESIS ..." +source FF/timingderate.sdc +puts " Plugin -> pre_cts_tcl" +ff_procs::source_plug pre_cts_tcl +create_ccopt_clock_tree_spec +ccopt_design -outDir RPT -prefix cts +puts " Plugin -> post_cts_tcl" +ff_procs::source_plug post_cts_tcl +#------------------------------------------------------------- + + +um::pop_snapshot_stack +create_snapshot -name cts -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/cts.enc -compress +saveNetlist DBS/LEC/cts.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/cts} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +exit diff --git a/sky130_cds/pnr/INNOVUS/run_simple.init.tcl b/sky130_cds/pnr/INNOVUS/run_simple.init.tcl new file mode 100755 index 000000000..2d1f12820 --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_simple.init.tcl @@ -0,0 +1,76 @@ +##################################################################### +# SINGLE SCRIPT FLOW +##################################################################### + +source FF/vars.tcl +source FF/procs.tcl + +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 + + +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(report_run_time) +# - vars(add_tracks) +# - vars(max_route_layer) +# - vars(process) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(ilm_list) "" +# - vars(,ilm_dir) "" +# - vars(,lef_file) "" +# - vars(,setup_lib) "" +# - vars(fp_tcl_file) +# - vars(fp_tcl_proc) +# - vars(fp_file) +# - vars(oa_fp) +# - vars(def_files) +# - vars(ilm_non_sdc_file) +# - vars(activity_file) +# - vars(activity_file_format) +# - vars(scan_def) +# - vars(spare_cells) +# - vars(dont_use_list) +# - vars(dont_use_file) +# - vars(use_list) +# - vars(power_effort) "low or high" +# - vars(welltaps) +# - vars(pre_endcap) +# - vars(post_endcap) +###################################################################### +set vars(step) init +set vars(init,start_time) [clock seconds] +exec mkdir -p $env(VPATH) +puts " Plugin -> pre_init_tcl" +ff_procs::source_plug pre_init_tcl +source FF/init.tcl +init_design +um::enable_metrics -on +um::push_snapshot_stack +puts " Plugin -> always_source_tcl" +add_tracks +source FF/timingderate.sdc +setMaxRouteLayer 5 +setDesignMode -process 130 +puts " Plugin -> post_init_tcl" +ff_procs::source_plug post_init_tcl +timeDesign -preplace -prefix preplace -outDir RPT +checkDesign -all +check_timing +#------------------------------------------------------------- + + +um::pop_snapshot_stack +create_snapshot -name init -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/init.enc -compress +saveNetlist DBS/LEC/init.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/init} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +exit diff --git a/sky130_cds/pnr/INNOVUS/run_simple.place.tcl b/sky130_cds/pnr/INNOVUS/run_simple.place.tcl new file mode 100755 index 000000000..1cf0481b4 --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_simple.place.tcl @@ -0,0 +1,86 @@ +##################################################################### +# SINGLE SCRIPT FLOW +##################################################################### + +source FF/vars.tcl +source FF/procs.tcl + +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 + + +if {$vars(restore_design)} { restoreDesign DBS/init.enc.dat mult_seq } + +um::enable_metrics -on +puts " Plugin -> always_source_tcl" + + +#------------------------------------------------------------- +set vars(step) place +set vars(place,start_time) [clock seconds] +um::push_snapshot_stack +#------------------------------------------------------------- + +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(process) +# - vars(enable_ocv) +# - vars(place_io_pins) +# - vars(in_place_opt) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(power_effort) "low or high" +# - vars(enable_aocv) +# - vars(enable_socv) +# - vars(enable_ss) "pre_place" +# - vars(congestion_effort) "auto low medium high" +# - vars(clock_gate_aware) "true" +# - vars(size_only_file) "" +# - vars(leakage_power_effort) "low or high" +# - vars(dynamic_power_effort) "low or high" +# - vars(clock_gate_aware_opt) "true" +# - vars(all_end_points) "true" +# - vars(fix_fanout_load) "" +# - vars(useful_skew) "true" +# - vars(skew_buffers) "" +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(place,active_setup_views) +# - vars(place,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(place,active_setup_views) -hold $vars(place,active_hold_views) +# +setDesignMode -process 130 +setAnalysisMode -analysisType onChipVariation +setPlaceMode -place_global_place_io_pins true +Puts " RUNNING PLACEMENT ..." +puts " Plugin -> pre_place_tcl" +ff_procs::source_plug pre_place_tcl +place_opt_design -out_dir RPT -prefix place +puts " Plugin -> post_place_tcl" +setTieHiLoMode -cell "sky130_osu_sc_18T_ms__tiehi sky130_osu_sc_18T_ms__tielo" +foreach cell {sky130_osu_sc_18T_ms__tiehi sky130_osu_sc_18T_ms__tielo} { + setDontUse $cell false +} +addTieHiLo +foreach cell {sky130_osu_sc_18T_ms__tiehi sky130_osu_sc_18T_ms__tielo} { + setDontUse $cell true +} +#------------------------------------------------------------- + + +um::pop_snapshot_stack +create_snapshot -name place -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/place.enc -compress +saveNetlist DBS/LEC/place.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/place} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +exit diff --git a/sky130_cds/pnr/INNOVUS/run_simple.postcts_hold.tcl b/sky130_cds/pnr/INNOVUS/run_simple.postcts_hold.tcl new file mode 100755 index 000000000..c88856c04 --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_simple.postcts_hold.tcl @@ -0,0 +1,62 @@ +##################################################################### +# SINGLE SCRIPT FLOW +##################################################################### + +source FF/vars.tcl +source FF/procs.tcl + +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 + + +if {$vars(restore_design)} { restoreDesign DBS/cts.enc.dat mult_seq } + +um::enable_metrics -on +puts " Plugin -> always_source_tcl" + + +#------------------------------------------------------------- +set vars(step) postcts_hold +set vars(postcts_hold,start_time) [clock seconds] +um::push_snapshot_stack +#------------------------------------------------------------- + +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(process) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(power_effort) "low or high" +# - vars(delay_cells) +# - vars(fix_hold_allow_tns_degradation) +# - vars(fix_hold_ignore_ios) +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(postcts_hold,active_setup_views) +# - vars(postcts_hold,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(postcts_hold,active_setup_views) -hold $vars(postcts_hold,active_hold_views) +# +setDesignMode -process 130 +Puts " RUNNING POST-CTS HOLD FIXING ..." +puts " Plugin -> pre_postcts_hold_tcl" +optDesign -postCTS -hold -outDir RPT -prefix postcts_hold +puts " Plugin -> post_postcts_hold_tcl" +#------------------------------------------------------------- + + +um::pop_snapshot_stack +create_snapshot -name postcts_hold -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/postcts_hold.enc -compress +saveNetlist DBS/LEC/postcts_hold.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/postcts_hold} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +exit diff --git a/sky130_cds/pnr/INNOVUS/run_simple.postroute.tcl b/sky130_cds/pnr/INNOVUS/run_simple.postroute.tcl new file mode 100755 index 000000000..0ec0112e0 --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_simple.postroute.tcl @@ -0,0 +1,101 @@ +##################################################################### +# SINGLE SCRIPT FLOW +##################################################################### + +source FF/vars.tcl +source FF/procs.tcl + +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 + + +if {$vars(restore_design)} { restoreDesign DBS/route.enc.dat mult_seq } + +um::enable_metrics -on +puts " Plugin -> always_source_tcl" + + +#------------------------------------------------------------- +set vars(step) postroute +set vars(postroute,start_time) [clock seconds] +um::push_snapshot_stack +#------------------------------------------------------------- + +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(process) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(power_effort) "low or high" +# - vars(postroute_extraction_effort) +# - vars(total_c_thresh) +# - vars(relative_c_thresh) +# - vars(coupling_c_thresh) +# - vars(qrc_layer_map) +# - vars(delay_cells) +# - vars(fix_hold_allow_tns_degradation) +# - vars(fix_hold_ignore_ios) +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(postroute_hold,active_setup_views) +# - vars(postroute_hold,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(postroute_hold,active_setup_views) -hold $vars(postroute_hold,active_hold_views) +# +setDesignMode -process 130 +setExtractRCMode -engine postRoute +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(process) +# - vars(process) +# - vars(enable_cppr) +# - vars(enable_si_aware) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(power_effort) "low or high" +# - vars(postroute_extraction_effort) +# - vars(total_c_thresh) +# - vars(relative_c_thresh) +# - vars(relative_c_thresh) +# - vars(qrc_layer_map) +# - vars(enable_ocv) "pre_postroute" +# - vars(enable_aocv) "true" +# - vars(enable_socv) "true" +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(postroute,active_setup_views) +# - vars(postroute,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(postroute,active_setup_views) -hold $vars(postroute,active_hold_views) +# +setDesignMode -process 130 +setExtractRCMode -engine postRoute +setAnalysisMode -cppr none +setDelayCalMode -siAware true -engine aae +Puts " RUNNING POST-ROUTE OPTIMIZATION ..." +puts " Plugin -> pre_postroute_tcl" +puts " Plugin -> pre_postroute_hold_tcl" +optDesign -postRoute -outDir RPT -prefix postroute -setup -hold +puts " Plugin -> post_postroute_tcl" +#------------------------------------------------------------- + + +um::pop_snapshot_stack +create_snapshot -name postroute -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/postroute.enc -compress +saveNetlist DBS/LEC/postroute.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/postroute} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +exit diff --git a/sky130_cds/pnr/INNOVUS/run_simple.route.tcl b/sky130_cds/pnr/INNOVUS/run_simple.route.tcl new file mode 100755 index 000000000..e7874bf0f --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_simple.route.tcl @@ -0,0 +1,70 @@ +##################################################################### +# SINGLE SCRIPT FLOW +##################################################################### + +source FF/vars.tcl +source FF/procs.tcl + +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 + + +if {$vars(restore_design)} { restoreDesign DBS/postcts_hold.enc.dat mult_seq } + +um::enable_metrics -on +puts " Plugin -> always_source_tcl" + + +#------------------------------------------------------------- +set vars(step) route +set vars(route,start_time) [clock seconds] +um::push_snapshot_stack +#------------------------------------------------------------- + +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(enable_cppr) +# - vars(track_opt) +# - vars(enable_si_aware) +# - vars(litho_driven_routing) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(multi_cut_effort) +# - vars(antenna_diode) +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(route,active_setup_views) +# - vars(route,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(route,active_setup_views) -hold $vars(route,active_hold_views) +# +setAnalysisMode -cppr both +setDelayCalMode -siAware true -engine aae + +setNanoRouteMode -routeWithLithoDriven false +setFillerMode -core "sky130_osu_sc_18T_ms__fill_1 sky130_osu_sc_18T_ms__fill_2 sky130_osu_sc_18T_ms__fill_4 sky130_osu_sc_18T_ms__fill_8 sky130_osu_sc_18T_ms__fill_16" \ + -corePrefix FILL +addFiller +Puts " RUNNING GLOBAL/DETAIL ROUTING ..." +puts " Plugin -> pre_route_tcl" +routeDesign +setExtractRCMode -engine postRoute +puts " Plugin -> post_route_tcl" +#------------------------------------------------------------- + + +um::pop_snapshot_stack +create_snapshot -name route -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/route.enc -compress +saveNetlist DBS/LEC/route.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/route} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +exit diff --git a/sky130_cds/pnr/INNOVUS/run_simple.signoff.tcl b/sky130_cds/pnr/INNOVUS/run_simple.signoff.tcl new file mode 100755 index 000000000..99b07d84a --- /dev/null +++ b/sky130_cds/pnr/INNOVUS/run_simple.signoff.tcl @@ -0,0 +1,105 @@ +##################################################################### +# SINGLE SCRIPT FLOW +##################################################################### + +source FF/vars.tcl +source FF/procs.tcl + +ff_procs::system_info +setDistributeHost -local +setMultiCpuUsage -localCpu 1 + + +if {$vars(restore_design)} { restoreDesign DBS/postroute.enc.dat mult_seq } + +um::enable_metrics -on +puts " Plugin -> always_source_tcl" + + +#------------------------------------------------------------- +set vars(step) signoff +set vars(signoff,start_time) [clock seconds] +um::push_snapshot_stack +#------------------------------------------------------------- + +###################################################################### +# Variables affecting this step: +#--------------------------------------------------------------------- +# - vars(process) +# - vars(signoff_extraction_effort) +# - vars(enable_ocv) +# - vars(enable_cppr) +###################################################################### +# Additional variables for this step: +#--------------------------------------------------------------------- +# - vars(total_c_thresh) +# - vars(relative_c_thresh) +# - vars(coupling_c_thresh) +# - vars(qrc_layer_map) +# - vars(delta_delay_threshold) +# - vars(celtic_settings) +# - vars(si_analysis_type) +# - vars(enable_aocv) +# - vars(enable_socv) +# - vars(enable_ss) "pre_signoff" +###################################################################### +# The active analysis views are controlled by the following variables: +#--------------------------------------------------------------------- +# - vars(signoff,active_setup_views) +# - vars(signoff,active_hold_views) +# +###################################################################### +# set_analysis_view -setup $vars(signoff,active_setup_views) -hold $vars(signoff,active_hold_views) +# +setDesignMode -process 130 +setExtractRCMode -coupled true -effortLevel low +setAnalysisMode -analysisType onChipVariation -cppr none +set vars(active_rc_corners) [list] +foreach view [concat [all_setup_analysis_views] [all_hold_analysis_views]] { + set corner [get_delay_corner [get_analysis_view $view -delay_corner] \ + -rc_corner] + if {[lsearch $vars(active_rc_corners) $corner] == -1 } { + lappend vars(active_rc_corners) $corner + } +} +Puts " ACTIVE RC CORNER LIST: $vars(active_rc_corners)" +set empty_corners [list] +foreach corner $vars(active_rc_corners) { + if {![file exists [get_rc_corner $corner -qx_tech_file]]} { + lappend empty_corners $corner + } +} +if {[llength $empty_corners] == 0} { + setExtractRCMode -engine postRoute -effortLevel low -coupled true +} else { + Puts " CAN'T RUN SIGNOFF EXTRACTION BECAUSE qx_tech_file IS NOT DEFINED FOR these corners: $empty_corners" + setExtractRCMode -engine postRoute -effortLevel low -coupled true +} +puts " Plugin -> pre_signoff_tcl" +Puts " RUNNING FINAL SIGNOFF ..." +extractRC +foreach corner $vars(active_rc_corners) { + rcOut -rc_corner $corner -spef $corner.spef.gz +} +timeDesign -prefix signoff -signoff -reportOnly -outDir RPT +timeDesign -prefix signoff -signoff -reportOnly -hold -outDir RPT +summaryReport -outDir RPT +verifyConnectivity -noAntenna +verify_drc +verifyMetalDensity +verifyProcessAntenna +puts " Plugin -> post_signoff_tcl" +ff_procs::source_plug post_signoff_tcl +#------------------------------------------------------------- + + +um::pop_snapshot_stack +create_snapshot -name signoff -categories design +report_metric -file RPT/metrics.html -format html +saveDesign DBS/signoff.enc -compress +saveNetlist DBS/LEC/signoff.v.gz +if {[info exists env(VPATH)]} {exec /bin/touch $env(VPATH)/signoff} +ff_procs::report_time +puts " Plugin -> final_always_source_tcl" + +exit diff --git a/sky130_cds/pnr/Makefile b/sky130_cds/pnr/Makefile new file mode 100755 index 000000000..0fd988de2 --- /dev/null +++ b/sky130_cds/pnr/Makefile @@ -0,0 +1,177 @@ +VERSION=17.10-p003_1 +VPATH=make +TCLSH=/usr/bin/tclsh +GEN_FLOW=SCRIPTS/gen_flow.tcl +SETUP_PATH=. +TOOL=innovus +ARGS=-64 -nowin +FSTEPS=init place cts postcts_hold route postroute signoff +SCRIPTS=FF +LOG=LOG +BROWSER=netscape +UPDATE=yes + +STEPS = version setup init place cts postcts_hold route postroute signoff do_cleanup +FF_START = init +FF_STOP = signoff + +all: version setup init place cts postcts_hold route postroute signoff do_cleanup + +version: + @echo "# Foundation Flows Version $(VERSION)" + +help: + @echo "===================================================" + @echo " $(VERSION) Foundation Flows" + @echo "===================================================" + @echo " Makefile Targets" + @echo "===================================================" + @echo " setup : Setup Run Directory" + @echo init : Design Import / Initialization + @echo place : Cell Placement + @echo cts : Clock Tree Synthesis + @echo postcts_hold : PostCTS Hold Fixing + @echo route : Global/Detail Route + @echo postroute : PostRoute Optimization + @echo signoff : Signoff Timing / Verify + @echo "---------------------------------------------------" + @echo " all : All design steps" + @echo " simple : Single script (all steps in a single session) - no stop/start" + @echo " single : Single script (all steps in a single session)" + @echo "===================================================" + @echo " Makefile Options" + @echo "===================================================" + @echo " VPATH : Make directory (default make)" + @echo " TOOL : INNOVUS executable (default innovus)" + @echo " ARGS : INNOVUS arguments (default -nowin -64)" + @echo " UPDATE : Update scripts (default yes)" + @echo " SCRIPTS : Script directory (default FF)" + @echo " LOG : Logfile directory (default LOG)" + @echo "===================================================" + + +simple: setup + FF_STOP=$(FF_STOP); VPATH=$(VPATH); export VPATH; $(TOOL) -init $(SCRIPTS)/INNOVUS/run_simple.tcl -log $(LOG)/simple.log $(ARGS) + + +single: setup + FF_STOP=$(FF_STOP); VPATH=$(VPATH); export VPATH; $(TOOL) -init $(SCRIPTS)/INNOVUS/run_all.tcl -log $(LOG)/single.log $(ARGS) + +setup: + @/bin/mkdir -p $(VPATH) $(LOG) + @/bin/touch $(VPATH)/$@ + +init: setup + @mkdir -p $(LOG); + @if [ "$(UPDATE)" = "yes" ] ; then \ + /usr/bin/tclsh SCRIPTS/gen_flow.tcl -m flat -d FF -v 17.1.0 -s . -y none -n init ; \ + fi + VPATH=$(VPATH); export VPATH; $(TOOL) -init $(SCRIPTS)/INNOVUS/run_init.tcl -log $(LOG)/init.log -overwrite $(ARGS) +place: init + @mkdir -p $(LOG); + @if [ "$(UPDATE)" = "yes" ] ; then \ + /usr/bin/tclsh SCRIPTS/gen_flow.tcl -m flat -d FF -v 17.1.0 -s . -y none -n place ; \ + fi + VPATH=$(VPATH); export VPATH; $(TOOL) -init $(SCRIPTS)/INNOVUS/run_place.tcl -log $(LOG)/place.log -overwrite $(ARGS) +cts: place + @mkdir -p $(LOG); + @if [ "$(UPDATE)" = "yes" ] ; then \ + /usr/bin/tclsh SCRIPTS/gen_flow.tcl -m flat -d FF -v 17.1.0 -s . -y none -n cts ; \ + fi + VPATH=$(VPATH); export VPATH; $(TOOL) -init $(SCRIPTS)/INNOVUS/run_cts.tcl -log $(LOG)/cts.log -overwrite $(ARGS) +postcts_hold: cts + @mkdir -p $(LOG); + @if [ "$(UPDATE)" = "yes" ] ; then \ + /usr/bin/tclsh SCRIPTS/gen_flow.tcl -m flat -d FF -v 17.1.0 -s . -y none -n postcts_hold ; \ + fi + VPATH=$(VPATH); export VPATH; $(TOOL) -init $(SCRIPTS)/INNOVUS/run_postcts_hold.tcl -log $(LOG)/postcts_hold.log -overwrite $(ARGS) +route: postcts_hold + @mkdir -p $(LOG); + @if [ "$(UPDATE)" = "yes" ] ; then \ + /usr/bin/tclsh SCRIPTS/gen_flow.tcl -m flat -d FF -v 17.1.0 -s . -y none -n route ; \ + fi + VPATH=$(VPATH); export VPATH; $(TOOL) -init $(SCRIPTS)/INNOVUS/run_route.tcl -log $(LOG)/route.log -overwrite $(ARGS) +postroute: route + @mkdir -p $(LOG); + @if [ "$(UPDATE)" = "yes" ] ; then \ + /usr/bin/tclsh SCRIPTS/gen_flow.tcl -m flat -d FF -v 17.1.0 -s . -y none -n postroute ; \ + fi + VPATH=$(VPATH); export VPATH; $(TOOL) -init $(SCRIPTS)/INNOVUS/run_postroute.tcl -log $(LOG)/postroute.log -overwrite $(ARGS) +signoff: postroute + @mkdir -p $(LOG); + @if [ "$(UPDATE)" = "yes" ] ; then \ + /usr/bin/tclsh SCRIPTS/gen_flow.tcl -m flat -d FF -v 17.1.0 -s . -y none -n signoff ; \ + fi + VPATH=$(VPATH); export VPATH; $(TOOL) -init $(SCRIPTS)/INNOVUS/run_signoff.tcl -log $(LOG)/signoff.log -overwrite $(ARGS) +debug_%: + VPATH=$(VPATH); export STEP=$* ; export VPATH; $(TOOL) -init $(SCRIPTS)/INNOVUS/run_debug.tcl -log $(LOG)/$@.log -win $(ARGS:-nowin=) + +lec_%: + export STEP=$* ; lec -64 -xl -Dofile $(SCRIPTS)/INNOVUS/run_lec.tcl -NOGui -LOGfile $(LOG)/$@.log + +help_%: + /usr/bin/tclsh $(GEN_FLOW) -H $* + +.PHONY: clean + +clean: + /bin/mv *.rpt RPT ;\ + /bin/rm -fr extLogDir* __qrc.log *cts_trace *.rpt.old *delete* placementReports* *.rguide *_mmmc \ + *_constr.pt .constr* .FE* .routing* .timing_file* .tdrlog* + rm -rf make/* + rm -rf LOG DBS RPT + rm -rf innovus.cmd* + rm -rf innovus.log* + rm -rf checkDesign + rm -rf timingReports + rm -f final.gds + rm -f final.v + +do_cleanup: signoff + $(MAKE) clean + /bin/touch $(VPATH)/$@ + +reset : version + /bin/rm -fr $(VPATH)/* extLogDir* __qrc.log *cts_trace *.rpt.old *delete* placementReports* *.rguide *_mmmc + @for file in $(STEPS) ; \ + do \ + if [ -r $(VPATH)/$$file ] ; then \ + /bin/rm $(VPATH)/$$file ; \ + fi \ + done + +block_%: setup + @if [ "x$*" = "xsingle" ] ; then \ + ff_stop=$(FF_STOP); \ + target="$@ (from: $(FF_START) to: $(FF_STOP))"; \ + else \ + ff_stop=$* ; \ + target=$@; \ + fi; \ + if [ -r $(VPATH)/.RUNNING ] ; then \ + echo "INFO: A build seems to be running already... check $(VPATH)/.RUNNING file and remove that file if the process is dead" ; \ + /bin/head -1 $(VPATH)/.RUNNING ; \ + exit -1 ; \ + else \ + /bin/rm -f $(VPATH)/block_$${ff_stop}.DONE $(VPATH)/block_$${ff_stop}.FAILED $(VPATH)/block_$${ff_stop}.PASS ; \ + (echo "# Started building $${target} at "`/bin/date`" on "`/bin/hostname`" PID: $$$$" ; $(MAKE) $(TARGET) ) &>$(VPATH)/.RUNNING ; \ + if [ -r $(VPATH)/$${ff_stop} ] ; then \ + if [ -r $(VPATH)/.RUNNING ] ; then \ + /bin/mv $(VPATH)/.RUNNING $(VPATH)/block_$${ff_stop}.PASS ; \ + /bin/touch $(VPATH)/block_$${ff_stop} ; \ + /bin/touch $(VPATH)/block_$${ff_stop}.DONE ; \ + else \ + echo "# Something did not work properly" > $(VPATH)/block_$${ff_stop}.FAILED ; \ + /bin/touch $(VPATH)/block_$${ff_stop}.DONE ; \ + exit -1; \ + fi ; \ + else \ + if [ -r $(VPATH)/.RUNNING ] ; then \ + /bin/mv $(VPATH)/.RUNNING $(VPATH)/block_$${ff_stop}.FAILED ; \ + else \ + echo "# Something did not work properly" > $(VPATH)/block_$${ff_stop}.FAILED ; \ + fi ; \ + /bin/touch $(VPATH)/block_$${ff_stop}.DONE ; \ + exit -1 ; \ + fi ; \ + fi diff --git a/sky130_cds/pnr/PLUG/INNOVUS/always_source.tcl b/sky130_cds/pnr/PLUG/INNOVUS/always_source.tcl new file mode 100755 index 000000000..2ac9973f3 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/always_source.tcl @@ -0,0 +1,9 @@ +#################################################################################### +# ALWAYS_SOURCE PLUG-IN +##################################################################################### +# +# This plug-in script is called from all flow scripots after loading the setup.tcl +# but after to loading the design data. It can be used to set variables that affect +# non-persistent information +# +##################################################################################### diff --git a/sky130_cds/pnr/PLUG/INNOVUS/post_cts.tcl b/sky130_cds/pnr/PLUG/INNOVUS/post_cts.tcl new file mode 100755 index 000000000..ed1d55aa8 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/post_cts.tcl @@ -0,0 +1,11 @@ +#################################################################################### +# POST-CTS PLUG-IN +##################################################################################### +# +# This plug-in script is called after clockDesign from the run_cts.tcl script. +# It can be used to adjust IO latencies, update to postcts clock uncertainties, etc. +# +##################################################################################### +set_ccopt_property balance_mode full +setOptMode -usefulSkewCCOpt medium +#ccopt_design diff --git a/sky130_cds/pnr/PLUG/INNOVUS/post_init.tcl b/sky130_cds/pnr/PLUG/INNOVUS/post_init.tcl new file mode 100755 index 000000000..06de0ed83 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/post_init.tcl @@ -0,0 +1,105 @@ +#################################################################################### +# POST-INIT PLUG-IN +#################################################################################### +# +# This plug-in script is called after design import from the run_init.tcl script. +# +# -------------------------------------------------------------------------------- +# Can be used for various floorplan related tasks, like: +# - Die/core boundary +# - placement of hard macros/blocks +# - power domain size and clearence surrounding to it +# - Placement and routing blockages in the floorplan +# - IO ring creation +# - PSO planning +# -------------------------------------------------------------------------------- +# Specifically, this example includes tasks related to the LP/CPF foundation flow +# including power domain modification and power shut-off planning. The examples +# included here operate based on variables (vars array) defined in the +# OVERLAY/lp_config.tcl file +# +if {[info exists vars(cpf_file)]} { + +# -------------------------------------------------------------------------------- +# Modify power domains +# -------------------------------------------------------------------------------- +# The 'modify_power_domains' procedure is included with the foundation flows +# to help automate power domain modification. To enable this, please set the +# appropriate variables in the lp_config.tcl and uncomment the following command +# + +# ff_modify_power_domains + +# -------------------------------------------------------------------------------- +# Power switch insertion +# -------------------------------------------------------------------------------- +# The 'add_power_switches' procedure is included with the foundation flows +# to cover common power switch insertion scenarios. To use, set the appropriate +# variables in the lp_config.tcl file and uncomment the following command. +# -------------------------------------------------------------------------------- +# NOTE: This procedure will NOT COVER THE ALL THE OPTIONS in addPowerSwitch +# For more complicated scenarios, please manually add the addPowerSwitch command +# here with the necessary options. +# -------------------------------------------------------------------------------- + +# ff_add_power_switches + +} + +# Floorplan (from long time ago in a galaxy far, far away) +floorplan -r 1.0 0.60 40 40 40 40 + +# Make VDD/VSS power connectors +globalNetConnect VSS -type pgpin -pin gnd -inst * +globalNetConnect VDD -type pgpin -pin vdd -inst * +# Not sure I need this +#globalNetConnect VDD –type tiehi +#globalNetConnect VSS –type tielo + +# Add Ring +setAddRingMode -ring_target default -extend_over_row 0 -ignore_rows 0 -avoid_short 0 -skip_crossing_trunks none -stacked_via_top_layer met2 -stacked_via_bottom_layer met1 -via_using_exact_crossover_size 1 -orthogonal_only true -skip_via_on_pin { standardcell } -skip_via_on_wire_shape { noshape } +addRing -nets {VDD VSS} -type core_rings -follow core -layer {top met1 bottom met1 left met2 right met2} -width {top 7.2 bottom 7.2 left 7.2 right 7.2} -spacing {top 1.8 bottom 1.8 left 1.8 right 1.8} -offset {top 1.8 bottom 1.8 left 1.8 right 1.8} -center 0 -extend_corner {} -threshold 0 -jog_distance 0 -snap_wire_center_to_grid None + +####Some settings for power grid: +set vars(layers) "0 1" +# LI1 +set vars(1,width) 0.61 +set vars(1,space) 6.05 +set vars(1,pitch) 13.32 +set vars(1,direction) horizontal +set vars(1,bottom_via_layer) 0 +set vars(1,offset) -0.1525 +# M1 +set vars(0,width) 0.61 +set vars(0,space) 6.05 +set vars(0,pitch) 13.32 +set vars(0,direction) horizontal +set vars(0,bottom_via_layer) 0 +set vars(0,offset) -0.1525 + + +foreach layer $vars(layers) { + set sp1 $vars($layer,space) + set sp2 $vars($layer,space) + if {$vars($layer,direction)== "vertical"} { + set start_edge left + } else { + set start_edge bottom + } + setAddStripeMode -stacked_via_top_layer $layer -stacked_via_bottom_layer $vars($layer,bottom_via_layer) -break_at none -orthogonal_only false + # add stripe command + addStripe \ + -layer $layer \ + -width $vars($layer,width) \ + -spacing [list $sp1 $sp2] \ + -set_to_set_distance $vars($layer,pitch) \ + -start_offset [expr $vars($layer,offset)*2] \ + -direction $vars($layer,direction) \ + -start_from $start_edge \ + -nets {VDD VSS} +} + +# Connect to power +setSrouteMode -viaConnectToShape { noshape } +sroute -connect { blockPin padPin padRing corePin floatingStripe } -layerChangeRange { met5(5) met1(1) } -blockPinTarget { nearestTarget } -padPinPortConnect { allPort oneGeom } -padPinTarget { nearestTarget } -corePinTarget { firstAfterRowEnd } -floatingStripeTarget { blockring padring ring stripe ringpin blockpin followpin } -allowJogging 1 -crossoverViaLayerRange { met1(1) met5(5) } -nets { VDD VSS } -allowLayerChange 1 -blockPin useLef -targetViaLayerRange { met1(1) met5(5) } + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/post_place.tcl b/sky130_cds/pnr/PLUG/INNOVUS/post_place.tcl new file mode 100755 index 000000000..bf88b441c --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/post_place.tcl @@ -0,0 +1,28 @@ +################################################################################### +# POST-PLACE PLUG-IN +################################################################################### +# +# This plug-in script is called after placeDesign from the run_place.tcl script. +# +# Example tasks include: +# - standard cell rail creation +# +################################################################################### +# +# Standard cell rail creation for power domains if they are created/modified +# during the flow +# ----------------------------------------------------------------------------------- + +#sroute \ +# -noBlockPins \ +# -noPadRings \ +# -noPadPins \ +# -noStripes \ +# -straightConnections { straightWithDrcClean straightWithChanges } \ +# -nets {

} \ +# -powerDomains { } \ +# -targetViaTopLayer \ +# -crossoverViaTopLayer \ +# -verbose + +checkPlace diff --git a/sky130_cds/pnr/PLUG/INNOVUS/post_postcts.tcl b/sky130_cds/pnr/PLUG/INNOVUS/post_postcts.tcl new file mode 100755 index 000000000..2a0680b79 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/post_postcts.tcl @@ -0,0 +1,8 @@ +################################################################################## +# POST-POST_CTS PLUG-IN +################################################################################## +# +# This plug-in script is called after optDesign -postCTS optimization from +# the run_postcts.tcl script. +# +################################################################################## diff --git a/sky130_cds/pnr/PLUG/INNOVUS/post_postcts_hold.tcl b/sky130_cds/pnr/PLUG/INNOVUS/post_postcts_hold.tcl new file mode 100755 index 000000000..730c386f9 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/post_postcts_hold.tcl @@ -0,0 +1,8 @@ +################################################################################## +# POST-POST_CTS_HOLD PLUG-IN +################################################################################## +# +# This plug-in script is called after optDesign -postCts -hold from the +# run_postcts_hold.tcl script. +# +################################################################################## diff --git a/sky130_cds/pnr/PLUG/INNOVUS/post_postroute.tcl b/sky130_cds/pnr/PLUG/INNOVUS/post_postroute.tcl new file mode 100755 index 000000000..feaa5be9a --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/post_postroute.tcl @@ -0,0 +1,9 @@ +################################################################################## +# POST-POST_ROUTE PLUG-IN +################################################################################## +# +# This plug-in script is called after optDesign -postRoute from the +# run_postroute.tcl script. +# +################################################################################## + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/post_postroute_hold.tcl b/sky130_cds/pnr/PLUG/INNOVUS/post_postroute_hold.tcl new file mode 100755 index 000000000..80731bd89 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/post_postroute_hold.tcl @@ -0,0 +1,9 @@ +################################################################################## +# POST-POST_ROUTE_HOLD PLUG-IN +################################################################################## +# +# This plug-in script is called after optDesign -postRoute -hold from the +# run_postroute_hold.tcl script. +# +################################################################################## + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/post_postroute_si.tcl b/sky130_cds/pnr/PLUG/INNOVUS/post_postroute_si.tcl new file mode 100755 index 000000000..381966b51 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/post_postroute_si.tcl @@ -0,0 +1,9 @@ +################################################################################## +# POST-POST_ROUTE_SI PLUG-IN +################################################################################## +# +# This plug-in script is called after optDesign -postRoute -si from the +# run_postroute_si.tcl script. +# +################################################################################## + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/post_postroute_si_hold.tcl b/sky130_cds/pnr/PLUG/INNOVUS/post_postroute_si_hold.tcl new file mode 100755 index 000000000..2b199e005 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/post_postroute_si_hold.tcl @@ -0,0 +1,9 @@ +################################################################################## +# POST-POST_ROUTE_SI_HOLD PLUG-IN +################################################################################## +# +# This plug-in script is called after optDesign -postRoute -hold -si from the +# run_postroute_si_hold.tcl script ... +# +################################################################################## + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/post_prects.tcl b/sky130_cds/pnr/PLUG/INNOVUS/post_prects.tcl new file mode 100755 index 000000000..da4520663 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/post_prects.tcl @@ -0,0 +1,47 @@ +################################################################################## +# POST-PRE_CTS PLUG-IN +################################################################################## +# +# This plug-in is called after optDesign -preCTS from the run_prects.tcl flow +# script. The user can use this plug-in for: +# +# -------------------------------------------------------------------------------- +# - Secondary power pin routing for low power cells +# - State retention flops +# - Always-on-buffers +# - Level-shifters +# - Check the connectivity and geometry on these nets +# -------------------------------------------------------------------------------- +# Below are some example commands ... +#################################################################################### + +#################################################################################### +# Secondary power routing for SRPG/AON/LVL cells using nanoroute ... +# ... it requires vars(secondary_pg,cell_pin_pairs) to be defined +# ... in the OVERLAY/lp_config.tcl +# NOTE: In the early stage of the flow (before CTS) if user wants to estimate the +# routing resource impact due to secondary pg pin routing, he can do secondary pg pin +# connection before CTS OR if user enables "vars(route_secondary_pg_nets)" as true in +# OVERLAY/lp_config.tcl then same would be done before the routing stage also. +#################################################################################### +#ff_route_secondary_pg_nets + +#################################################################################### +## Check for Geometry and connectivity violations on power nets +#################################################################################### +#clearDrc + +#verifyConnectivity \ +# -type special \ +# -noAntenna \ +# -nets { VSS VDD } \ +# -report $vars(rpt_dir)/$vars(design).conn.rpt + +#verifyGeometry \ +# -allowPadFillerCellsOverlap \ +# -allowRoutingBlkgPinOverlap \ +# -allowRoutingCellBlkgOverlap \ +# -error 1000 \ +# -report $vars(rpt_dir)/$vars(design).geom.rpt + +#clearDrc diff --git a/sky130_cds/pnr/PLUG/INNOVUS/post_route.tcl b/sky130_cds/pnr/PLUG/INNOVUS/post_route.tcl new file mode 100755 index 000000000..53095cc90 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/post_route.tcl @@ -0,0 +1,22 @@ +################################################################################## +# POST-ROUTE PLUG-IN +################################################################################## +# +# This plug-in script is called after routeDesign from the run_route.tcl flow script. +# +# -------------------------------------------------------------------------------- +# Example usage may be power switch optimization: +# -------------------------------------------------------------------------------- + +#set vars(switch_cell_file) $vars(data_root)/power_switch_cell.txt +#set vars(switch_cell_ir_drop) 0.1 + +#optPowerSwitch -readPowerSwitchCell $vars(switch_cell_file) \ +# -effort high \ +# -commit 1 \ +# -maxSwitchIRDrop $vars(switch_cell_ir_drop) \ +# -reportFile $vars(rpt_dir)/deleted_switch_cells.txt + +################################################################################## + + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/post_signoff.tcl b/sky130_cds/pnr/PLUG/INNOVUS/post_signoff.tcl new file mode 100755 index 000000000..212775730 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/post_signoff.tcl @@ -0,0 +1,10 @@ +################################################################################## +# POST-SIGNOFF PLUG-IN +################################################################################## +# +# This plug-in script is called after timeDesign -signoff from the run_signoff.tcl +# flow script. +# +################################################################################## + +source tapeout.tcl diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_cts.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_cts.tcl new file mode 100755 index 000000000..798ab43dc --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_cts.tcl @@ -0,0 +1,22 @@ +################################################################################## +# PRE_CTS PLUG-IN +################################################################################## +# +# This plug-in script is called before clockDesign from the run_cts.tcl flow script. +# +################################################################################## + +#setCTSMode -topPreferredLayer 7 \ +# -bottomPreferredLayer 3 \ +# -preferredExtraSpace 2 +# for 3 metal LEF +create_route_type -bottom_preferred_layer 1 -name MET1 +create_route_type -top_preferred_layer 5 -name MET5 +set_ccopt_property route_type MET1 +set_ccopt_property route_type MET5 +setCTSMode -routeBottomPreferredLayer 1 -routeLeafBottomPreferredLayer 1 -routeTopPreferredLayer 5 -routeLeafTopPreferredLayer 5 + + +set_interactive_constraint_modes setup_func_mode + +#create_clock -name clk -period 2.8 diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_init.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_init.tcl new file mode 100755 index 000000000..5f2cfa94f --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_init.tcl @@ -0,0 +1,14 @@ +#################################################################################### +# PRE-INIT PLUG-IN +#################################################################################### +# +# This plug-in script is called before initializing the design database from the +# run_init.tcl flow script. +# +#################################################################################### +# +# Ex: Below command used for inserting buffers on tie-high/tie-low assign statements +# +#----------------------------------------------------------------------------------- +# +#setImportMode -bufferTieAssign $vars(buffer_tie_assign) diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_partition.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_partition.tcl new file mode 100755 index 000000000..e3ba1ced8 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_partition.tcl @@ -0,0 +1,35 @@ +#################################################################################### +# PRE-ASSEMBLE PLUG-IN +#################################################################################### +# +# This plug-in script is called before prior the assemble_design from the +# run_assemble.tcl flow script. +# +#################################################################################### +# +# Assign partition pins +# Set pin-placement parameters for pin-assignment: +# - pinDepth, to avoid min-area violations when +# DRC is run at the partition-level +# - pinPitch and pin-layers set to single layer +# for each side (T/B/L/R) +# Fix the pin locations after assignment +# +# ----------------------------------------------------------------------------- +# +#foreach ptn $vars(partition_list) { +# foreach layer [list 2 3 4 5] { +# # Sets the pin depth to 0.4um to satsify min area rule +# setLayerPinDepth -cell $ptn -layer $layer -depth 0.4 +# } +# # M6 is thick and requires a larger area +# setLayerPinDepth -cell $ptn -layer 6 -depth 1.5 +# setMinPinSpacingOnEdge -cell $ptn -spacing 2 +# +# setAllowedPinLayersOnEdge -cell $ptn -edge T -layer [list 2 4] +# setAllowedPinLayersOnEdge -cell $ptn -edge B -layer [list 2 4] +# setAllowedPinLayersOnEdge -cell $ptn -edge L -layer [list 3 5] +# setAllowedPinLayersOnEdge -cell $ptn -edge R -layer [list 3 5] +#} + +#assignPtnPin diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_place.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_place.tcl new file mode 100755 index 000000000..ef660a7a5 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_place.tcl @@ -0,0 +1,15 @@ +#################################################################################### +# PRE-PLACE PLUG-IN +#################################################################################### +# +# This plug-in script is called before placeDesign from the run_place.tcl flow +# script. +# +#################################################################################### +# Example tasks include: +# - Power planning related tasks which includes +# - Power planning for power domains (ring/strap creations) +# - Power Shut-off cell power hookup +############################################################################################ +setCTSMode -bottomPreferredLayer 1 -topPreferredLayer 5 + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_place_checks.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_place_checks.tcl new file mode 100755 index 000000000..850752c07 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_place_checks.tcl @@ -0,0 +1,47 @@ +##################################################################################### +# pre place checks +##################################################################################### + +##################################################################################### +# Check DESIGN +##################################################################################### +checkDesign -netlist -physicalLibrary -timingLibrary -powerGround -outDir $vars(rpt_dir) +summaryReport -noHtml -outfile $vars(rpt_dir)/$vars(design).summaryReport.rpt +reportGateCount -module $vars(design) -stdCellOnly -level 100 -outfile $vars(rpt_dir)/$vars(design).stdgatecount.rpt +reportGateCount -module $vars(design) -level 100 -outfile $vars(rpt_dir)/$vars(design).gatecount.rpt +reportNetStat + +################################################################################### +# Timing library checks +################################################################################### +setAnalysisMode -checkType setup +reportPowerDomain -file $vars(rpt_dir)/setup_libs.rpt +setAnalysisMode -checkType hold +reportPowerDomain -file $vars(rpt_dir)/hold_libs.rpt +setAnalysisMode -checkType setup + +##################################################################################### +# Power domain checks +##################################################################################### +foreach PD $vars(power_domains) { +reportPowerDomain -powerDomain $PD -file $vars(rpt_dir)/$PD.rpt -shifter -isoInst -pgNet -bindLib +} + +################################################################################### +# Isolation checks +################################################################################### +foreach PD $vars(power_domains) { +reportIsolation -fromPowerDomain $PD -outfile $vars(rpt_dir)/from_$PD\_iso.rpt -highlight +} + +verifyPowerDomain -gconn -xNetPD -isoNetPD -bind + +################################################################################### +# Check timing +################################################################################### +set_global report_timing_format {instance arc cell net fanout load slew delay incr_delay arrival required} +check_timing -verbose > $vars(rpt_dir)/check_timing.rpt + +timeDesign -prePlace -expandedViews -numPaths 1000 -outDir $vars(rpt_dir) + +puts "### End of pre-place checks" diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_postcts.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_postcts.tcl new file mode 100755 index 000000000..a14d4b4f8 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_postcts.tcl @@ -0,0 +1,9 @@ +################################################################################## +# PRE-POST_CTS PLUG-IN +################################################################################## +# +# This plug-in script is called before optDesign -postCTS fixing from the +# run_postcts.tcl flow script. +# +################################################################################## + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_postcts_hold.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_postcts_hold.tcl new file mode 100755 index 000000000..8ca7cd890 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_postcts_hold.tcl @@ -0,0 +1,9 @@ +################################################################################## +# PRE-POST_CTS_HOLD PLUG-IN +################################################################################## +# +# This plug-in script is called before optDesign -postCTS -hold the run_postcts.tcl +# flow script. +# +################################################################################## + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_postroute.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_postroute.tcl new file mode 100755 index 000000000..b73fda1be --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_postroute.tcl @@ -0,0 +1,9 @@ +################################################################################## +# PRE-POST_ROUTE PLUG-IN +################################################################################## +# +# This plug-in script is called before optDesign -postRoute from the run_postroute.tcl +# flow script. +# +################################################################################## + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_postroute_hold.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_postroute_hold.tcl new file mode 100755 index 000000000..58b56695a --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_postroute_hold.tcl @@ -0,0 +1,9 @@ +################################################################################## +# PRE-POST_ROUTE PLUG-IN +################################################################################## +# +# This plug-in script is called before optDesign -postRoute -hold from the +# run_postroute_hold.tcl flow script. +# +################################################################################## + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_postroute_si.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_postroute_si.tcl new file mode 100755 index 000000000..c83951724 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_postroute_si.tcl @@ -0,0 +1,9 @@ +################################################################################## +# PRE-POST_ROUTE_SI PLUG-IN +################################################################################## +# +# This plug-in script is called before optDesign -postRoute -si from the +# run_postroute_si.tcl flow script. +# +################################################################################## + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_postroute_si_hold.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_postroute_si_hold.tcl new file mode 100755 index 000000000..c131cdda4 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_postroute_si_hold.tcl @@ -0,0 +1,9 @@ +################################################################################## +# PRE-POST_ROUTE_SI_HOLD PLUG-IN +################################################################################## +# +# This plug-in script is called before optDesign -postRoute -hold -si from the +# run_postroute_si_hold.tcl flow script. +# +################################################################################## + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_prects.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_prects.tcl new file mode 100755 index 000000000..a380fd735 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_prects.tcl @@ -0,0 +1,17 @@ +################################################################################## +# PRE-PRE_CTS PLUG-IN +################################################################################## +# +# This plug-in script is called before optDesign -preCTS from the run_prects.tcl +# flow script. +# +# -------------------------------------------------------------------------------- +# By default SOCE does always-on-net synthesis for SRPG control signal and PSO enable +# signals as part of optDesign -preCTS, but this can be manually done for specific nets if +# necessary. To do this, define the appropriate variables in the lp_config.tcl file +# and uncomment the following command +# -------------------------------------------------------------------------------- + +#ff_buffer_always_on_nets + +################################################################################## diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_route.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_route.tcl new file mode 100755 index 000000000..0426ab223 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_route.tcl @@ -0,0 +1,9 @@ +################################################################################## +# PRE-ROUTE PLUG-IN +################################################################################## +# +# This plug-in script is called before routeDesign from the run_route.tcl flow +# script. +# +################################################################################## + diff --git a/sky130_cds/pnr/PLUG/INNOVUS/pre_signoff.tcl b/sky130_cds/pnr/PLUG/INNOVUS/pre_signoff.tcl new file mode 100755 index 000000000..13793b423 --- /dev/null +++ b/sky130_cds/pnr/PLUG/INNOVUS/pre_signoff.tcl @@ -0,0 +1,9 @@ +################################################################################## +# PRE-POST_ROUTE_SI PLUG-IN +################################################################################## +# +# This plug-in script is called before timeDesign -signoff -si from the +# run_signoff.tcl flow script. +# +################################################################################## + diff --git a/sky130_cds/pnr/README.INNOVUS b/sky130_cds/pnr/README.INNOVUS new file mode 100755 index 000000000..0bf57454e --- /dev/null +++ b/sky130_cds/pnr/README.INNOVUS @@ -0,0 +1,58 @@ + + + Foundation Flows + ---------------------- + +The scripts provided here are intended to be used by Cadence AEs as the starting +point for assisting customers in building an implementation environment for +Innovus. They provide a working example containing guidelines and recomendations +for command sequences and options. Some customization is expected as each customer +and design will have unique requirements. The goal was to capture a general methodology +from which to build upon. + + ------------------------------------ + +The foundation flows reside in the SCRIPTS directory (created by writeFlowTemplate). +This directory can be renamed and/or moved but the contents within the SCRIPTS +directory must remian unchanged. The scripts directory is accessed by the +variable "vars(script_root) " in the setup.tcl. + +The setup.tcl is the main input file to the foundation flow. It defines all +the input data required to run each of the foundation flows. + +Additionally, an innovus_config.tcl must be created to set flow variables, +desired command options, and optional plug-ins. + +Finally, for LP/CPF flows, an additional config file (lp_config.tcl) can +optionally be used to help automate some low power related tasks. + + ------------------------------------ + +The TEMPLATES directory contains templates for all of these files which can +be manually copied and edited: + + TEMPLATES/INNOVUS/setup.tcl + TEMPLATES/INNOVUS/innovus_config.tcl + TEMPLATES/INNOVUS/lp_config.tcl + +There is also a utility that can be used to generate these files based on +existing design data. To generate, run Innovus, load an initial database, +and 'source SCRIPTS/gen_setup.tcl' or run the new command generateFFSetupFile. + +This will generate a *.auto.tcl files which can be reviewed/edited +and then renamed. + + ------------------------------------ + +The EXAMPLES directory contains some example configuation files as well as +some sample plug-ins. Please check README in the EXAMPLES directory to run the example. + + ------------------------------------ + +To generate the foundation flow scripts based on your setup , do the following: + + tclsh /SCRIPTS/gen_flow.tcl -m + + where = single step, step range, or 'all' + +To execute the flow, run 'make ' diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/Makefile.partition b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/Makefile.partition new file mode 100755 index 000000000..99239f427 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/Makefile.partition @@ -0,0 +1,45 @@ +VERSION=17.10-p003_1 +VPATH=./make +SLEEPTIME = 10 + +REALTARGET=$(TARGET:single=$(FF_STOP)) + +BLOCK_TARGETS = $(BLOCKS:=.$(REALTARGET)) + +blocks: blocks_$(REALTARGET) + +blocks_$(REALTARGET): $(BLOCK_TARGETS) + @err=0 ;\ + for b in $(BLOCKS) ; do \ + echo "INFO: Waiting for block $$b completion...." ;\ + while [ ! -r $$b/$(VPATH)/block_$(REALTARGET).DONE ] ; do sleep $(SLEEPTIME) ; done ; \ + if [ -r $$b/$(VPATH)/block_$(REALTARGET).FAILED ] ; then \ + echo "ERROR: Block $$b failed" ;\ + /bin/cat $$b/$(VPATH)/block_$(REALTARGET).FAILED ; \ + /bin/rm -f $$b/$(VPATH)/block_$(REALTARGET).DONE ; \ + err=1 ; \ + else \ + echo "INFO: Block $$b Completed" ;\ + /bin/cat $$b/$(VPATH)/block_$(REALTARGET).PASS ; \ + /bin/touch $(VPATH)/$$b.$(REALTARGET) ; \ + fi ;\ + done ;\ + if [ $$err = 0 ] ; then \ + /bin/touch $(VPATH)/$@ ;\ + fi ;\ + exit $$err + + +%.$(REALTARGET) : + @cd $* ; \ + if [ -r $(VPATH)/.RUNNING ] ; then \ + echo "INFO: Skipping block $* which seems to still be running (see `pwd`/make/.RUNNING)" ; \ + /bin/head -1 $(VPATH)/.RUNNING ;\ + exit 1 ;\ + else \ + echo "INFO: Processing block $*..." ;\ + $(SUBMIT) $(MAKE) VPATH=$(VPATH) block_$(REALTARGET) TARGET=$(TARGET) ;\ + fi + +$(BLOCKS): + VPATH=$(VPATH); @$(MAKE) $@.$(REALTARGET) diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/check_vars.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/check_vars.tcl new file mode 100755 index 000000000..1a6577bc8 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/check_vars.tcl @@ -0,0 +1,443 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +if {[info exists vars(check_vars)] && $vars(check_vars)} { + + set op [open $vars(script_dir)/check_vars.rpt w] + + if {![info exists vars(opconds)]} { + set vars(opconds) "" + } + + set valid_prefixes "\ + $vars(library_sets) \ + $vars(rc_corners) \ + $vars(opconds) \ + $vars(delay_corners) \ + $vars(constraint_modes) \ + $vars(setup_analysis_views) \ + $vars(hold_analysis_views) \ + library_set \ + cdb_file \ + echo_file \ + timelib \ + rc_corner \ + delay_corner \ + constraint_mode \ + welltaps \ + filler_cells \ + mail \ + partition \ + init \ + place \ + prects \ + cts \ + postcts \ + postcts_hold \ + route \ + postroute \ + postroute_hold \ + postroute_si \ + postroute_si_hold \ + signoff \ + assemble \ + tie_cells \ + filler_cells \ + welltaps \ + secondary_pg \ + always_on_nets \ + lsf custom rsh \ + tags \ + " + + set valid_suffixes "\ + timing si min max\ + library_set \ + rc_corner \ + P V T cap_table qx_tech_file qx_lib_dir\ + def_res_factor def_cap_factor def_clk_cap_factor \ + det_res_factor det_cap_factor det_clk_cap_factor \ + xcap_factor \ + pre_route_res_factor pre_route_clk_res_factor pre_route_cap_factor pre_route_clk_cap_factor \ + post_route_res_factor post_route_clk_res_factor post_route_cap_factor post_route_clk_cap_factor + post_route_xcap_factor \ + scale_tcl \ + delay_corner \ + data_cell_late data_cell_early data_net_late data_net_early \ + clock_cell_late clock_cell_early clock_net_late clock_net_early \ + cell_check_late cell_check_early \ + opcond opcond_library power_domains \ + constraint_mode \ + derate_tcl \ + pre_cts_sdc post_cts_sdc incr_cts_sdc \ + active_setup_views active_hold_views \ + pre_endcap post_endcap \ + cell_interval row_offset checkerboard verify_rule \ + max_gap cell_interval checker_board \ + max_distance max_fanout max_tran max_delay \ + always_on_buffers cell_pin_pairs nets non_default_rule \ + switchable switch_type checker_board back_to_back_chain \ + loop_back_at_end check_height verify_rows enable_chain \ + pre_tcl post_tcl replace_tcl skip \ + to steps library_file \ + script queue host_list args resource \ + verbose verbosity_level \ + welltaps, tie_cells, filler_cells \ + pac_mode ilm_dir lef_file \ + starting_dbs assemble_dbs \ + latency_sdc cts_spec \ + edi_config_tcl qor_tcl \ + rpt_dir skip pre_tcl post_tcl \ + " + + if {[info exists vars(power_domains)]} { + append valid_prefixes $vars(power_domains) + append valid_suffixes "bbox max_gap rs_exts" + } + + set valid_midfixes "\ + set_distribute_host \ + set_multi_cpu_usage \ + set_distribute_host \ + set_multi_cpu_usage \ + set_rc_factor \ + derate_timing \ + create_rc_corner \ + create_library_set \ + create_delay_corner \ + create_constraint_mode \ + create_analysis_view \ + update_delay_corner \ + update_library_set \ + derate_timing \ + set_default_view \ + set_power_analysis_mode \ + load_config \ + load_floorplan \ + generate_tracks \ + load_cpf \ + commit_cpf \ + read_activity_file \ + specify_ilm \ + load_ilm_non_sdc_file \ + initialize_timing \ + load_scan \ + specify_spare_gates \ + set_dont_use \ + set_max_route_layer \ + set_design_mode \ + insert_welltaps_endcaps \ + load_config \ + time_design \ + check_design \ + check_timing \ + report_power_domains \ + set_distribute_host \ + set_multi_cpu_usage \ + restore_design \ + initialize_step \ + set_design_mode \ + set_delay_cal_mode \ + set_place_mode \ + set_opt_mode \ + cleanup_specify_clock_tree \ + specify_clock_tree \ + specify_jtag \ + place_jtag \ + place_design \ + add_tie_cells \ + time_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_ilm_type \ + cleanup_specify_clock_tree \ + create_clock_tree_spec \ + specify_clock_tree \ + set_useful_skew_mode \ + set_opt_mode \ + set_design_mode \ + set_delay_cal_mode \ + set_dont_use \ + opt_design \ + ck_clone_gate \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_cts_mode \ + set_nanoroute_mode \ + enable_clock_gate_cells \ + clock_design \ + disable_clock_gate_cells \ + run_clock_eco \ + update_timing \ + time_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_delay_cal_mode \ + set_analysis_mode \ + set_opt_mode \ + opt_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_dont_use \ + set_opt_mode \ + opt_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_nanoroute_mode \ + add_filler_cells \ + route_secondary_pg_nets \ + check_place \ + route_design \ + run_clock_eco \ + spread_wires \ + initialize_timing \ + time_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_extract_rc_mode \ + set_analysis_mode \ + set_delay_cal_mode \ + add_metalfill \ + delete_filler_cells \ + opt_design \ + add_filler_cells \ + trim_metalfill \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_dont_use_mode \ + set_opt_mode \ + delete_filler_cells \ + opt_design \ + add_filler_cells \ + trim_metalfill \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_extract_rc_mode \ + set_si_mode \ + set_analysis_mode \ + set_delay_cal_mode \ + add_metalfill \ + delete_filler_cells \ + opt_design \ + add_filler_cells \ + trim_metalfill \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_dont_use \ + set_opt_mode \ + set_extract_rc_mode \ + set_si_mode \ + set_delay_cal_mode \ + set_analysis_mode \ + add_metalfill \ + delete_filler_cells \ + opt_design \ + add_filler_cells \ + trim_metalfill \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_timing \ + initialize_step \ + set_analysis_mode \ + set_extract_rc_mode \ + extract_rc \ + dump_spef \ + time_design_setup \ + time_design_hold \ + stream_out \ + save_oa_design \ + create_ilm \ + summary_report \ + verify_connectivity \ + verify_geometry \ + verify_metal_density \ + verify_process_antenna \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + initialize_timing \ + load_cpf \ + commit_cpf \ + run_clp_init \ + save_init_dbs \ + set_budgeting_mode \ + update_constraint_mode \ + set_ptn_user_cns_file \ + set_place_mode \ + place_design \ + save_place_dbs \ + trial_route \ + assign_ptn_pins \ + check_pin_assignment \ + report_unaligned_nets \ + set_ptn_pin_status \ + derive_timing_budget \ + save_budget_dbs \ + run_clp \ + partition \ + save_partition \ + assemble_design \ + specify_ilm \ + load_ilm_non_sdc_file \ + load_cpf \ + commit_cpf \ + initialize_timing \ + update_timing \ + pre_pac_verify_connectivity \ + pre_pac_verify_geometry \ + set_module_view \ + delete_filler_cells \ + opt_design \ + add_filler_cells \ + post_pac_verify_connectivity \ + post_pac_verify_geometry \ + " + + set prefix_count 0 + set midfix_count 0 + set suffix_count 0 + + foreach variable [array names vars] { + set split [split $variable ","] + if {[llength $split] == 1} { + continue + } elseif {[llength $split] == 2} { + set prefix [lindex $split 0] + set suffix [lindex $split 1] + puts $op "Checking $prefix + $suffix" + if {[lsearch $valid_prefixes $prefix] == -1} { + incr prefix_count + puts $op " ERROR Unknown prefix -> $prefix ($variable)" + puts " ERROR Unknown prefix -> $prefix ($variable)" + # append commands "# ERROR: A verilog netlist file must be defined\n" + set errors($error_count) "Unknown prefix -> $prefix ($variable)" + incr error_count + } + if {[lsearch $valid_suffixes $suffix] == -1} { + incr suffix_count + puts $op " ERROR Unknown suffix -> $suffix ($variable)" + puts " ERROR Unknown suffix -> $suffix ($variable)" + set errors($error_count) "Unknown suffix -> $prefix ($variable)" + incr error_count + } + } elseif {[llength $split] == 3} { + set prefix [lindex $split 0] + set midfix [lindex $split 1] + set suffix [lindex $split 2] + puts $op "Checking $prefix + $midfix + $suffix" + if {[lsearch $valid_prefixes $prefix] == -1} { + incr prefix_count + puts $op " ERROR Unknown prefix -> $prefix ($variable)" + puts " ERROR Unknown prefix -> $prefix ($variable)" + set errors($error_count) "Unknown prefix -> $prefix ($variable)" + incr error_count + } + if {[lsearch $valid_midfixes $midfix] == -1} { + incr midfix_count + puts $op " ERROR Unknown midfix -> $prefix ($variable)" + puts " ERROR Unknown midfix -> $prefix ($variable)" + set errors($error_count) "Unknown midfix -> $midfix ($variable)" + incr error_count + } + if {[lsearch $valid_suffixes $suffix] == -1} { + incr suffix_count + puts $op " WARNING Unknown suffix -> $suffix ($variable)" + puts " WARNING Unknown suffix -> $suffix ($variable)" + set errors($error_count) "Unknown suffix -> $prefix ($variable)" + incr error_count + } + } else { + continue + } + } + + close $op + +} diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/defaults.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/defaults.tcl new file mode 100755 index 000000000..651eb2f05 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/defaults.tcl @@ -0,0 +1,117 @@ +############################################################################### +# Define option defaults and initialize undefined variables +############################################################################### +set flow_defaults(fff_info_level) 0 +set flow_defaults(debug) 0 +set flow_defaults(freeze_vars) false +#set flow_defaults(novus) false +set flow_defaults(parent) edi +set flow_defaults(abutted_design) false +set flow_defaults(hier_flow_type) 1pass +set flow_defaults(netlist_type) verilog +set flow_defaults(ilm_list) "" +set flow_defaults(codegen) false +set flow_defaults(capture_metrics) true +set flow_defaults(report_run_time) true +set flow_defaults(report_system_info) true +set flow_defaults(enable_qor_check) false +set flow_defaults(batch) true +set flow_defaults(rc) false +set flow_defaults(verbose) false +set flow_defaults(run_lec) true +set flow_defaults(skip_cts) false +set flow_defaults(enable_celtic_steps) false +set flow_defaults(skip_signoff_checks) false +set flow_defaults(run_clp) true +#set flow_defaults(dbs_format) oa +set flow_defaults(high_timing_effort) false +set flow_defaults(flow_effort) standard +#set flow_defaults(flow_effort) none +set flow_defaults(power_effort) none +set flow_defaults(generate_tracks) true +set flow_defaults(add_tracks) true +set flow_defaults(generate_flow_steps) false +set flow_defaults(enable_rcp) false +set flow_defaults(enable_pam) false +set flow_defaults(enable_aocv) false +set flow_defaults(enable_socv) false +set flow_defaults(enable_ocv) pre_cts +set flow_defaults(enable_cppr) none +set flow_defaults(enable_ss) false +set flow_defaults(enable_si_aware) true +set flow_defaults(enable_pac) false +set flow_defaults(enable_flexilm) false +set flow_defaults(enable_nrgr) false +set flow_defaults(enable_signoff_eco) false +set flow_defaults(black_box) true +set flow_defaults(pac_scratch_dir) "PAC_SCRATCH" +set flow_defaults(eco_dir) "ECO" +set flow_defaults(budget_mode) giga_opt +set flow_defaults(use_proto_net_delay_model) false +set flow_defaults(use_flexmodels) false +set flow_defaults(flexmodel_as_ptn) true +set flow_defaults(flexmodel_art_based) true +set flow_defaults(create_flexfiller_blockage) false +set flow_defaults(flexmodel_prototype) false +set flow_defaults(flexmodel_prototype_flow_style) "top_to_bottom" +set flow_defaults(flexmodel_prototype_congestion_aware) false +set flow_defaults(flexmodel_prototype_timing_aware) false +set flow_defaults(flexmodel_prototype_user_contraints) "user_constraints.txt" +# set flow_defaults(clock_eco) none +# set flow_defaults(clock_gate_clone) false +set flow_defaults(metalfill) false +set flow_defaults(cpf_timing) false +set flow_defaults(cpf_keep_rows) false +set flow_defaults(cpf_power_domain) false +set flow_defaults(cpf_power_switch) false +set flow_defaults(cpf_isolation) false +set flow_defaults(cpf_state_retention) false +set flow_defaults(cpf_level_shifter) false +set flow_defaults(ieee1801_timing) false +set flow_defaults(ieee1801_keep_rows) false +set flow_defaults(ieee1801_power_domain) false +set flow_defaults(ieee1801_power_switch) false +set flow_defaults(ieee1801_isolation) false +set flow_defaults(ieee1801_state_retention) false +set flow_defaults(ieee1801_level_shifter) false +set flow_defaults(insert_feedthrough) true +set flow_defaults(report_power) false +#set flow_defaults(in_place_opt) false +#set flow_defaults(no_pre_place_opt) false +set flow_defaults(place_opt_design) true +set flow_defaults(place_io_pins) false +set flow_defaults(placement_based_ptn) false +set flow_defaults(update_io_latency) true +set flow_defaults(route_clock_nets) true +set flow_defaults(track_opt) false +set flow_defaults(cts_engine) ccopt +set flow_defaults(ccopt_effort) low +set flow_defaults(skip_cts) false +set flow_defaults(fix_hold) "postcts postroute postroute_si" +set flow_defaults(fix_hold_ignore_ios) false +set flow_defaults(preroute_opt_design) false +set flow_defaults(postcts_setup_hold) false +set flow_defaults(route_opt_design) false +set flow_defaults(postroute_setup_hold) true +#set flow_defaults(postroute_spread_wires) false +set flow_defaults(verify_litho) false +set flow_defaults(fix_litho) false +#set flow_defaults(postroute_extraction_effort) low +set flow_defaults(signoff_extraction_effort) high +set flow_defaults(hosts) 1 +set flow_defaults(threads) 1 +set flow_defaults(local_cpus) 1 +set flow_defaults(remote_hosts) 0 +set flow_defaults(cpus_per_remote_host) 1 +set flow_defaults(backup_data) 0 +set flow_defaults(save_constraints) 0 +set flow_defaults(user_comments) 0 +set flow_defaults(place,time_design,skip) true +set flow_defaults(cts,time_design,skip) true +set flow_defaults(route,time_design,skip) true +set flow_defaults(route,check_place,skip) true +set flow_defaults(make_tool) encounter +set flow_defaults(make_tool_args) "-64 -nowin" +set flow_defaults(make_syn_tool) genus +set flow_defaults(make_syn_tool_args) "-64" +set flow_defaults(make_browser) netscape diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/gen_options.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/gen_options.tcl new file mode 100755 index 000000000..502622d26 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/gen_options.tcl @@ -0,0 +1,163 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +proc gen_options {file} { + + global names + global notes + global default + global type + global category + + set names [list] + + set ip [open $file] + while {[gets $ip temp]>=0} { + if {[regexp "^#" $temp]} { continue } + set line [split $temp "\^"] + puts $line + set var [lindex $line 0] + lappend names $var + set category($var) [lindex $line 1] + set type($var) [lindex $line 2] + set default($var) [lindex $line 3] + set notes($var) [lindex $line 4] + } + close $ip + + puts "[llength $names] variables processed" + + set op [open options.tcl w] + foreach var $names { + switch -glob $var { + "library_sets" { + puts $op "set vars($var) \[list library_set\]" + } + "" $temp "" svar + puts $op "set vars($svar) $notes($var)" + } + "rc_corners" { + puts $op "set vars($var) \[list rc_corner\]" + } + "" $temp "" svar + switch -glob [lindex [split $svar ","] 1] { + "cap_table" { + puts $op "set vars($svar) $notes($var)" + } + "qx_tech_file" { + puts $op "set vars($svar) $notes($var)" + } + "default" { + if {[regexp "post_route" $svar]} { + puts $op "set vars($svar) {1.00 1.00 1.00}" + } else { + puts $op "set vars($svar) 1.00" + } + } + } + } + "delay_corners" { + puts $op "set vars($var) \[list delay_corner\]" + } + "" $temp "" var + switch -glob [lindex [split $var ","] 1] { + "rc_corner" { + puts $op "set vars($var) {rc_corner}" + } + "library_set" { + puts $op "set vars($var) {library_set}" + } + "default" { + puts $op "set vars($var) 1.00" + } + } + } + "constraint_modes" { + puts $op "set vars($var) \[list constraint_mode\]" + } + "" $temp "" var + switch -glob [lindex [split $var ","] 1] { + "pre_cts_sdc" { + puts $op "set vars($var) {sdc_file}" + } + "post_cts_sdc" { + puts $op "set vars($var) {sdc_file}" + } + } + } + "*setup*view*" { + puts $op "set vars($var) {setup_view}" + puts $op "set vars(setup_view,delay_corner) {delay_corner}" + puts $op "set vars(setup_view,constraint_mode) {constraint_mode}" + } + "*hold*view*" { + puts $op "set vars($var) {hold_view}" + puts $op "set vars(hold_view,delay_corner) {delay_corner}" + puts $op "set vars(hold_view,constraint_mode) {constraint_mode}" + } + "analysis_views" { + puts $op "set vars(analysis_views) {setup_view hold_view}" + } + default { + if {$type($var) == "enum"} { + puts $op "set vars($var) $notes($var)" + } elseif {$type($var) == "list"} { + regsub "<" $notes($var) "" temp + regsub ">" $temp "" notes($var) + regsub "{" $notes($var) "" temp + regsub "}" $temp "" notes($var) + puts $op "set vars($var) {list of $notes($var)}" + } elseif {$category($var) == "plug-in"} { + puts $op "set vars($var) $notes($var)" + } elseif {$default($var) != "UNDEFINED"} { + puts $op "set vars($var) $default($var)" + } else { + puts $op "set vars($var) {$type($var)}" + } + } + } + } + close $op + +} + +gen_options $argv diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/generic.conf b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/generic.conf new file mode 100755 index 000000000..99853212d --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/generic.conf @@ -0,0 +1,177 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# � 2008-2009 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks within Innovus System. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +global vars +global rda_Input +#if {$vars(flow) == "default"} { +# set vars(captbl_file) $vars(wc_cap_table) +#} +set rda_Input(assign_buffer) $vars(assign_buffer) +set rda_Input(double_back) $vars(double_back) +set rda_Input(flip_first) $vars(flip_first_row) +set rda_Input(import_mode) $vars(import_mode) +set rda_Input(ui_areaiolib) $vars(area_io_lib) +set rda_Input(ui_aspect_ratio) $vars(aspect_ratio) +set rda_Input(ui_blklib) $vars(blk_lib) +set rda_Input(ui_buf_footprint) $vars(buf_footprint) +set rda_Input(ui_cap_unit) $vars(cap_unit) +set rda_Input(ui_captbl_file) $vars(captbl_file) +set rda_Input(ui_cdb_file) $vars(cdb_file) +set rda_Input(ui_cdb_file,max) $vars(cdb_file,max) +set rda_Input(ui_cdb_file,min) $vars(cdb_file,min) +set rda_Input(ui_celllib) $vars(celllib) +set rda_Input(ui_core_cntl) $vars(core_control) +set rda_Input(ui_core_height) $vars(core_height) +set rda_Input(ui_core_to_bottom) $vars(core_to_bottom) +set rda_Input(ui_core_to_left) $vars(core_to_left) +set rda_Input(ui_core_to_right) $vars(core_to_right) +set rda_Input(ui_core_to_top) $vars(core_to_top) +set rda_Input(ui_core_util) $vars(core_util) +set rda_Input(ui_core_width) $vars(core_width) +set rda_Input(ui_cts_cell_footprint) $vars(cts_cell_footprint) +set rda_Input(ui_cts_cell_list) $vars(cts_cell_list) +if {[info exists vars(coupling_c_thresh)]} { + set rda_Input(ui_cpl_c_thresh) $vars(coupling_c_thresh) +} +if {[info exists vars(def_cap_factor)]} { + set rda_Input(ui_preRoute_cap) $vars(def_cap_factor) +} +if {[info exists vars(det_cap_factor)]} { + set rda_Input(ui_postRoute_cap) $vars(det_cap_factor) +} +if {[info exists vars(def_res_factor)]} { + set rda_Input(ui_preRoute_res) $vars(def_res_factor) +} +if {[info exists vars(det_res_factor)]} { + set rda_Input(ui_postRoute_res) $vars(det_res_factor) +} +if {[info exists vars(det_xcap_factor)]} { + set rda_Input(ui_xcap_scale) $vars(det_xcap_factor) +} +set rda_Input(ui_delay_footprint) $vars(del_footprint) +set rda_Input(ui_delay_limit) $vars(delay_limit) +set rda_Input(ui_dpath) $vars(data_path) +set rda_Input(ui_echo_file) $vars(echo_file) +set rda_Input(ui_echo_file,max) $vars(echo_file,max) +set rda_Input(ui_echo_file,min) $vars(echo_file,min) +set rda_Input(ui_exc_net) $vars(exclude_nets) +set rda_Input(ui_gds_file) "" +set rda_Input(ui_gen_footprint) $vars(gen_footprint) +#set vars(ilm_dir) "" +#if {[info exists vars(ilm_list)]} { +# foreach cell $vars(ilm_list) { +# if {[info exists vars($cell,ilm_dir)]} { +# lappend vars(ilm_dir) $cell +# lappend vars(ilm_dir) $vars($cell,ilm_dir) +# } else { +# Puts " WARNING: ILM DIRECTORY MISSING FOR $cell ... SKIPPING" +# } +# } +#} +#set rda_Input(ui_ilmdir) $vars(ilm_dir) +#set rda_Input(ui_ilmlist) $vars(ilm_list) +#set rda_Input(ui_ilmspef) $vars(ilm_spef) +set rda_Input(ui_ilmdir) {} +set rda_Input(ui_ilmlist) {} +set rda_Input(ui_ilmspef) {} +set rda_Input(ui_in_tran_delay) $vars(default_slew) +set rda_Input(ui_inv_footprint) $vars(inv_footprint) +set rda_Input(ui_ioOri) $vars(io_orientation) +set rda_Input(ui_io_file) $vars(io_file) +set rda_Input(ui_iolib) $vars(io_lib) +set rda_Input(ui_isHorTrackHalfPitch) $vars(hor_track_half_pitch) +set rda_Input(ui_isOrigCenter) $vars(center_origin) +set rda_Input(ui_isVerTrackHalfPitch) $vars(ver_track_half_pitch) +set rda_Input(ui_isVerticalRow) $vars(vertical_rows) +set rda_Input(ui_kboxlib) $vars(kbox_lib) +set rda_Input(ui_latency_file) $vars(latency_file) +if {[info exists vars(lef_files)]} { + set rda_Input(ui_leffile) $vars(lef_files) +} +set rda_Input(ui_locvlib) $vars(locv_lib) +set rda_Input(ui_max_io_height) $vars(max_io_height) +set rda_Input(ui_net_delay) $vars(default_net_delay) +set rda_Input(ui_net_load) $vars(default_net_load) +if {[info exists vars(netlist)]} { + set rda_Input(ui_netlist) $vars(netlist) +} +set rda_Input(ui_netlisttype) $vars(netlist_type) +set rda_Input(ui_oa_abstractname) $vars(oa_abstract_name) +set rda_Input(ui_oa_layoutname) $vars(oa_layout_name) +set rda_Input(ui_oa_oa2lefversion) $vars(oa2lefversion) +set rda_Input(ui_oa_reflib) $vars(oa_ref_lib) +set rda_Input(ui_oa_designLib) $vars(oa_design_lib) +set rda_Input(ui_oa_designCell) $vars(oa_design_cell) +set rda_Input(ui_oa_designView) $vars(oa_design_view) + +#if {[info exists vars(pg_connections)]} { +# set rda_Input(ui_pg_connections) $vars(pg_connections) +# foreach connection $vars(pg_connections) { +# set rda_Input($connection) $vars($connection) +# } +#} +set rda_Input(ui_pwrnet) $vars(power_nets) +set rda_Input(ui_gndnet) $vars(ground_nets) +set rda_Input(ui_qxconf_file) $vars(qxconf_file) +set rda_Input(ui_qxlayermap_file) $vars(qxlayermap_file) +set rda_Input(ui_qxlib_file) $vars(qxlib_file) +set rda_Input(ui_qxtech_file) $vars(qxtech_file) +if {[info exists vars(relative_c_thresh)]} { + set rda_Input(ui_rel_c_thresh) $vars(relative_c_thresh) +} +set rda_Input(ui_row_height) $vars(row_height) +set rda_Input(ui_rtllist) $vars(rtl_list) +set rda_Input(ui_scheduling_file) $vars(scheduling_file) +set rda_Input(ui_settop) $vars(set_top_cell) +set rda_Input(ui_shr_scale) $vars(shr_scale) +set rda_Input(ui_sigstormlib) $vars(signalstorm_lib) +set rda_Input(ui_smodData) $vars(smod_data) +set rda_Input(ui_smodDef) $vars(smod_def) +set rda_Input(ui_tech_file) $vars(tech_file) +set rda_Input(ui_time_unit) $vars(time_unit) +set rda_Input(ui_timelib) $vars(timelib) +set rda_Input(ui_timelib,max) $vars(timelib,max) +set rda_Input(ui_timelib,min) $vars(timelib,min) +if {[info exists vars(timingcon_file)]} { + set rda_Input(ui_timingcon_file) $vars(timingcon_file) +} +if {[info exists vars(timingcon_file,full)]} { + set rda_Input(ui_timingcon_file,full) $vars(timingcon_file,full) +} +set rda_Input(ui_topcell) $vars(design) +if {[info exists vars(total_c_thresh)]} { + set rda_Input(ui_tot_c_thresh) $vars(total_c_thresh) +} +set rda_Input(ui_view_definition_file) $vars(view_definition_file) +set rda_Input(ui_xtwf_file) $vars(xtalk_twf_file) diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/header.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/header.tcl new file mode 100755 index 000000000..56e896b29 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/header.tcl @@ -0,0 +1,40 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +#!/usr/bin/tclsh +set vars(journal) true +set vars(dbs_dir) JNL +set env(VPATH) jmake +proc Puts args {} +proc sleep args { } diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/map_attr.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/map_attr.tcl new file mode 100755 index 000000000..336bd4357 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/map_attr.tcl @@ -0,0 +1,241 @@ +# Potential flow control +# ---------------------------------------------------------------------- + +#set help(steps) flow_steps + +#set attr(enable_aocv) "timing_enable_aocv_analysis" +#set attr(enable_cppr) "timing_analysis_cppr" +#set attr(enable_ocv) "timing_analysis_type" +#set attr(enable_si_aware) "timing_analysis_si_aware" + +#set attr(enable_pac) boolean (delete) +#set attr(enable_dlm) boolean (delete) +#set attr(enable_flexilm) boolean +#set attr(abutted_design) ? +#set attr(insert_feedthrough) ? +#set attr(ps_pm) ? +#set attr(use_ps_pm) ? +#set attr(enable_flexilm) ? +#set attr(use_flexmodels) ? +#set attr(flexmodel_as_ptn) ? +#set attr(flexmodel_art_based) ? + +#set attr(fix_hold) boolean +#set attr(fix_litho) boolean +#set attr(high_timing_effort) boolean +#set attr(run_clp) boolean +#set attr(run_lec) boolean +#set attr(skip_cts) boolean +#set attr(skip_si) boolean +#set attr(skip_signoff_checks) boolean +#set help(hier_flow_type) "1pass 2pass" +#set help(black_box) "TRUE false" +#set attr(partition_dir) "PARTITION directory" + +# Library Setup (drop or move) +# ---------------------------------------------------------------------- +#set attr(library_sets) "List of library sets" +#set attr(timing) "List of library files" +#set attr(aocv) "AOCV table file" +#set attr(si) "List of CDB files" +#set attr(rc_corners) "List of RC corners" +#set attr(P) "Process multiplier" +#set attr(T) "Temperature" +#set attr(V) "Voltage" +#set attr(cap_table) "Captable file" +#set attr(post_route_cap_factor) "float (triplet)" +#set attr(post_route_clk_cap_factor) "float (triplet)" +#set attr(post_route_clk_res_factor) "float (triplet)" +#set attr(post_route_res_factor) "float" +#set attr(pre_route_cap_factor) "float" +#set attr(pre_route_clk_cap_factor) "float" +#set attr(pre_route_clk_res_factor) "float" +#set attr(pre_route_res_factor) "float" +#set attr(qx_tech_file) "QRC techfile" +#set attr(opconds) "List of opconds" +#set attr(P) "Process multiplier" +#set attr(T) "Temperature" +#set attr(V) "Voltage" +#set attr(library_file) "Library file" +#set attr(delay_corners) "List of delay corners" +#set attr(library_set) "Library set" +#set attr(rc_corner) "RC corner" +#set attr(power_domains) "List of power domains" +#set attr(clock_cell_early) "Float" +#set attr(clock_cell_late) "Float" +#set attr(clock_net_early) "Float" +#set attr(clock_net_late) "Float" +#set attr(data_cell_early) "Float" +#set attr(data_cell_late) "Float" +#set attr(data_net_early) "Float" +#set attr(data_net_late) "Float" +#set attr(constraint_modes) "List of constraint modes" +#set attr(pre_cts_sdc) "List of SDC files" +#set attr(post_cts_sdc) "List of SDC files" +#set attr(incr_cts_sdc) "List of SDC files (incremental)" +#set attr(ilm_non_sdc_file) "List of ILM constraints" +#set attr(setup_analysis_views) "List of analysis views" +#set attr(hold_analysis_views) "List of analysis views" +#set attr(constraint_mode) "Constraint mode" +#set attr(delay_corner) "Delay corner" +# +#set attr(active_setup_views) "List of active setup views" +#set attr(active_hold_views) "List of active hold views" +#set attr(active_setup_views) "List of active setup views per step" +#set attr(active_hold_views) "List of active hold views per step" +# +#set attr(default_setup_view) "Default setup view" +#set attr(default_hold_view) "Default hold view" + +# Design Initialization +set help(netlist) "init_verilog" +#set help(netlist_type) "VERILOG vhdl" +set help(design) "init_top_cell" +set attr(def_files) "flow_def_files" +set attr(oa_design_lib) init_oa_design_lib +set attr(oa_design_cell) init_oa_design_cell +set attr(oa_design_view) init_oa_design_view +#set attr(ilm_list) flow_ilm_list +#set attr(ilm_dir) flow_ilm_dir_list +#set attr(lef_file) flow_ilm_lef_files +#set attr(setup_lib) flow_ilm_setup_lib +set attr(max_route_layer) route_trial_max_route_layer +set attr(generate_tracks) add_tracks +#set attr(honor_pitch) ? + +# Place +set attr(place_io_pins) place_global_place_io_pins +set attr(clock_gate_aware) place_global_clock_gate_aware +#set attr(clock_gate_clone) ? +set attr(congestion_effort) place_global_cong_effort + + +# Power +set attr(activity_file) "File name" +set attr(activity_file_format) "TCF VCD SAIF" +set attr(power_analysis_view) "Analysis view for power analysis" +set attr(power_domains) "List of power domains" + +set attr(cpf_file) init_cpf_file +#set attr(ieee1801_file) ? + +set attr(power_nets) "List of power nets" +set attr(ground_nets) "List of ground nets" +set attr(global_nets) "List of global nets" +set attr(module) "Module for global net" +set attr(pins) "Power pins for global net" +set attr(tiehi) "Tiehi global net" +set attr(tielo) "Tielo global net" + + +# Clock +set attr(cts_engine) cts_engine +#set attr(cts_integration) ? +set attr(cts_cells) "List of CTS cells" +set attr(cts_buffer_cells) "List of CTS buffer cells" +set attr(cts_inverter_cells) "List of CTS inverter cells" +set attr(clock_gate_cells) "List of CTS clock gate cells" +set attr(cts_use_inverters) "true false" +set attr(clk_leaf_bottom_layer) cts_route_leaf_bottom_preferred_layer +set attr(clk_leaf_top_layer) cts_route_leaf_top_preferred_layer +set attr(clk_leaf_extra_space) cts_route_leaf_preferred_extra_space +set attr(clk_leaf_ndr) cts_route_leaf_non_default_rule +set attr(clk_max_skew) "Float (nanoseconds)" +set attr(clk_max_slew) "Float (nanoseconds)" +set attr(clk_tree_bottom_layer) cts_route_bottom_preferred_layer +set attr(clk_tree_extra_space) cts_route_top_preferred_layer +set attr(route_clock_nets) cts_route_clk_net +set attr(clk_tree_ndr) cts_route_non_default_rule +set attr(clk_tree_shield_net) ccopt_route_top_shielding_net +set attr(clk_tree_shield_thresh) ccopt_top_net_min_fanout +set attr(update_io_latency) ccopt_modify_clock_latency + +set attr(clock_eco) "true FALSE" + +# Opt +set attr(all_end_points) opt_all_end_points +#set attr(clock_gate_aware_opt) ? +#set attr(critical_range) ? +#set attr(congestion_effort) ? +set attr(dynamic_power_effort) opt_dynamic_power_effort +set attr(leakage_power_effort) opt_leakage_power_effort +set attr(preserve_assertions) opt_preserve_pins_with_timing_constraints +set attr(resize_shifter_and_iso_insts) opt_resize_level_shifter_and_iso_instances +set attr(fix_hold_allow_tns_degradation) opt_fix_hold_allow_setup_tns_degradation +set attr(fix_hold_ignore_ios) opt_fix_hold_ignore_path_groups +set attr(useful_skew) opt_useful_skew + +# Route +set attr(multi_cut_effort) route_detail_use_multi_cut_via_effort +set attr(litho_driven_routing) route_detail_post_route_litho_repair +set attr(postroute_spread_wires) route_detail_post_route_spread_wire +#set attr(route_secondary_pg_nets) "true FALSE" +#set attr(secondary_pg_nets) "List of global nets for secondary power/ground" + +# Extraction +set attr(postroute_extraction_effort) extract_rc_effort_level +set attr(signoff_extraction_effort) extract_rc_effort_level +set attr(coupling_c_thresh) extract_rc_coupling_cap_th +set attr(total_c_thresh) extract_rc_total_cap_th +set attr(relative_c_thresh) extract_rc_relative_cap_th + +# DFM +#set attr(verify_litho) "true FALSE" +#set attr(lpa_tech_file) "LPA tech file" +#set attr(metalfill) "true FALSE" +#set attr(metalfill_tcl) "Metalfill plug-in" +#set attr(gds_files) "GDS file list" +#set attr(gds_layer_map) "GDS layer map" +#set attr(gds_files) "Oasis file list" +#set attr(gds_layer_map) "Oasis layer map" + +# Noise +#set attr(si_analysis_type) "DEFAULT pessimistic" +set attr(delta_delay_threshold) si_delay_delta_threshold +#set attr(acceptable_wns) si_acceptable_wns + +# Database +set attr(dbs_dir) "Database directory" +set attr(dbs_format) "FE oa" +set attr(oa_layout_name) "OA Layout view name" +set attr(oa_abstract_name) "OA Abstract view name" +set attr(save_constraints) "true FALSE (Save constraints with DBS?)" +set attr(save_rc) "true FALSE (Save RCDB with DBS?)" + +# Reporting +set attr(rpt_dir) "Reports directory" +set attr(report_power) "TRUE false" +set attr(capture_metrics) capture_metrics + +# Misc +set attr(to) "Mail addresses" +set attr(steps) "List of steps" + +set attr(plug_dir) "Plug-in directory" +set attr(tmp_dir) "TMP directory" +set attr(log_dir) "LOG directory" + + +set attr(distribute) "LOCAL lsf rsh custom" +set attr(local_cpus) "List of hosts" +set attr(remote_hosts) "Integer (number of hosts)" +set attr(cpus_per_remote_host) "Integer (number of cpus)" + + +#set attr(assign_buffer) ? +#set attr(assign_buffer_cell) ? +#set attr(always_on_buffers) "List of AON buffers" +#set attr(delay_cells) "List of delay cells" +#set attr(dont_use_list) "List of dont use cells" +#set attr(dont_use_file) "File w/setDontUse commands" +#set attr(welltaps) "Welltap cells" +#set attr(cell_interval) "Float: (interval) distance in microns" +#set attr(checkerboard) "true FALSE" +#set attr(spare_cells) "List of spare modules" +#set attr(jtag_cells) "List of jtag modules" +#set attr(jtag_rows) "List of rows to reserve for jtag placement" +#set attr(filler_cells) "List of filler cells" +#set attr(skew_buffers) "List of buffers for useful skew" +#set attr(tie_cells) "List of tie cells" +#set attr(max_distance) "Float: distance in microns" +#set attr(max_fanout) "Interger: fanout number" diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/map_options.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/map_options.tcl new file mode 100755 index 000000000..dc2881f3e --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/map_options.tcl @@ -0,0 +1,68 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +################################################################################ +# Map option names ... +################################################################################ +set map(switch_instance) switchModuleInstance +set map(input_enable_pin) enablePinIn +set map(output_enable_pin) enablePinOut +set map(input_enable_net) enableNetIn +set map(output_enable_net) enableNetOut +set map(switch_cell) globalSwitchCellName +set map(top_offset) topOffset +set map(bottom_offset) bottomOffset +set map(right_offset) rightOffset +set map(left_offset) leftOffset +set map(horizonal_pitch) horizontalPitch +set map(column_height) height +set map(skip_rows) skipRows +set map(top_ring) topSide +set map(bottom_ring) bottomSide +set map(right_ring) rightSide +set map(left_ring) leftSide +set map(corner_cell_list) cornerCellList +set map(top_filler_cell) fillerCellNameTop +set map(bottom_filler_cell) fillerCellNameBottom +set map(left_filler_cell) fillerCellNameLeft +set map(right_filler_cell) fillerCellNameRight +set map(top_switch_cell) switchCellNameTop +set map(bottom_switch_cell) switchCellNameBottom +set map(left_switch_cell) switchCellNameLeft +set map(right_switch_cell) switchCellNameRight +set map(top_switches) topNumSwitch +set map(bottom_switches) bottomNumSwitch +set map(left_switches) leftNumSwitch +set map(right_switches) rightNumSwitch + diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/mapped_vars.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/mapped_vars.tcl new file mode 100755 index 000000000..2323a4d6e --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/mapped_vars.tcl @@ -0,0 +1,385 @@ +set help(categories) "flow hier dbs synth init ilm mmmc power place opt cts hold route extract noise report distribute misc" +set help(all,categories) $help(categories) +set help(synth,categories) "synth" +set help(ilm,categories) "ilm" +set help(init,categories) "init ilm mmmc power report" +set help(place,categories) "place dbs report" +set help(prects,categories) "opt dbs report" +set help(cts,categories) "cts dbs report" +set help(opt,categories) "opt" +set help(postcts,categories) "opt dbs report" +set help(postcts_hold,categories) "opt hold dbs report" +#set help(hold) "opt hold dbs report" +set help(route,categories) "route dbs report" +set help(postroute,categories) "opt extract noise dbs report" +set help(postroute_hold,categories) "route extract noise hold dbs report" +set help(signoff,categories) "extract noise" +set help(flow,categories) "flow" +set help(control,categories) "flow" +set help(mmmc,categories) "mmmc" +set help(timing,categories) "mmmc" +set help(noise,categories) "noise" +set help(dbs,categories) "dbs" +set help(power,categories) "power" +set help(distribute,categories) "distribute" +set help(misc,categories) "misc" +set color(flow) #ccff66 +set color(dbs) #ffcc66 +set color(init) #ccff66 +set color(mmmc) #ffcc66 +set color(power) #ccff66 +set color(place) #ffcc66 +set color(opt) #ccff66 +set color(cts) #ffcc66 +set color(route) #ccff66 +set color(extract) #ffcc66 +set color(noise) #ccff66 +set color(report) #ffcc66 +set color(distribute) #ccff66 +set color(misc) #ffcc66 +# Flow Control +set help(flow,none,steps) "default: init place prects cts postcts postcts_hold route postroute postroute_hold signoff" +set help(flow,none,mode) "FLAT hier user" +set help(flow,none,flat) "none partial full" +#set help(flow,flow) "mmmc" +set help(flow,none,hier_flow_type) "1pass 2pass" +set help(flow,none,black_box) "TRUE false" +set help(flow,insert_partition_feedthrough,insert_feedthrough) "TRUE false" +set help(flow,set_place_mode,placement_based_ptn) "true FALSE" +set help(flow,create_proto_model,use_flexmodels) "true FALSE" +set help(flow,create_ps_per_micron_model,use_proto_net_delay_model) "true FALSE" +set help(flow,derive_timing_budget,budget_mode) "trial_ipo proto_net_delay_model giga_opt" +set help(flow,replace_proto_model,flexmodel_as_ptn) "true FALSE" +set help(flow,create_proto_model,flexmodel_art_based) "true FALSE" + +set help(flow,set_analysis_mode,enable_aocv) "true FALSE" +set help(flow,set_analysis_mode,enable_cppr) "true FALSE" +set help(flow,set_analysis_mode,enable_ocv) "pre_prects pre_postcts pre_postroute PRE_POSTROUTE_HOLD pre_signoff false" +set help(flow,set_delay_cal_mode,enable_si_aware) "true FALSE" +set help(flow,set_delay_cal_mode,enable_ss) "pre_place pre_prects pre_postcts pre_postroute pre_postroute_hold pre_signoff FALSE" + +set help(flow,none,enable_pac) "true FALSE" +set help(flow,none,enable_dlm) "true FALSE" +set help(flow,none,fix_hold) "TRUE false" +set help(flow,none,fix_litho) "true FALSE" +set help(flow,none,high_timing_effort) "true FALSE" +set help(flow,none,run_clp) "TRUE false" +set help(flow,none,run_lec) "true FALSE" +set help(flow,none,skip_cts) "true FALSE" +set help(flow,none,skip_si) "true FALSE" +set help(flow,none,skip_signoff_checks) "true FALSE" + +set help(flow,none,abort) "true FALSE" +set help(flow,none,batch) "TRUE false" +set help(flow,none,save_on_catch) "TRUE false" +set help(flow,none,catch_errors) "TRUE false" + +# Library Setup +set help(mmmc,create_library_set,library_sets) "List of library sets" +set help(mmmc,create_library_set,,timing) "List of library files" +set help(mmmc,create_library_set,,aocv) "AOCV table file" +set help(mmmc,create_library_set,,si) "List of CDB files" +set help(mmmc,create_rc_corner,rc_corners) "List of RC corners" +set help(mmmc,create_rc_corner,,P) "Process multiplier" +set help(mmmc,create_rc_corner,,T) "Temperature" +set help(mmmc,create_rc_corner,,V) "Voltage" +set help(mmmc,create_rc_corner,,cap_table) "Captable file" +set help(mmmc,create_rc_corner,,post_route_cap_factor) "float (triplet)" +set help(mmmc,create_rc_corner,,post_route_clk_cap_factor) "float (triplet)" +set help(mmmc,create_rc_corner,,post_route_clk_res_factor) "float (triplet)" +set help(mmmc,create_rc_corner,,post_route_res_factor) "float" +set help(mmmc,create_rc_corner,,pre_route_cap_factor) "float" +set help(mmmc,create_rc_corner,,pre_route_clk_cap_factor) "float" +set help(mmmc,create_rc_corner,,pre_route_clk_res_factor) "float" +set help(mmmc,create_rc_corner,,pre_route_res_factor) "float" +set help(mmmc,create_rc_corner,,qx_tech_file) "QRC techfile" +set help(mmmc,create_op_cond,opconds) "List of opconds" +set help(mmmc,create_op_cond,,P) "Process multiplier" +set help(mmmc,create_op_cond,,T) "Temperature" +set help(mmmc,create_op_cond,,V) "Voltage" +set help(mmmc,create_op_cond,,library_file) "Library file" +set help(mmmc,create_delay_corner,delay_corners) "List of delay corners" +set help(mmmc,create_delay_corner,,library_set) "Library set" +set help(mmmc,create_delay_corner,,rc_corner) "RC corner" +set help(mmmc,update_delay_corner,,power_domains) "List of power domains" +set help(mmmc,create_delay_corner,,clock_cell_early) "Float" +set help(mmmc,create_delay_corner,,clock_cell_late) "Float" +set help(mmmc,create_delay_corner,,clock_net_early) "Float" +set help(mmmc,create_delay_corner,,clock_net_late) "Float" +set help(mmmc,create_delay_corner,,data_cell_early) "Float" +set help(mmmc,create_delay_corner,,data_cell_late) "Float" +set help(mmmc,create_delay_corner,,data_net_early) "Float" +set help(mmmc,create_delay_corner,,data_net_late) "Float" +set help(mmmc,create_constraint_mode,constraint_modes) "List of constraint modes" +set help(mmmc,create_constraint_mode,,pre_cts_sdc) "List of SDC files" +set help(mmmc,update_constraint_mode,,post_cts_sdc) "List of SDC files" +set help(mmmc,update_constraint_mode,,incr_cts_sdc) "List of SDC files (incremental)" +set help(mmmc,update_constraint_mode,,ilm_non_sdc_file) "List of ILM constraints" +set help(mmmc,create_analysis_view,setup_analysis_views) "List of analysis views" +set help(mmmc,create_analysis_view,hold_analysis_views) "List of analysis views" +set help(mmmc,create_analysis_view,,constraint_mode) "Constraint mode" +set help(mmmc,create_analysis_view,,delay_corner) "Delay corner" + +set help(mmmc,set_analysis_view,active_setup_views) "List of active setup views" +set help(mmmc,set_analysis_view,active_hold_views) "List of active hold views" +set help(mmmc,set_analysis_view,,active_setup_views) "List of active setup views per step" +set help(mmmc,set_analysis_view,,active_hold_views) "List of active hold views per step" + +set help(mmmc,set_analysis_view,default_setup_view) "Default setup view" +set help(mmmc,set_analysis_view,default_hold_view) "Default hold view" + +# Synthesis +set help(synth,set_attribute,enable_pam) "true FALSE" +set help(synth,read_hdl,syn_load_rtl_tcl) "File to load/elaborate RTL" +set help(synth,read_hdl,hdl_search_path) "Verilog RTL search path" +set help(synth,read_hdl,hdl_file_list) "Verilog RTL files" +set help(synth,read_sdc,constraint_modes) "List of constraint modes (default will be used)" +set help(synth,read_sdc,,pre_cts_sdc) "List of SDC files" +set help(synth,read_def,def_files) "List of def files" +set help(synth,set_attribute,clock_gate_cells) "List of ICG cells" +set help(synth,set_attribute,postload_syn_place_tcl) "RCP pre-place plug-in" +set help(synth,set_attribute,preexport_syn_place_tcl) "RCP post-place plug-in" +set help(synth,set_attribute,preannotation_syn_place_tcl) "RCP pre-import plug-in" +# Design Initialization +set help(init,init_design,netlist) "Netlist files" +set help(init,init_design,netlist_type) "VERILOG vhdl" +set help(init,init_design,design) "Design name" +set help(init,def_in,def_files) "List of def files" +set help(init,init_design,oa_design_lib) "Starting OA design library" +set help(init,init_design,oa_design_cell) "Starting OA design cell" +set help(init,init_design,oa_design_view) "Starting OA design view" +set help(init,specify_ilm,ilm_list) "List of ILMs" +set help(init,specify_ilm,,ilm_dir) "ILM directory for " +set help(init,specify_ilm,,lef_file) "LEF file for " +set help(init,specify_ilm,,setup_lib) "Blackbox LIB file for " +set help(init,none,enable_flexilm) "Enable the flexIlm hierarchical flow" +set help(init,set_design_mode,process) "Process node (45nms, e.g.)" +set help(init,set_max_route_layer,max_route_layer) "Integer" +set help(init,generate_tracks,generate_tracks) "true FALSE" +set help(init,generate_tracks,honor_pitch) "true FALSE" +set help(init,init_design,assign_buffer) "1 -buffer " +#set help(init,init_design,assign_buffer_cell) "" +set help(init,set_dont_use,always_on_buffers) "List of AON buffers" +set help(init,set_dont_use,delay_cells) "List of delay cells" +set help(init,set_dont_use,dont_use_list) "List of dont use cells" +set help(init,set_dont_use,dont_use_file) "File w/setDontUse commands" +set help(init,add_end_cap,endcaps) "Endcap cells" +set help(init,add_well_tap,welltaps) "Welltap cells" +set help(init,add_well_tap,welltaps,cell_interval) "Float: (interval) distance in microns" +set help(init,add_well_tap,welltaps,checkerboard) "true FALSE" + +# ILM Related +set help(ilm,specify_ilm,ilm_list) "List of ILMs" +set help(ilm,specify_ilm,,ilm_dir) "ILM directory for " +set help(ilm,specify_ilm,,lef_file) "LEF file for " +set help(ilm,specify_ilm,,setup_lib) "Blackbox LIB file for " +set help(ilm,update_constraint_mode,,ilm_non_sdc_file) "List of ILM constraints" +set help(ilm,none,enable_flexilm) "Enable the flexIlm hierarchical flow" + +# Place +set help(place,set_place_mode,place_io_pins) "true FALSE" +set help(place,set_place_mode,clock_gate_aware) "true FALSE" +set help(place,set_place_mode,clock_gate_clone) "true FALSE" +set help(place,set_place_mode,congestion_effort) "low medium high AUTO" +set help(place,specify_spare_gate,spare_cells) "List of spare modules" +set help(place,place_jtag,jtag_cells) "List of jtag modules" +set help(place,place_jtag,jtag_rows) "List of rows to reserve for jtag placement" +set help(place,set_filler_mode,filler_cells) "List of filler cells" +set help(place,set_useful_skew_mode,skew_buffers) "List of buffers for useful skew" +set help(place,set_tie_hilo_mode,tie_cells) "List of tie cells" +set help(place,set_tie_hilo_mode,tie_cells,max_distance) "Float: distance in microns" +set help(place,set_tie_hilo_mode,tie_cells,max_fanout) "Interger: fanout number" +set help(place,set_design_mode,flow_effort) "express STANDARD extreme" +set help(place,set_design_mode,power_effort) "true FALSE" + +# Power +set help(mmmc,none,cpf_timing) "true FALSE" + +set help(power,read_activity_file,activity_file) "File name" +set help(power,read_activity_file,activity_file_format) "TCF VCD SAIF" +set help(power,set_power_analysis_view,power_analysis_view) "Analysis view for power analysis" +set help(power,none,power_domains) "List of power domains" +set help(power,set_design_mode,flow_effort) "express STANDARD extreme" +set help(power,set_design_mode,power_effort) "true FALSE" + +set help(power,load_cpf,cpf_file) "File name" +set help(power,load_cpf,cpf_isolation) "TRUE or false (Commit isolation rules?)" +set help(power,load_cpf,cpf_keep_rows) "TRUE or false (Keep rows?)" +set help(power,load_cpf,cpf_level_shifter) "TRUE or false (Commit level shifter rules?)" +set help(power,load_cpf,cpf_power_domain) "TRUE or false (Commit power domains?)" +set help(power,load_cpf,cpf_power_switch) "TRUE of false (Commit power switch rules?)" +set help(power,load_cpf,cpf_state_retention) "TRUE or false (Commit state retention rules?)" +set help(power,load_ieee1801,ieee1801_file) "File name" +set help(power,load_ieee1801,ieee1801_isolation) "TRUE or false (Commit isolation rules?)" +set help(power,load_ieee1801,ieee1801_keep_rows) "TRUE or false (Keep rows?)" +set help(power,load_ieee1801,ieee1801_level_shifter) "TRUE or false (Commit level shifter rules?)" +set help(power,load_ieee1801,ieee1801_power_domain) "TRUE or false (Commit power domains?)" +set help(power,load_ieee1801,ieee1801_power_switch) "TRUE of false (Commit power switch rules?)" +set help(power,load_ieee1801,ieee1801_state_retention) "TRUE or false (Commit state retention rules?)" + +set help(power,global_net_connect,power_nets) "List of power nets" +set help(power,global_net_connect,ground_nets) "List of ground nets" +set help(power,global_net_connect,global_nets) "List of global nets" +set help(power,global_net_connect,,module) "Module for global net" +set help(power,global_net_connect,,pins) "Power pins for global net" +set help(power,global_net_connect,,tiehi) "Tiehi global net" +set help(power,global_net_connect,,tielo) "Tielo global net" + + + +# Clock +set help(cts,cts_engine) "cts CCOPT ccopt_cts" +set help(cts,cts_integration) "native scripted" +set help(cts,specify_clock_tree,cts_cells) "List of CTS cells" +set help(cts,set_ccopt_mode,cts_buffer_cells) "List of CTS buffer cells" +set help(cts,set_ccopt_mode,cts_inverter_cells) "List of CTS inverter cells" +set help(cts,set_ccopt_mode,clock_gate_cells) "List of CTS clock gate cells" +set help(cts,set_ccopt_mode,cts_use_inverters) "true false" +set help(cts,set_cts/ccopt_mode,clk_leaf_bottom_layer) "Layer number" +set help(cts,set_cts/ccopt_mode,clk_leaf_top_layer) "Layer number" +set help(cts,set_cts/ccopt_mode,clk_leaf_extra_space) "Integer (tracks)" +set help(cts,set_cts/ccopt_mode,clk_leaf_ndr) "Valid NDR name" +set help(cts,set_ccopt_mode,clk_max_skew) "Float (nanoseconds)" +set help(cts,set_ccopt_mode,clk_max_slew) "Float (nanoseconds)" +set help(cts,set_cts/ccopt_mode,clk_tree_bottom_layer) "Layer number" +set help(cts,set_cts/ccopt_mode,clk_tree_top_layer) "Layer number" +set help(cts,set_cts/ccopt_mode,clk_tree_extra_space) "Integer (tracks)" +set help(cts,set_cts/ccopt_mode,clk_tree_ndr) "Valid NDR name" +set help(cts,set_ccopt_mode,clk_tree_shield_net) "Global shield net" +set help(cts,set_ccopt_mode,clk_tree_shield_thresh) "Unused at the moment" +set help(cts,set_cts/ccopt_mode,update_io_latency) "Adjust IO latencies" +set help(flow,ccopt_design,postcts_setup_hold) "true FALSE" +set help(cts,ck_eco,clock_eco) "true FALSE" +set help(cts,set_design_mode,flow_effort) "express STANDARD extreme" +set help(cts,set_design_mode,power_effort) "true FALSE" + +# Opt +set help(opt,set_opt_mode,all_end_points) "true FALSE" +set help(place,set_place_mode,clock_gate_aware_opt) "true FALSE" +set help(opt,set_opt_mode,critical_range) "true FALSE" +set help(opt,set_opt_mode,congestion_effort) "low medium high AUTO" +set help(opt,set_opt_mode,dynamic_power_effort) "low high" +set help(opt,set_opt_mode,leakage_power_effort) "low high" +set help(opt,set_opt_mode,preserve_assertions) "true FALSE" +set help(opt,set_opt_mode,resize_shifter_and_iso_insts) "true FALSE" +set help(opt,set_opt_mode,fix_hold_allow_tns_degradation) "true FALSE" +set help(opt,set_opt_mode,fix_hold_ignore_ios) "true FALSE" +set help(opt,set_opt_mode,useful_skew) "true FALSE" +set help(opt,set_design_mode,flow_effort) "express STANDARD extreme" +set help(opt,set_design_mode,power_effort) "true FALSE" + +# Hold +set help(flow,none,fix_hold) "TRUE false" +set help(flow,ccopt_design,postcts_setup_hold) "true FALSE" +set help(flow,opt_design,postroute_setup_hold) "TRUE false" +set help(hold,set_opt_mode,fix_hold_allow_tns_degradation) "true FALSE" +set help(hold,set_opt_mode,fix_hold_ignore_ios) "true FALSE" +set help(hold,set_analysis_view,active_hold_views) "List of active hold views" +set help(hold,set_analysis_view,,active_hold_views) "List of active hold views per step" +set help(mmmc,set_analysis_view,default_setup_view) "Default setup view" +set help(hold,set_analysis_view,default_hold_view) "Default hold view" + +# Route +set help(route,set_nanoroute_mode,multi_cut_effort) "MEDIUM high" +set help(route,set_nanoroute_mode,litho_driven_routing) "true FALSE" +set help(route,set_nanoroute_mode,postroute_spread_wires) "true FALSE" +set help(route,set_cts_mode,route_clock_nets) "TRUE false" +set help(route,set_pg_pin_use_signal_route,secondary_pg,cell_pin_pairs) "List of cell:pin pairs" +set help(route,route_pg_pin_use_signal_route,route_secondary_pg_nets) "true FALSE" +set help(route,route_pg_pin_use_signal_route,secondary_pg_nets) "List of global nets for secondary power/ground" +set help(route,route_design,in_route_opt) "FALSE true" + +# Extraction +set help(extract,set_extract_rc_mode,postroute_extraction_effort) "LOW medium high" +set help(extract,set_extract_rc_mode,signoff_extraction_effort) "low medium HIGH" +set help(extract,set_extract_rc_mode,coupling_c_thresh) "Float" +set help(extract,set_extract_rc_mode,total_c_thresh) "Float" +set help(extract,set_extract_rc_mode,relative_c_thresh) "Float" + +# DFM +set help(dfm,verify_litho,verify_litho) "true FALSE" +set help(dfm,verify_litho,lpa_tech_file) "LPA tech file" +set help(dfm,trim_metal_fill,metalfill) "true FALSE" +set help(dfm,none,metalfill_tcl) "Metalfill plug-in" +set help(dfm,streamOut,gds_files) "GDS file list" +set help(dfm,streamOut,gds_layer_map) "GDS layer map" +set help(dfm,oasisOut,gds_files) "Oasis file list" +set help(dfm,oasisOut,gds_layer_map) "Oasis layer map" + +# Noise +set help(noise,set_si_mode,si_analysis_type) "DEFAULT pessimistic" +set help(noise,set_si_mode,delta_delay_threshold) "Float (nanoseconds)" +set help(noise,set_si_mode,acceptable_wns) "Float (nanoseconds)" + +# Database +set help(dbs,none,dbs_dir) "Database directory" +set help(dbs,save_design,dbs_format) "FE oa" +set help(dbs,save_design,oa_layout_name) "OA Layout view name" +set help(dbs,save_design,oa_abstract_name) "OA Abstract view name" +set help(dbs,save_design,save_constraints) "true FALSE (Save constraints with DBS?)" +set help(dbs,save_design,save_rc) "true FALSE (Save RCDB with DBS?)" + +# Reporting +set help(report,none,rpt_dir) "Reports directory" +set help(report,none,report_power) "TRUE false" +set help(report,none,report_run_time) "TRUE false" +set help(report,none,report_system_info) "true FALSE" +#set help(report,flow_summary) +set help(report,none,capture_metrics) "true FALSE" +set help(report,none,check_setup) "TRUE false" +set help(report,none,html_summary) "HTML summary file" +set help(report,none,time_info_db) "Time info DB file" +set help(report,none,time_info_rpt) "Time info report file" + + +# Misc +set help(misc,mail,to) "Mail addresses" +set help(misc,mail,steps) "List of steps" + +set help(misc,none,plug_dir) "Plug-in directory" +set help(misc,none,tmp_dir) "TMP directory" +set help(misc,none,log_dir) "LOG directory" + +set help(misc,none,version) "Innovus version" +set help(misc,none,vpath) "Make semaphore directory" +set help(misc,none,pac_scratch_dir) "PAC scratch directory (PAC_SCRATCH_DIR)" +set help(misc,none,partition_dir) "PARTITION directory" + +set help(misc,none,abutted_design) "Abutted hierarchical design flow" +set help(misc,none,insert_feedthrough) "Insert feedthrough during hierarchical flows" +set help(misc,set_budget_mode,budget_mode) "TRIAL_IPO, giga_opt, ps_pm" +set help(misc,none,use_ps_pm) "Use ps per micron during hierarchical flows" +set help(misc,none,enable_flexilm) "Enable the flexIlm hierarchical flow" +set help(misc,none,use_flexmodels) "Use flexModels during hierarchical flow" +set help(misc,none,flexmodel_as_ptn) "Treat flexModels as partitions" +set help(misc,none,flexmodel_art_based) "Treat flexModels as ART" + +set help(distribute,set_distribute_host,distribute) "LOCAL lsf rsh custom" +set help(distribute,set_multi_cpu_usage,local_cpus) "List of hosts" +set help(distribute,set_multi_cpu_usage,remote_hosts) "Integer (number of hosts)" +set help(distribute,set_multi_cpu_usage,cpus_per_remote_host) "Integer (number of cpus)" +set help(distribute,set_distribute_host,lsf,queue) "LSF queue" +set help(distribute,set_distribute_host,lsf,resource) "LSF resources" +set help(distribute,set_distribute_host,lsf,args) "LSF args" +set help(distribute,set_distribute_host,rsh,host_list) "List of hosts" +set help(distribute,set_distribute_host,custom,script) "Custom launch script" + +set help(make,make,make_tool) "Encounter executable" +set help(make,make,make_tool_args) "Encounter args" +set help(make,make,make_syn_tool) "RC executable" +set help(make,make,make_syn_tool_args) "RC args" +set help(make,make,make_browser) "Browser" + +set help(hier,categories) hier +set help(hier,none,paritition_list) "List of partitions" +set help(hier,none,hier_flow_type) "1pass 2pass" +set help(hier,none,black_box) "TRUE false" +set help(hier,insert_partition_feedthrough,insert_feedthrough) "TRUE false" +set help(hier,set_place_mode,placement_based_ptn) "true FALSE" +set help(hier,create_proto_model,use_flexmodels) "true FALSE" +set help(hier,create_ps_per_micron_model,use_proto_net_delay_model) "true FALSE" +set help(hier,derive_timing_budget,budget_mode) "trial_ipo proto_net_delay_model giga_opt" +set help(hier,replace_proto_model,flexmodel_as_ptn) "true FALSE" +set help(hier,create_proto_model,flexmodel_art_based) "true FALSE" +set help(hier,set_design_mode,use_nrgr) "true FALSE" + diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/novus_udm.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/novus_udm.tcl new file mode 100755 index 000000000..3d0acffad --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/novus_udm.tcl @@ -0,0 +1,169 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### +if {[info exists vars(netlist)]} { + set init(verilog) $vars(netlist) +} +if {[info exists vars(set_top_module)]} { + set init(design_settop) $vars(set_top_module) +} +if {[info exists vars(design)]} { + set init(top_cell) $vars(design) +# set init(topcell) $vars(design) +} +#set init(netlist_type) $vars(netlist_type) +if {[info exists vars(oa_design_lib)]} { + set init(oa_lib) $vars(oa_design_lib) +} +if {[info exists vars(oa_design_cell)]} { + set init(oa_cell) $vars(oa_design_cell) +} +if {[info exists vars(oa_design_view)]} { + set init(oa_view) $vars(oa_design_view) +} +if {[info exists vars(oa_ref_lib)]} { + set init(oa_ref_lib) $vars(oa_ref_lib) +} +if {[info exists vars(oa_abstract_name)]} { + set init(abstract_view) $vars(oa_abstract_name) +} +if {[info exists vars(oa_abstract_view)]} { + set init(abstract_view) $vars(oa_abstract_view) +} +if {[info exists vars(oa_layout_name)]} { + set init(layout_view) $vars(oa_layout_name) +} +if {[info exists vars(oa_layout_view)]} { + set init(layout_view) $vars(oa_layout_view) +} +if {[info exists vars(power_nets)]} { + set init(pwr_net) $vars(power_nets) +} +if {[info exists vars(ground_nets)]} { + set init(gnd_net) $vars(ground_nets) +} +set init(mmmc_file) $vars(script_dir)/view_definition.tcl +if {[info exists vars(cpf_file)]} { + set init(cpf_file) $vars(cpf_file) +} +if {[info exists vars(io_file)]} { + set init(io_file) $vars(io_file) +} +if {[info exists vars(lef_files)] && $vars(lef_files) != "NONE"} { + set init(lef_file) $vars(lef_files) +} +if {[info exists vars(cap_unit)]} { + set init(cap_unit) $vars(cap_unit) +} +if {[info exists vars(time_unit)]} { + set init(time_unit) $vars(time_unit) +} +if {[lindex [split $vars(version) "."] 0] <= 14} { + if {[info exists vars(assign_buffer)]} { + if {($vars(assign_buffer) != 1) && ([string tolower $vars(assign_buffer)] != "true") && \ + ([string tolower $vars(assign_buffer)] != "false") && ($vars(assign_buffer) != 0)} { + if {[llength $vars(assign_buffer)] == 1} { + set init(assign_buffer) "1 -buffer $vars(assign_buffer)" + } else { + set init(assign_buffer) $vars(assign_buffer) + } + } else { + set init(assign_buffer) $vars(assign_buffer) + } + } +} + +if {[info exists vars(buf_footprint)]} { + set opt(buf_footprint) $vars(buf_footprint) +} +if {[info exists vars(inv_footprint)]} { + set opt(inv_footprint) $vars(inv_footprint) +} +if {[info exists vars(del_footprint)]} { + set opt(delay_footprint) $vars(del_footprint) +} +if {[info exists vars(cts_cell_footprint)]} { + set cts(cts_cell_footprint) $vars(cts_cell_footprint) +} +if {[info exists vars(cts_cell_list)]} { + set cts(cell_list) $vars(cts_cell_list) +} +if {[info exists vars(delay_limit)]} { + set delaycal(delay_limit) $vars(delay_limit) +} +if {[info exists vars(default_net_delay)]} { + set delaycal(net_delay) $vars(default_net_delay) +} +if {[info exists vars(default_net_load)]} { + set delaycal(net_load) $vars(default_net_load) +} +if {[info exists vars(default_slew)]} { + set delaycal(in_tran_delay) $vars(default_slew) +} +if {[info exists vars(exclude_nets)]} { + set delaycal(exclude_net) $vars(exclude_nets) +} +if {[info exists vars(delay_limit)]} { + set delaycal(use_default_delay_limit) $vars(delay_limit) +} +if {[info exists vars(default_net_delay)]} { + set delaycal(default_net_delay) $vars(default_net_delay) +} +if {[info exists vars(default_net_load)]} { + set delaycal(default_net_load) $vars(default_net_load) +} +if {[info exists vars(input_transition_delay)]} { + set delaycal(input_transition_delay) $vars(input_transition_delay) +} + +if {[info exists vars(shrink_factor)]} { + set extract(shrink_factor) $vars(shrink_factor) +} + +# init_oa_search_lib + +# conf variables? +#rda_Input(ui_ilmdir) Specifies the directory from which to read the ILM files. +#rda_Input(ui_fmdir) Specified the flex model dir +#rda_Input(ui_conf_oa_oa2lefversion) For native oa2lef translator. +#keep_files keeps temp files +#RTL Compiler Related (in use) +#set rda_Input(ui_netlisttype) {RTL} +#rda_Input(ui_rtl_verilog_list) +#set rda_Input(ui_rtl_verilog_version) +#set rda_Input(ui_rtl_verilog_case) {orig} +#set rda_Input(ui_rtl_vhdl_list) {} +#set rda_Input(ui_rtl_vhdl_version) +#set rda_Input(ui_rtl_vhdl_case) {orig} +#rda_Input(ui_rtllist) +#rda_Input(ui_rtl_path) diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/overlay.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/overlay.tcl new file mode 100755 index 000000000..8c0ca77e6 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/overlay.tcl @@ -0,0 +1,506 @@ + proc create_rc_corner {args} { + global vars + + ff_map::seed_options "create_rc_corner $args" + } + + proc create_library_set {args} { + global vars + + ff_map::seed_options "create_library_set $args" + } + + proc create_timing_condition {args} { + global vars + + ff_map::seed_options "create_timing_condition $args" + } + + proc create_delay_corner {args} { + global vars + + ff_map::seed_options "create_delay_corner $args" + } + + proc update_delay_corner {args} { + global vars + + ff_map::seed_options "update_delay_corner $args" + } + + proc create_constraint_mode {args} { + global vars + + ff_map::seed_options "create_constraint_mode $args" + } + + proc create_analysis_view {args} { + global vars + + ff_map::seed_options "create_analysis_view $args" + } + + proc set_analysis_view {args} { + global vars + + ff_map::seed_options "set_analysis_view $args" + } + + proc all_analysis_views {} { + return "" + } + + proc set_power_analysis_view {args} { + global vars + + ff_map::seed_options "set_power_analysis_view $args" + } + +namespace eval ff_map { + + proc seed_options {command_string} { + + global vars + + set command [lindex $command_string 0] + set args [lreplace $command_string 0 0] + + switch $command { + setMultiCpuUsage { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + localCpu { + set vars(local_cpus) [lindex $args 0] + set args [lreplace $args 0 0] + } + remoteHosts { + set vars(remote_hosts) [lindex $args 0] + set args [lreplace $args 0 0] + } + cpuPerRemoteHost { + set vars(cpu_per_remote_host) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setDesignMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + process { + set vars(process) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setDelayCalMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + engine { + if {[string tolower [lindex $args 0] == "aae"} { + set vars(enable_si_aware) true + set args [lreplace $args 0 0] + } + if {[string tolower [lindex $args 0] == "signalstorm"} { + set vars(enable_ss) true + set args [lreplace $args 0 0] + } + } + } + } + } + setAnalysisMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + cppr { + set vars(enable_cppr) [lindex $args 0] + set args [lreplace $args 0 0] + } + aocv { + set vars(enable_aocv) [lindex $args 0] + set args [lreplace $args 0 0] + } + onChipVariation { + set vars(enable_ocv) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setPlaceMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + placeIoPins { + set vars(place_io_pins) [lindex $args 0] + set args [lreplace $args 0 0] + } + congEffort { + set vars(congestion_effort) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setOptMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + allEndPoints { + set vars(all_end_points) [lindex $args 0] + set args [lreplace $args 0 0] + } + preserveAsssertions { + set vars(preserve_assertions) [lindex $args 0] + set args [lreplace $args 0 0] + } + leakagePowerEffort { + set vars(leakage_power_effort) [lindex $args 0] + set args [lreplace $args 0 0] + } + dynamicPowerEffort { + set vars(leakage_power_effort) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setCTSMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + routeClkNets { + set vars(route_clock_nets) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setFillerMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + core { + set vars(filler_cells) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setNanoRouteMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + drouteMultiCutViaEffort { + set vars(multi_cut_effort) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + create_rc_corner { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set rc_corner [lindex $args 0] + puts " ( Found rc corner $rc_corner )" + if {![info exists vars(rc_corners)]} { + set vars(rc_corners) [list $rc_corner] + } else { + if {[lsearch $vars(rc_corners) $rc_corner] == -1} { + lappend vars(rc_corners) $rc_corner + } + } + set args [lreplace $args 0 0] + } + -T { + set vars($rc_corner,T) [lindex $args 0] + set args [lreplace $args 0 0] + } + -Temperature { + set vars($rc_corner,T) [lindex $args 0] + set args [lreplace $args 0 0] + } + -cap_table { + set vars($rc_corner,cap_table) [lindex $args 0] + set args [lreplace $args 0 0] + } + -atf_table { + set vars($rc_corner,atf_table) [lindex $args 0] + set args [lreplace $args 0 0] + } + -qx_tech_file { + set vars($rc_corner,qx_tech_file) [lindex $args 0] + set args [lreplace $args 0 0] + } + -qrc_tech { + set vars($rc_corner,qx_tech_file) [lindex $args 0] + set args [lreplace $args 0 0] + } + -preRoute_res { + set vars($rc_corner,pre_route_res_factor) [lindex $args 0] + } + -preRoute_cap { + set vars($rc_corner,pre_route_cap_factor) [lindex $args 0] + } + -preRoute_clkres { + set vars($rc_corner,pre_route_clk_res_factor) [lindex $args 0] + } + -preRoute_clkcap { + set vars($rc_corner,pre_route_clk_cap_factor) [lindex $args 0] + } + -postRoute_res { + set vars($rc_corner,post_route_res_factor) [lindex $args 0] + } + -postRoute_cap { + set vars($rc_corner,post_route_cap_factor) [lindex $args 0] + } + -postRoute_res { + set vars($rc_corner,post_route_clk_res_factor) [lindex $args 0] + } + -postRoute_clkcap { + set vars($rc_corner,post_route_clk_cap_factor) [lindex $args 0] + } + -postRoute_clkres { + set vars($rc_corner,post_route_clk_res_factor) [lindex $args 0] + } + -postRoute_xcap { + set vars($rc_corner,post_route_xcap_factor) [lindex $args 0] + } + } + } + } + create_library_set { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set library_set [lindex $args 0] + puts " ( Found library set $library_set )" + if {![info exists vars(library_sets)]} { + set vars(library_sets) [list $library_set] + } else { + if {[lsearch $vars(library_sets) $library_set] == -1} { + lappend vars(library_sets) $library_set + } + } + set args [lreplace $args 0 0] + } + -timing { + set vars($library_set,timing) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + create_timing_condition { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set timing_condition [lindex $args 0] + puts " ( Found timing condition $timing_condition )" + if {![info exists vars(timing_conditions)]} { + set vars(timing_conditions) $timing_condition + } else { + if {[lsearch $vars(timing_conditions) $timing_condition] == -1} { + lappend vars(timing_conditions) [list $timing_condition] + } + } + set args [lreplace $args 0 0] + } + -library_set { + set vars($timing_condition,library_set) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + create_delay_corner { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set delay_corner [lindex $args 0] + puts " ( Found delay corner $delay_corner )" + if {![info exists vars(delay_corners)]} { + set vars(delay_corners) $delay_corner + } else { + if {[lsearch $vars(delay_corners) $delay_corner] == -1} { + lappend vars(delay_corners) [list $delay_corner] + } + } + set args [lreplace $args 0 0] + } + -timing_condition { + set vars($delay_corner,timing_condition) [lindex $args 0] + set args [lreplace $args 0 0] + } + -rc_corner { + set vars($delay_corner,rc_corner) [lindex $args 0] + set args [lreplace $args 0 0] + } + -library_set { + set vars($delay_corner,library_set) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + update_delay_corner { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set delay_corner [lindex $args 0] + puts " ( Found delay corner $delay_corner )" + if {![info exists vars(delay_corners)]} { + set vars(delay_corners) $delay_corner + } else { + if {[lsearch $vars(delay_corners) $delay_corner] == -1} { + lappend vars(delay_corners) [list $delay_corner] + } + } + set args [lreplace $args 0 0] + } + -timing_condition { + set vars($delay_corner,timing_condition) [lindex $args 0] + set args [lreplace $args 0 0] + } + -rc_corner { + set vars($delay_corner,rc_corner) [lindex $args 0] + set args [lreplace $args 0 0] + } + -power_domain { + if {![info exists vars($delay_corner,power_domains)]} { + set vars($delay_corner,power_domains) [lindex $args 0] + } else { + lappend vars($delay_corner,power_domains) [lindex $args 0] + } + if {![info exists vars(power_domains)]} { + set vars(power_domains) [lindex $args 0] + } else { + if {[lsearch $vars(power_domains) [lindex $args 0]] == -1} { + lappend vars(power_domains) [lindex $args 0] + } + } + set args [lreplace $args 0 0] + puts " ( Found power domain $delay_corner )" + if {![info exists vars(delay_corners)]} { + set vars(delay_corners) $delay_corner + } else { + if {[lsearch $vars(delay_corners) $delay_corner] == -1} { + lappend vars(delay_corners) [list $delay_corner] + } + } + } + } + } + } + create_constraint_mode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set constraint_mode [lindex $args 0] + puts " ( Found constraint mode $constraint_mode )" + if {![info exists vars(constraint_modes)]} { + set vars(constraint_modes) [list $constraint_mode] + } else { + if {[lsearch $vars(constraint_modes) $constraint_mode] == -1} { + lappend vars(constraint_modes) $constraint_mode + } + } + set args [lreplace $args 0 0] + } + -sdc_files { + set vars($constraint_mode,sdc_files) [lindex $args 0] + set vars($constraint_mode,pre_cts_sdc) [lindex $args 0] + set args [lreplace $args 0 0] + } + -ilm_sdc_files { + set vars($constraint_mode,ilm_sdc_files) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + create_analysis_view { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set analysis_view [lindex $args 0] + if {![info exists vars(analysis_views)]} { + set vars(analysis_views) [list $analysis_view] + } else { + if {[lsearch $vars(analysis_views) $analysis_view] == -1} { + lappend vars(analysis_views) $analysis_view + } + } + set args [lreplace $args 0 0] + } + -constraint_mode { + set vars($analysis_view,constraint_mode) [lindex $args 0] + set args [lreplace $args 0 0] + } + -delay_corner { + set vars($analysis_view,delay_corner) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + set_analysis_view { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -setup { + set vars(setup_analysis_views) [lindex $args 0] + set args [lreplace $args 0 0] + } + -hold { + set vars(hold_analysis_views) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + if {![info exists vars(active_setup_views)]} { + set vars(active_setup_views) $vars(setup_analysis_views) + } + if {![info exists vars(active_hold_views)]} { + set vars(active_hold_views) $vars(hold_analysis_views) + } + if {![info exists vars(default_setup_view)]} { + set vars(default_setup_view) [lindex $vars(setup_analysis_views) 0] + } + if {![info exists vars(default_hold_view)]} { + set vars(default_hold_view) [lindex $vars(hold_analysis_views) 0] + } + } + } + } +} diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/rda_defaults.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/rda_defaults.tcl new file mode 100755 index 000000000..c6adef0c6 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/rda_defaults.tcl @@ -0,0 +1,115 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### +if {[lindex [split $vars(version) "."] 0] > 10} { + if {[lindex [split $vars(version) "."] 0] < 15} { + set rda_defaults(assign_buffer) {1} + } + set rda_defaults(import_mode) {-treatUndefinedCellAsBbox 0 -keepEmptyModule 1 -useLefDef56 1 } + set rda_defaults(uniquify_netlist) {1} +} else { + set rda_defaults(assign_buffer) {1} + set rda_defaults(shr_scale) {1.0} + set rda_defaults(delay_limit) {1000} + set rda_defaults(default_net_delay) {1000.0ps} + set rda_defaults(default_net_load) {0.5pf} + set rda_defaults(default_slew) {0ps} + set rda_defaults(flip_first_row) {1} + set rda_defaults(core_control) {aspect} + set rda_defaults(import_mode) {-treatUndefinedCellAsBbox 0 -keepEmptyModule 1 -useLefDef56 1 } + set rda_defaults(core_util) {0.7} + if {[info exists vars(netlist_type)]} { + set rda_defaults(netlist_type) $vars(netlist_type) + } else { + set rda_defaults(netlist_type) Verilog + } + set rda_defaults(uniquify_netlist) {1} + set rda_defaults(rtl_list) "" + set rda_defaults(ilm_dir) "" + set rda_defaults(ilm_list) "" + set rda_defaults(ilm_spef) "" + set rda_defaults(set_top_cell) {0} + set rda_defaults(celllib) "" + set rda_defaults(io_lib) "" + set rda_defaults(area_io_lib) "" + set rda_defaults(blk_lib) "" + set rda_defaults(kbox_lib) "" + set rda_defaults(oa2lefversion) {} + set rda_defaults(view_definition_file) "" + set rda_defaults(smod_def) "" + set rda_defaults(smod_data) "" + set rda_defaults(locv_lib) "" + set rda_defaults(data_path) "" + set rda_defaults(tech_file) "" + set rda_defaults(io_file) "" + set rda_defaults(latency_file) "" + set rda_defaults(scheduling_file) "" + set rda_defaults(buf_footprint) {} + set rda_defaults(del_footprint) {} + set rda_defaults(inv_footprint) {} + set rda_defaults(cts_cell_footprint) {} + set rda_defaults(cts_cell_list) {} + set rda_defaults(aspect_ratio) {1.0} + set rda_defaults(core_height) {} + set rda_defaults(core_width) {} + set rda_defaults(core_to_left) {} + set rda_defaults(core_to_right) {} + set rda_defaults(core_to_top) {} + set rda_defaults(core_to_bottom) {} + set rda_defaults(max_io_height) {0} + set rda_defaults(row_height) {} + set rda_defaults(hor_track_half_pitch) {0} + set rda_defaults(ver_track_half_pitch) {1} + set rda_defaults(io_orientation) {R0} + set rda_defaults(center_origin) {0} + set rda_defaults(vertical_rows) {0} + set rda_defaults(exclude_nets) "" + set rda_defaults(time_unit) {none} + set rda_defaults(cap_unit) {} + set rda_defaults(oa_ref_lib) "" + set rda_defaults(oa_abstract_name) {} + set rda_defaults(oa_layout_name) {} + set rda_defaults(oa_design_lib) {} + set rda_defaults(oa_design_cell) {} + set rda_defaults(oa_design_view) {} + set rda_defaults(signalstorm_lib) "" + set rda_defaults(echo_file,min) "" + set rda_defaults(echo_file,max) "" + set rda_defaults(echo_file) "" + set rda_defaults(xtalk_twf_file) "" + set rda_defaults(double_back) {1} + set rda_defaults(gen_footprint) {0} + set rda_defaults(pwrnet) "" + set rda_defaults(gndnet) "" + set rda_defaults(gds_files) "" +} diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/rename.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/rename.tcl new file mode 100755 index 000000000..402fde2dc --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/rename.tcl @@ -0,0 +1,444 @@ +if {![info exists vars(lint)]} { + set vars(lint) 0 +} + +# Overload command behavior + +catch {rename setDesignMode setDesignModeOrig} +catch {rename setDelayCalMode setDelayCalModeOrig} +catch {rename setTieHiLoMode setTieHiLoModeOrig} +catch {rename setPlaceMode setPlaceModeOrig} +catch {rename setCTSMode setCTSModeOrig} +catch {rename setCCOptMode setCCOptModeOrig} +catch {rename setFillerMode setFillerModeOrig} +catch {rename setNanoRouteMode setNanoRouteModeOrig} +catch {rename setExtractRCMode setExtractRCModeOrig} +catch {rename setSIMode setSIModeOrig} + +catch {rename create_library_set create_library_set_orig} +catch {rename create_rc_corner create_rc_corner_orig} +catch {rename create_delay_corner create_delay_corner_orig} +catch {rename create_constraint_mode create_constraint_mode_orig} +catch {rename create_analysis_view create_analysis_view_orig} + +proc setDesignMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setDesignMode $args" + } else { + setDesignModeOrig $args + } +} +proc setDelayCalMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setDelayCalMode $args" + } else { + setDelayCalModeOrig $args + } +} +proc setTieHiLoMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setTieHiLoMode $args" + } else { + setTieHiLoModeOrig $args + } +} +proc setPlaceMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setPlaceMode $args" + } else { + setPlaceModeOrig $args + } +} +proc setCTSMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setCTSMode $args" + } else { + setCTSModeOrig $args + } +} +proc setCCOptMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setCCOptMode $args" + } else { + setCCOptModeOrig $args + } +} +proc setFillerMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setFillerMode $args" + } else { + setFillerModeOrig $args + } +} +proc setNanoRouteMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setNanoRouteMode $args" + } else { + setNanoRouteModeOrig $args + } +} +proc setExtractRCMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setExtractRCMode $args" + } else { + setExtractRCModeOrig $args + } +} +proc setSIMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setSIMode $args" + } else { + setSIModeOrig $args + } +} + +proc create_rc_corner {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_options "create_rc_corner $args" + } else { + create_library_set $args + } +} + +proc create_library_set {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_options "create_library_set $args" + } else { + create_library_set $args + } +} + +proc create_delay_corner {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_options "create_delay_corner $args" + } else { + create_delay_corner $args + } +} + +proc create_constraint_mode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_options "create_constraint_mode $args" + } else { + create_constraint_mode $args + } +} + +proc create_analysis_view {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_options "create_analysis_view $args" + } else { + create_analysis_view $args + } +} + +namespace eval ff_edi { + + proc seed_options {command_string} { + + global vars + + set command [lindex $command_string 0] + set args [lreplace $command_string 0 0] + + switch $command { + setDesignMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + process { + set vars(process) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setPlaceMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + placeIoPins { + set vars(place_io_pins) [lindex $args 0] + set args [lreplace $args 0 0] + } + congEffort { + set vars(congestion_effort) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setOptMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + allEndPoints { + set vars(all_end_points) [lindex $args 0] + set args [lreplace $args 0 0] + } + preserveAsssertions { + set vars(preserve_assertions) [lindex $args 0] + set args [lreplace $args 0 0] + } + leakagePowerEffort { + set vars(leakage_power_effort) [lindex $args 0] + set args [lreplace $args 0 0] + } + dynamicPowerEffort { + set vars(leakage_power_effort) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setCTSMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + routeClkNets { + set vars(route_clock_nets) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setNanoRouteMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + drouteMultiCutViaEffort { + set vars(multi_cut_effort) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + create_rc_corner { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set rc_corner [lindex $args 0] + Puts " Found rc corner $rc_corner" + if {![info exists vars(rc_corners)]} { + set vars(rc_corners) $rc_corner + } else { + append vars(rc_corners) $rc_corner + } + set args [lreplace $args 0 0] + } + -T { + set vars($rc_corner,T) [lindex $args 0] + set args [lreplace $args 0 0] + } + -cap_table { + set vars($rc_corner,cap_table) [lindex $args 0] + set args [lreplace $args 0 0] + } + -qx_tech_file { + set vars($rc_corner,qx_tech_file) [lindex $args 0] + set args [lreplace $args 0 0] + } + -preRoute_res { + set vars($rc_corner,pre_route_res_factor) [lindex $args 0] + } + -preRoute_cap { + set vars($rc_corner,pre_route_cap_factor) [lindex $args 0] + } + -preRoute_clkres { + set vars($rc_corner,pre_route_clk_res_factor) [lindex $args 0] + } + -preRoute_clkcap { + set vars($rc_corner,pre_route_clk_cap_factor) [lindex $args 0] + } + -postRoute_res { + set vars($rc_corner,post_route_res_factor) [lindex $args 0] + } + -postRoute_cap { + set vars($rc_corner,post_route_cap_factor) [lindex $args 0] + } + -postRoute_res { + set vars($rc_corner,post_route_clk_res_factor) [lindex $args 0] + } + -postRoute_clkcap { + set vars($rc_corner,post_route_clk_cap_factor) [lindex $args 0] + } + -postRoute_clkres { + set vars($rc_corner,post_route_clk_res_factor) [lindex $args 0] + } + -postRoute_xcap { + set vars($rc_corner,post_route_xcap_factor) [lindex $args 0] + } + } + } + } + create_library_set { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set library_set [lindex $args 0] + Puts " Found library set $library_set" + if {![info exists vars(library_sets)]} { + set vars(library_sets) $library_set + } else { + append vars(library_sets) $library_set + } + set args [lreplace $args 0 0] + } + -timing { + set vars($library_set,timing) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + create_delay_corner { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set delay_corner [lindex $args 0] + Puts " Found delay corner $delay_corner" + if {![info exists vars(delay_corners)]} { + set vars(delay_corners) $delay_corner + } else { + append vars(delay_corners) $delay_corner + } + set args [lreplace $args 0 0] + } + -library_set { + set vars($delay_corner,library_set) [lindex $args 0] + set args [lreplace $args 0 0] + } + -rc_corner { + set vars($delay_corner,rc_corner) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + create_constraint_mode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set constraint_mode [lindex $args 0] + Puts " Found constraint mode $constraint_mode" + if {![info exists vars(constraint_modes)]} { + set vars(constraint_modes) $constraint_mode + } else { + append vars(delay_corners) $constraint_mode + } + set args [lreplace $args 0 0] + } + -sdc_files { + set vars($constraint_mode,sdc_files) [lindex $args 0] + set vars($constraint_mode,pre_cts_sdc) [lindex $args 0] + set args [lreplace $args 0 0] + } + -ilm_sdc_files { + set vars($constraint_mode,ilm_sdc_files) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + create_analysis_view { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set analysis_view [lindex $args 0] + if {![info exists vars(constraint_modes)]} { + set vars(analysis_views) $analysis_view + } else { + append vars(analysis_views) $analysis_view + } + set args [lreplace $args 0 0] + } + -constraint_mode { + set vars($analysis_view,constraint_mode) [lindex $args 0] + set args [lreplace $args 0 0] + } + -delay_corner { + set vars($analysis_view,delay_corner) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + } + } + + proc seed_commands {command_string} { + + global vars + + set command [lindex $command_string 0] + set args [lreplace $command_string 0 0] + + Puts " Processing mode commands $command ..." + + switch $command { + setDesignMode { + set vars(set_design_mode) $command_string + } + setTieHiLoMode { + set vars(set_tiehilo_mode) $command_string + } + setPlaceMode { + set vars(set_place_mode) $command_string + } + setDelayCalMode { + set vars(set_delay_cal_mode) $command_string + } + setOptMode { + set vars(set_opt_mode) $command_string + } + setCTSMode { + set vars(set_cts_mode) $command_string + } + setCCOptMode { + set vars(set_ccopt_mode) $command_string + } + setFillerMode { + set vars(set_filler_mode) $command_string + } + setNanoRouteMode { + set vars(set_route_mode) $command_string + } + setExtractRCMode { + set vars(set_extract_rc_mode) $command_string + } + setSIMode { + set vars(set_si_mode) $command_string + } + } + } +} diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/rubicon.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/rubicon.tcl new file mode 100755 index 000000000..bde228978 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/rubicon.tcl @@ -0,0 +1,636 @@ +set r [catch {info level [expr [info level] -1]} e] + +if {$r} { + + set vars(lint) 1 +# Overload command behavior + catch {rename setDesignMode setDesignModeOrig} + catch {rename setAnalysisMode setAnalysisModeOrig} + catch {rename setDelayCalMode setDelayCalModeOrig} + catch {rename setTieHiLoMode setTieHiLoModeOrig} + catch {rename setPlaceMode setPlaceModeOrig} + catch {rename setCTSMode setCTSModeOrig} + catch {rename setCCOptMode setCCOptModeOrig} + catch {rename setFillerMode setFillerModeOrig} + catch {rename setNanoRouteMode setNanoRouteModeOrig} + catch {rename setExtractRCMode setExtractRCModeOrig} + catch {rename setSIMode setSIModeOrig} + + catch {rename create_library_set create_library_set_orig} + catch {rename create_rc_corner create_rc_corner_orig} + catch {rename create_delay_corner create_delay_corner_orig} + catch {rename create_constraint_mode create_constraint_mode_orig} + catch {rename create_analysis_view create_analysis_view_orig} + catch {rename set_analysis_view set_analysis_view_orig} + catch {rename set_power_analysis_view set_power_analysis_view_orig} + + proc setDesignMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setDesignMode $args" + ff_edi::seed_options "setDesignMode $args" + } else { + setDesignModeOrig $args + } + } + proc setAnalysisMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setAnalysisMode $args" + ff_edi::seed_options "setAnalysisMode $args" + } else { + setAnalysisModeOrig $args + } + } + proc setDelayCalMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setDelayCalMode $args" + } else { + setDelayCalModeOrig $args + } + } + proc setTieHiLoMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setTieHiLoMode $args" + } else { + setTieHiLoModeOrig $args + } + } + proc setPlaceMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setPlaceMode $args" + } else { + setPlaceModeOrig $args + } + } + proc setCTSMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setCTSMode $args" + } else { + setCTSModeOrig $args + } + } + proc setCCOptMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setCCOptMode $args" + } else { + setCCOptModeOrig $args + } + } + proc setFillerMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setFillerMode $args" + } else { + setFillerModeOrig $args + } + } + proc setNanoRouteMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setNanoRouteMode $args" + } else { + setNanoRouteModeOrig $args + } + } + proc setExtractRCMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setExtractRCMode $args" + } else { + setExtractRCModeOrig $args + } + } + proc setSIMode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_commands "setSIMode $args" + } else { + setSIModeOrig $args + } + } + + proc create_rc_corner {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_options "create_rc_corner $args" + } else { + create_rc_corner_orig $args + } + } + + proc create_library_set {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_options "create_library_set $args" + } else { + create_library_set_orig $args + } + } + + proc create_delay_corner {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_options "create_delay_corner $args" + } else { + create_delay_corner_orig $args + } + } + + proc create_constraint_mode {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_options "create_constraint_mode $args" + } else { + create_constraint_mode_orig $args + } + } + + proc create_analysis_view {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_options "create_analysis_view $args" + } else { + create_analysis_view_orig $args + } + } + + proc set_analysis_view {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_options "set_analysis_view $args" + } else { + set_analysis_view_orig $args + } + } + + proc set_power_analysis_view {args} { + global vars + if {$vars(lint)} { + ff_edi::seed_options "set_power_analysis_view $args" + } else { + set_power_analysis_view $args + } + } + + namespace eval ff_edi { + + proc seed_options {command_string} { + + global vars + + set command [lindex $command_string 0] + set args [lreplace $command_string 0 0] + + switch $command { + setDesignMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + process { + set vars(process) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setDelayCalMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + engine { + if {[string tolower [lindex $args 0] == "aae"} { + set vars(enable_si_aware) true + set args [lreplace $args 0 0] + } + if {[string tolower [lindex $args 0] == "signalstorm"} { + set vars(enable_ss) true + set args [lreplace $args 0 0] + } + } + } + } + } + setAnalysisMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + cppr { + set vars(enable_cppr) [lindex $args 0] + set args [lreplace $args 0 0] + } + aocv { + set vars(enable_aocv) [lindex $args 0] + set args [lreplace $args 0 0] + } + onChipVariation { + set vars(enable_ocv) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setPlaceMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + placeIoPins { + set vars(place_io_pins) [lindex $args 0] + set args [lreplace $args 0 0] + } + congEffort { + set vars(congestion_effort) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setOptMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + allEndPoints { + set vars(all_end_points) [lindex $args 0] + set args [lreplace $args 0 0] + } + preserveAsssertions { + set vars(preserve_assertions) [lindex $args 0] + set args [lreplace $args 0 0] + } + leakagePowerEffort { + set vars(leakage_power_effort) [lindex $args 0] + set args [lreplace $args 0 0] + } + dynamicPowerEffort { + set vars(leakage_power_effort) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setCTSMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + routeClkNets { + set vars(route_clock_nets) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + setNanoRouteMode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + drouteMultiCutViaEffort { + set vars(multi_cut_effort) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + create_rc_corner { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set rc_corner [lindex $args 0] + Puts " ... Found rc corner $rc_corner" + if {![info exists vars(rc_corners)]} { + set vars(rc_corners) [list $rc_corner] + } else { + if {[lsearch $vars(rc_corners) $rc_corner] == -1} { + lappend vars(rc_corners) $rc_corner + } + } + set args [lreplace $args 0 0] + } + -T { + set vars($rc_corner,T) [lindex $args 0] + set args [lreplace $args 0 0] + } + -cap_table { + set vars($rc_corner,cap_table) [lindex $args 0] + set args [lreplace $args 0 0] + } + -atf_table { + set vars($rc_corner,atf_table) [lindex $args 0] + set args [lreplace $args 0 0] + } + -qx_tech_file { + set vars($rc_corner,qx_tech_file) [lindex $args 0] + set args [lreplace $args 0 0] + } + -preRoute_res { + set vars($rc_corner,pre_route_res_factor) [lindex $args 0] + } + -preRoute_cap { + set vars($rc_corner,pre_route_cap_factor) [lindex $args 0] + } + -preRoute_clkres { + set vars($rc_corner,pre_route_clk_res_factor) [lindex $args 0] + } + -preRoute_clkcap { + set vars($rc_corner,pre_route_clk_cap_factor) [lindex $args 0] + } + -postRoute_res { + set vars($rc_corner,post_route_res_factor) [lindex $args 0] + } + -postRoute_cap { + set vars($rc_corner,post_route_cap_factor) [lindex $args 0] + } + -postRoute_res { + set vars($rc_corner,post_route_clk_res_factor) [lindex $args 0] + } + -postRoute_clkcap { + set vars($rc_corner,post_route_clk_cap_factor) [lindex $args 0] + } + -postRoute_clkres { + set vars($rc_corner,post_route_clk_res_factor) [lindex $args 0] + } + -postRoute_xcap { + set vars($rc_corner,post_route_xcap_factor) [lindex $args 0] + } + } + } + } + create_library_set { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set library_set [lindex $args 0] + Puts " ... Found library set $library_set" + if {![info exists vars(library_sets)]} { + set vars(library_sets) [list $library_set] + } else { + if {[lsearch $vars(library_sets) $library_set] == -1} { + lappend vars(library_sets) $library_set + } + } + set args [lreplace $args 0 0] + } + -timing { + set vars($library_set,timing) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + create_delay_corner { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set delay_corner [lindex $args 0] + Puts " ... Found delay corner $delay_corner" + if {![info exists vars(delay_corners)]} { + set vars(delay_corners) $delay_corner + } else { + if {[lsearch $vars(delay_corners) $delay_corner] == -1} { + lappend vars(delay_corners) [list $delay_corner] + } + } + set args [lreplace $args 0 0] + } + -library_set { + set vars($delay_corner,library_set) [lindex $args 0] + set args [lreplace $args 0 0] + } + -rc_corner { + set vars($delay_corner,rc_corner) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + create_constraint_mode { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set constraint_mode [lindex $args 0] + Puts " ... Found constraint mode $constraint_mode" + if {![info exists vars(constraint_modes)]} { + set vars(constraint_modes) [list $constraint_mode] + } else { + if {[lsearch $vars(constraint_modes) $constraint_mode] == -1} { + lappend vars(constraint_modes) $constraint_mode + } + } + set args [lreplace $args 0 0] + } + -sdc_files { + set vars($constraint_mode,sdc_files) [lindex $args 0] + set vars($constraint_mode,pre_cts_sdc) [lindex $args 0] + set args [lreplace $args 0 0] + } + -ilm_sdc_files { + set vars($constraint_mode,ilm_sdc_files) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + create_analysis_view { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -name { + set analysis_view [lindex $args 0] + if {![info exists vars(analysis_views)]} { + set vars(analysis_views) [list $analysis_view] + } else { + if {[lsearch $vars(analysis_views) $analysis_view] == -1} { + lappend vars(analysis_views) $analysis_view + } + } + set args [lreplace $args 0 0] + } + -constraint_mode { + set vars($analysis_view,constraint_mode) [lindex $args 0] + set args [lreplace $args 0 0] + } + -delay_corner { + set vars($analysis_view,delay_corner) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + } + set_analysis_view { + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + -setup { + set vars(setup_analysis_views) [lindex $args 0] + set args [lreplace $args 0 0] + } + -hold { + set vars(hold_analysis_views) [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + if {![info exists vars(active_setup_views)]} { + set vars(active_setup_views) $vars(setup_analysis_views) + } + if {![info exists vars(active_hold_views)]} { + set vars(active_hold_views) $vars(hold_analysis_views) + } + if {![info exists vars(default_setup_view)]} { + set vars(default_setup_view) [lindex $vars(setup_analysis_views) 0] + } + } + } + } + + proc seed_commands {command_string} { + + global vars + + set command [lindex $command_string 0] + set args [lreplace $command_string 0 0] + + Puts " Processing mode commands $command ..." + + switch $command { + setDesignMode { + set vars(set_design_mode) $command_string + } + setDelayCalMode { + set vars(set_delay_cal_mode) $command_string + } + setAnalysisMode { + set vars(set_analysis_mode) $command_string + } + setTieHiLoMode { + set vars(set_tiehilo_mode) $command_string + } + setPlaceMode { + set vars(set_place_mode) $command_string + } + setDelayCalMode { + set vars(set_delay_cal_mode) $command_string + } + setOptMode { + set vars(set_opt_mode) $command_string + } + setCTSMode { + set vars(set_cts_mode) $command_string + } + setCCOptMode { + set vars(set_ccopt_mode) $command_string + } + setFillerMode { + set vars(set_filler_mode) $command_string + } + setNanoRouteMode { + set vars(set_route_mode) $command_string + } + setExtractRCMode { + set vars(set_extract_rc_mode) $command_string + } + setSIMode { + set vars(set_si_mode) $command_string + } + } + } + } +} +proc setFlowMode {args} { + global vars + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -regexp -- $option { + log_dir { + set vars(log_dir) [lindex $args 0] + set args [lreplace $args 0 0] + Puts " ... Setting log directory to $vars(log_dir)" + } + rpt_dir { + set vars(rpt_dir) [lindex $args 0] + set args [lreplace $args 0 0] + Puts " ... Setting report directory to $vars(rpt_dir)" + } + dbs_dir { + set vars(dbs_dir) [lindex $args 0] + set args [lreplace $args 0 0] + Puts " ... Setting dbs directory to $vars(dbs_dir)" + } + cpf_timing { + set vars(cpf_timing) [lindex $args 0] + set args [lreplace $args 0 0] + } + cts_engine { + set vars(cts_engine) [lindex $args 0] + set args [lreplace $args 0 0] + } + enable_celtic_steps { + set vars(enable_celtic_steps) [lindex $args 0] + set args [lreplace $args 0 0] + } + enable_dlm { + set vars(enable_dlm) [lindex $args 0] + set args [lreplace $args 0 0] + } + fix_hold { + set vars(fix_hold) [lindex $args 0] + set args [lreplace $args 0 0] + } + fix_litho { + set vars(fix_litho) [lindex $args 0] + set args [lreplace $args 0 0] + } + mode { + set vars(mode) [lindex $args 0] + set args [lreplace $args 0 0] + } + save_constraints { + set vars(save_constraints) [lindex $args 0] + set args [lreplace $args 0 0] + } + save_rc { + set vars(save_rc) [lindex $args 0] + set args [lreplace $args 0 0] + } + skip_cts { + set vars(skip_cts) [lindex $args 0] + set args [lreplace $args 0 0] + } + skip_signoff_checks { + set vars(skip_signoff_checks) [lindex $args 0] + set args [lreplace $args 0 0] + } + steps { + set steps [lindex $args 0] + set args [lreplace $args 0 0] + } + } + } + if {[string tolower $vars(mode)] == "user"} { + if {[info exists steps]} { + set vars(steps) $steps + } + } +} diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/udm.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/udm.tcl new file mode 100755 index 000000000..5703e7fad --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/udm.tcl @@ -0,0 +1,159 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### +if {[info exists vars(netlist)]} { + set init(verilog) $vars(netlist) + set ninit(verilog) $vars(netlist) +} +if {[info exists vars(set_top_module)]} { + set init(design_settop) $vars(set_top_module) + set ninit(design_set_top) $vars(set_top_module) +} +if {[info exists vars(design)]} { + set init(top_cell) $vars(design) +} +#set init(netlist_type) $vars(netlist_type) +if {[info exists vars(oa_design_lib)]} { + set init(oa_design_lib) $vars(oa_design_lib) + set ninit(oa_design_lib) $vars(oa_design_lib) +} +if {[info exists vars(oa_design_cell)]} { + set init(oa_design_cell) $vars(oa_design_cell) + set ninit(oa_design_cell) $vars(oa_design_cell) +} +if {[info exists vars(oa_design_view)]} { + set init(oa_design_view) $vars(oa_design_view) + set ninit(oa_design_view) $vars(oa_design_view) +} +if {[info exists vars(oa_ref_lib)]} { + set init(oa_ref_lib) $vars(oa_ref_lib) + set ninit(oa_ref_lib) $vars(oa_ref_lib) +} +if {[info exists vars(oa_abstract_name)]} { + set init(abstract_name) $vars(oa_abstract_name) + set ninit(abstract_name) $vars(oa_abstract_name) +} +if {[info exists vars(oa_abstract_view)]} { + set init(abstract_view) $vars(oa_abstract_view) + set ninit(abstract_view) $vars(oa_abstract_view) +} +if {[info exists vars(oa_layout_name)]} { + set init(layout_view) $vars(oa_layout_name) + set ninit(layout_view) $vars(oa_layout_name) +} +if {[info exists vars(power_nets)]} { + set init(pwr_net) $vars(power_nets) +} +if {[info exists vars(ground_nets)]} { + set init(gnd_net) $vars(ground_nets) +} +set init(mmmc_file) $vars(script_dir)/view_definition.tcl +set ninit(mmmc_file) $vars(script_dir)/view_definition.tcl +if {[info exists vars(cpf_file)]} { + set init(cpf_file) $vars(cpf_file) + set ninit(cpf_file) $vars(cpf_file) +} +if {[info exists vars(io_file)]} { + set init(io_file) $vars(io_file) +} +if {[info exists vars(lef_files)] && $vars(lef_files) != "NONE"} { + set init(lef_file) $vars(lef_files) + set ninit(lef_file) $vars(lef_files) +} +if {[info exists vars(cap_unit)]} { + set init(cap_unit) $vars(cap_unit) +} +if {[info exists vars(time_unit)]} { + set init(time_unit) $vars(time_unit) +} + +#if {[info exists vars(assign_buffer)]} { +# if {($vars(assign_buffer) != 1) && ([string tolower $vars(assign_buffer)] != "true") && ([string tolower $vars(assign_buffer)] != "false") && ($vars(assign_buffer) != 0)} { +# if {[llength $vars(assign_buffer)] == 1} { +# set init(assign_buffer) "1 -buffer $vars(assign_buffer)" +# } else { +# set init(assign_buffer) $vars(assign_buffer) +# } +# } else { +# set init(assign_buffer) $vars(assign_buffer) +# } +#} + +if {[info exists vars(buf_footprint)]} { + set opt(buf_footprint) $vars(buf_footprint) +} +if {[info exists vars(inv_footprint)]} { + set opt(inv_footprint) $vars(inv_footprint) +} +if {[info exists vars(del_footprint)]} { + set opt(delay_footprint) $vars(del_footprint) +} +if {[info exists vars(cts_cell_footprint)]} { + set cts(cts_cell_footprint) $vars(cts_cell_footprint) +} +if {[info exists vars(cts_cell_list)]} { + set cts(cell_list) $vars(cts_cell_list) +} +if {[info exists vars(delay_limit)]} { + set delaycal(delay_limit) $vars(delay_limit) +} +if {[info exists vars(default_net_delay)]} { + set delaycal(net_delay) $vars(default_net_delay) +} +if {[info exists vars(default_net_load)]} { + set delaycal(net_load) $vars(default_net_load) +} +if {[info exists vars(default_slew)]} { + set delaycal(in_tran_delay) $vars(default_slew) +} +if {[info exists vars(exclude_nets)]} { + set delaycal(exclude_net) $vars(exclude_nets) +} +if {[info exists vars(delay_limit)]} { + set delaycal(use_default_delay_limit) $vars(delay_limit) +} +if {[info exists vars(default_net_delay)]} { + set delaycal(default_net_delay) $vars(default_net_delay) +} +if {[info exists vars(default_net_load)]} { + set delaycal(default_net_load) $vars(default_net_load) +} +if {[info exists vars(input_transition_delay)]} { + set delaycal(input_transition_delay) $vars(input_transition_delay) +} + +if {[info exists vars(shrink_factor)]} { + set extract(shrink_factor) $vars(shrink_factor) +} + +# init_oa_search_lib diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/utils.tcl b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/utils.tcl new file mode 100755 index 000000000..88191df7b --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/utils.tcl @@ -0,0 +1,1111 @@ +# %CopyrightNotice + +namespace eval ff_procs:: { + +############################################################################### +# Procedure to seed certain flow variables to a known default value as well +# as data variables required to seed the generic configuration file +############################################################################### + + proc load_path_groups {file} { + + read_dc_script $file + + } + + proc source_plug {plugin {abort 1}} { + + global vars + global plugin_error + global errorInfo + global return_code + + + if {[info exists vars($plugin)]} { + Puts " LOADING '$plugin' PLUG-IN FILE(s) " + foreach plugin $vars($plugin) { + if {[file exists $plugin]} { + Puts " -> $plugin" + if { [ catch { uplevel source $plugin } plugin_error ] } { + Puts " ============= PLUG-IN ERROR ==================" + Puts " $errorInfo" + Puts " $plugin_error" + Puts " ==============================================" + set return_code 99 + if {[info exists vars(mail,to)]} { + set msg "From: [exec whoami] " + append msg \n "To: " [join $vars(mail,to) ,] + append msg \n "Cc: " [join "" ,] + append msg \n "Subject: " "FF: $vars(design), $vars(step) failed ([pwd])" + append msg \n\n $errorInfo + exec /usr/lib/sendmail -oi -t << $msg + } + + if {$abort} { + exit $return_code + } + } + } else { + if {[file exists $vars(plug_dir)/$plugin]} { + Puts " -> $vars(plug_dir)/$plugin" + if { [ catch { uplevel source $vars(plug_dir)/$plugin } plugin_error ] } { + if {[info exists vars(mail,to)]} { + set msg "From: [exec whoami] " + append msg \n "To: " [join $vars(mail,to) ,] + append msg \n "Cc: " [join "" ,] + append msg \n "Subject: " "FF: $vars(design), $vars(step) failed ([pwd])" + append msg \n\n $errorInfo + exec /usr/lib/sendmail -oi -t << $msg + } + set return_code 99 + if {$abort} { + exit $return_code + } + } + } + } + } + } + } + + proc report_time {} { + global vars + + set run_time [expr [clock seconds] - $vars($vars(step),start_time)] + + if {$run_time > 86400} { + set days [expr $run_time / 86400] + } else { + set days 0 + } + set run_time [clock format $run_time -format %H:%M:%S -gmt true] + Puts " ==============================================" + Puts " COMPLETED STEP : $vars(step)" + Puts " ELAPSED RUNTIME : $days days, $run_time" + Puts " ==============================================" + } + + proc modify_power_domains {} { + + global vars + + #################################################################################### + ### modify power domain + #################################################################################### + + set vars(power_domains) [ff_procs::get_power_domains] + + foreach domain $vars(power_domains) { + if {[info exists vars($domain,bbox)] || \ + [info exists vars($domain,rs_exts)] || \ + [info exists vars($domain,min_gaps)]} { + Puts " Modifying power domain $domain ..." + set command "modifyPowerDomainAttr $domain " + if {[info exists vars($domain,bbox)]} { + append command "-box $vars($domain,bbox) " + } + if {[info exists vars($domain,rs_exts)]} { + append command "-rsExts $vars($domain,rs_exts) " + } + if {[info exists vars($domain,min_gaps)]} { + append command "-minGaps $vars($domain,min_gaps) " + } + eval $command + } + } + } + proc add_power_switches {{domains ""}} { + + global vars + global map + + #################################################################################### + ### add power switch + #################################################################################### + + source $vars(script_root)/ETC/EDI/map_options.tcl + + if {$domains == ""} { + set domains [ff_procs::get_power_domains] + } + + foreach domain $domains { + if {[info exists vars($domain,switchable)] && $vars($domain,switchable)} { + + deletePowerSwitch -$vars($domain,switch_type) -powerDomain $domain + + set command "addPowerSwitch -powerDomain $domain -$vars($domain,switch_type) " + + if {[info exists vars($domain,distribute)] && $vars($domain,distribute)} { + append command "-distribute " + } + if {[info exists vars($domain,checker_board)] && $vars($domain,checker_board)} { + append command "-checkerBoard " + } + if {[info exists vars($domain,back_to_back_chain)] && $vars($domain,back_to_back_chain)} { + append command "-backToBackChain " + } + if {[info exists vars($domain,loop_back_at_end)] && $vars($domain,loop_back_at_end)} { + append command "-loopbackAtEnd " + } + if {[info exists vars($domain,check_height)] && !$vars($domain,check_height)} { + append command "-noDoubleHeightCheck " + } + if {[info exists vars($domain,verify_rows)] && !$vars($domain,verify_rows)} { + append command "-noRowVerify " + } + if {[info exists vars($domain,enable_chain)] && !$vars($domain,enable_chain)} { + append command "-noEnableChain " + } + + foreach option [array names map] { + if {[info exists vars($domain,$option)]} { + append command "-$map($option) $vars($domain,$option) " + } + } + + eval $command + } + } + } + + proc get_power_domains {} { + set power_domains [list] + dbForEachPowerDomain [dbgHead] pd { + if {[dbGroupHInstList [dbPowerDomainName $pd]] != "0x0"} { + lappend power_domains [dbPowerDomainName $pd] + } + } + return $power_domains + } + + proc route_secondary_pg_nets {} { + + Puts " ROUTING SECONDARY POWER NETS ..." + + global vars + + # Enable global pin pairs (if defined) + if {[info exists vars(secondary_pg,cell_pin_pairs)]} { + setPGPinUseSignalRoute $vars(secondary_pg,cell_pin_pairs) + + # Build commands for individual nets (if defined) + if {[info exists vars(secondary_pg,nets)]} { + foreach net $vars(secondary_pg,nets) { + # Set options to globals if they exist + if {[info exists vars($net,pattern)]} { + set pattern $vars($net,pattern) + } elseif {[info exists vars(secondary_pg,pattern)]} { + set pattern $vars(secondary_pg,pattern) + } + if {[info exists vars($net,max_fanout)]} { + set max_fanout $vars($net,max_fanout) + } elseif {[info exists vars(secondary_pg,max_fanout)]} { + set max_fanout $vars(secondary_pg,max_fanout) + } + if {[info exists vars($net,non_default_rule)]} { + set non_default_rule $vars($net,non_default_rule) + } elseif {[info exists vars(secondary_pg,non_default_rule)]} { + set non_default_rule $vars(secondary_pg,non_default_rule) + } + if {[info exists vars($net,cell_pin_pairs)]} { + setPGPinUseSignalRoute $vars($net,cell_pin_pairs) + } + set vars($net,command) "routePGPinUseSignalRoute -nets $net" + if {[info exists pattern]} { + set vars($net,command) [format "%s -pattern %s" $vars($net,command) $pattern] + } + if {[info exists max_fanout]} { + set vars($net,command) [format "%s -maxFanout %s" $vars($net,command) $max_fanout] + } + if {[info exists non_default_rule]} { + set vars($net,command) [format "%s -nonDefaultRule %s" $vars($net,command) $non_default_rule] + } + } + foreach net $vars(secondary_pg,nets) { + eval $vars($net,command) + } + } else { + set command "routePGPinUseSignalRoute" + # Set options to globals if they exist + if {[info exists vars(secondary_pg,pattern)]} { + set command [format "%s -pattern $vars(secondary_pg,pattern)" $command] + } + if {[info exists vars(secondary_pg,max_fanout)]} { + set command [format "%s -maxFanout $vars(secondary_pg,max_fanout)" $command] + } + if {[info exists vars(secondary_pg,non_default_rule)]} { + set command [format "%s -nonDefaultRule $vars(secondary_pg,non_default_rule)" $command] + } + eval $command + } + } else { + Puts " =====================================================================" + Puts " ERROR: No cell/pin pairs defined ... please define cell/pin pairs" + Puts " in your setup.tcl using vars(secondary_pg,cell_pin_pairs)" + Puts " =====================================================================" + } + } + + proc insert_welltaps_endcaps {} { + + global vars + + ############################################################################### + # Insert welltaps and pre/post endcaps + ############################################################################### + if {[info exists vars(cpf_file)] && ([info exists vars(power_domains)] && ([llength $vars(power_domains)] > 0))} { + set vars(power_domains) [::ff_procs::get_power_domains] + foreach domain $vars(power_domains) { + if {[info exists vars($domain,pre_endcap)] && + [info exists vars($domain,post_endcap)]} { + addEndCap -prefix $domain \ + -preCap $vars($domain,pre_endcap) \ + -postCap $vars($domain,post_endcap) \ + -powerDomain $domain + } elseif {[info exists vars(pre_endcap)] && + [info exists vars(post_endcap)]} { + addEndCap -prefix $domain \ + -preCap $vars(pre_endcap) \ + -postCap $vars(post_endcap) \ + -powerDomain $domain + } + if {[info exists vars($domain,welltaps)] || [info exists vars(welltaps)]} { + if {[info exists vars($domain,welltaps)]} { + set command "addWellTap -prefix $domain -cell $vars($domain,welltaps) -powerDomain $domain" + set vcommand "verifyWellTap -cells $vars($domain,welltaps) -powerDomain $domain -report $vars(rpt_dir)/welltap.rpt" + } elseif {[info exists vars(welltaps)]} { + set command "addWellTap -prefix $domain -cell $vars(welltaps) -powerDomain $domain" + set vcommand "verifyWellTap -cells $vars(welltaps) -powerDomain $domain -report $vars(rpt_dir)/welltap.rpt" + } + if {[info exists vars($domain,welltaps,max_gap)] || [info exists vars($domain,welltaps,cell_interval)]} { + if {[info exists vars($domain,welltaps,max_gap)]} { + append command " -maxGap $vars($domain,welltaps,max_gap)" + } else { + append command " -cellInterval $vars($domain,welltaps,cell_interval)" + } + } elseif {[info exists vars(welltaps,max_gap)] || [info exists vars(welltaps,cell_interval)]} { + if {[info exists vars(welltaps,max_gap)]} { + append command " -maxGap $vars(welltaps,max_gap)" + } else { + append command " -cellInterval $vars(welltaps,cell_interval)" + } + } + if {[info exists vars($domain,welltaps,row_offset)]} { + if {$vars($domain,welltaps,row_offset)} { + append command " -inRowOffset $vars($domain,welltaps,row_offset)" + } + } elseif {[info exists vars(welltaps,row_offset)]} { + if {$vars(welltaps,row_offset)} { + append command " -inRowOffset $vars(welltaps,row_offset)" + } + } + if {[info exists vars($domain,welltaps,checkerboard)]} { + if {$vars($domain,welltaps,checkerboard)} { + append command " -checkerboard" + } + } elseif {[info exists vars(welltaps,checkerboard)]} { + if {$vars(welltaps,checkerboard)} { + append command " -checkerboard" + } + } + eval $command + if {[info exists vars(welltaps,verify_rule)]} { + append vcommand " -rule $vars(welltaps,verify_rule)" + eval $vcommand + } else { + puts " Cannot run verifyWellTap because vars(welltaps,verify_rule) is not defined" + } + } + } + } else { + if {[info exists vars(pre_endcap)] && + [info exists vars(post_endcap)]} { + addEndCap -prefix ENDCAP \ + -preCap $vars(pre_endcap) \ + -postCap $vars(post_endcap) + } + if {[info exists vars(welltaps)]} { + set command "addWellTap -prefix WELLTAP -cell $vars(welltaps) " + set vcommand "verifyWellTap -cells $vars(welltaps) -report $vars(rpt_dir)/welltap.rpt" + if {[info exists vars(welltaps,max_gap)] || [info exists vars(welltaps,cell_interval)]} { + if {[info exists vars(welltaps,max_gap)]} { + append command " -maxGap $vars(welltaps,max_gap)" + } else { + append command " -cellInterval $vars(welltaps,cell_interval)" + } + } + if {[info exists vars(welltaps,row_offset)]} { + append command " -inRowOffset $vars(welltaps,row_offset)" + } + if {[info exists vars(welltaps,checkerboard)]} { + if {$vars(welltaps,checkerboard)} { + append command " -checkerboard" + } + } + eval $command + if {[info exists vars(welltaps,verify_rule)]} { + append vcommand " -rule $vars(welltaps,verify_rule)" + eval $vcommand + } else { + puts " CANNOT RUN verifyWellTap BECAUSE vars(welltaps,verify_rule) IS NOT DEFINED" + } + } + } + } + + proc buffer_always_on_nets {} { + + global vars + global errors + global bts_nets + + + if {![info exists vars(power_domains)]} { + set vars(power_domains) [::ff_procs::get_power_domains] + } + set pd_buffer_list [list] + foreach domain $vars(power_domains) { + if {[info exists vars($domain,always_on_buffers)]} { + set val [concat $domain $vars($domain,always_on_buffers)] + lappend pd_buffer_list $val + } else { + if {[info exists vars(always_on_buffers)]} { + set val [concat $domain $vars(always_on_buffers)] + lappend pd_buffer_list $val + } + } + } + if {$pd_buffer_list == ""} { + Puts " ERROR: No always-on buffers defined" + return + } + + if {[info exists vars(always_on_nets)]} { + set bts_nets [list] + foreach net $vars(always_on_nets) { + set temp [join [dbFindNetsByName $net]] + lappend bts_nets $temp + } + +# set temp [list] +# if {[info exists vars(always_on_nets,max_fanout)]} { +# set max_fanout $vars(always_on_nets,max_fanout) +# foreach net [join $bts_nets] { +# if {[expr [llength [dbFindInstsOnNet $net]] - 1] > $max_fanout} { +# lappend temp $net +# } +# } +# set bts_nets [join $temp] +# } +# + set bts_nets [join $bts_nets] + + Puts " =========================================================" + Puts " Buffering always-on nets" + Puts " =========================================================" + Puts " Nets ..." + foreach net $bts_nets { + Puts " $net" + } + + set command "bufferTreeSynthesis -prefix BTS" + append command " -nets \[list $bts_nets\]" + append command " -powerDomainBufList \[list $pd_buffer_list\]" + + if {![catch {set arg $vars(always_on_nets,max_tran)}]} { + append command " -maxTran $arg" + Puts " Max Tran -> $arg" + } + if {![catch {set arg $vars(always_on_nets,max_fanout)}]} { + append command " -maxFanout $arg" + Puts " Max Fanout -> $arg" + } + if {![catch {set arg $vars(always_on_nets,max_skew)}]} { + append command " -maxSkew $arg" + Puts " Max Skew -> $arg" + } + if {![catch {set arg $vars(always_on_nets,max_delay)}]} { + append command " -maxDelay $arg" + Puts " Max Delay -> $arg" + } + + Puts " =========================================================" + + eval $command + + } else { + + Puts " No always on nets specified" + Puts " Please set vars(always_on_nets) in your setup.tcl" + } + } + + proc get_icg_pins {} { + + global vars + Puts " INFO: Executing get_icg_pins" + foreach_in_collection pin [get_lib_pins $vars(icg,base_name)*/*] { + if {[get_property $pin direction]=="in"&&[get_property $pin is_clock_gating_enable]=="true"} { + set name [file tail [get_property $pin name]] + if {[info exists enable]==1&&$name!=$enable} { + Puts " ERROR: While searching all icgs, enable pin for [get_property $pin name] does not match existing $enable" + #exit 99 + } else { + set enable $name + } + } elseif {([get_property $pin direction] == "out")} { + set name [file tail [get_property $pin name]] + if {[info exists clkout]==1&&$name!=$clkout} { + Puts " ERROR: While searching all icgs, clkout pin for [get_property $pin name] does not match existing $clkout" + #exit 99 + } else { + set clkout $name + } + } elseif {([get_property $pin direction] == "in") && ([get_property $pin is_clock] == "true")} { + set name [file tail [get_property $pin name]] + if {[info exists clkin]==1&&$name!=$clkin} { + Puts " ERROR: While searching all icgs, clkin pin for [get_property $pin name] does not match existing $clkin" + #exit 99 + } else { + set clkin $name + } + } + } + if {[info exists clkout]==0} { + Puts " ERROR: output pin of icg $vars(icg,base_name) was not found, exiting" + #exit 99 + } + if {[info exists clkin]==0} { + Puts " ERROR: clk pin of icg $vars(icg,base_name) was not found, exiting" + #exit 99 + } + if {[info exists enable]==0} { + Puts " ERROR: enable pin of icg $vars(icg,base_name) was not found, exiting" + #exit 99 + } + set vars(icg,output_pin) $clkout + set vars(icg,input_pin) $enable + set vars(icg,clock_pin) $clkin + Puts " INFO: Finished executing get_icg_pins" + + } + + proc get_buf_pins {} { + + global vars + Puts " INFO: Executing get_buf_pins" + foreach_in_collection pin [get_lib_pins $vars(anchor_buffer)/*] { + if {[get_property $pin direction]=="in"} { + set in [file tail [get_property $pin name]] + } elseif {[get_property $pin direction] == "out"} { + set out [file tail [get_property $pin name]] + } + } + if {[info exists out]==0} { + Puts " ERROR: output pin of anchor buffer $vars(anchor_buffer) was not found, exiting" + #exit 99 + } + if {[info exists in]==0} { + Puts " ERROR: input pin of anchor buffer $vars(anchor_buffer) was not found, exiting" + #exit 99 + } + set vars(anchor_buffer,output_pin) $out + set vars(anchor_buffer,input_pin) $in + set vars(buf,output_pin) $out + set vars(buf,input_pin) $in + + Puts " INFO: Finished executing get_buf_pins" + + } + + proc get_reg_pins {} { + + global vars + Puts " INFO: Executing get_reg_pins" + set got_pin false + foreach_in_collection reg [all_registers] { + if {$got_pin} { + return + } + foreach_in_collection pin [get_pins [get_property $reg hierarchical_name]/*] { + if [get_property $pin is_clock] { + set vars(reg,clock_pin) [file tail [get_property $pin hierarchical_name]] + set got_pin true + } + } + } + Puts " INFO: Finished executing get_reg_pins" + } + + proc get_tech_pin_info {} { + + global vars + + get_icg_pins + get_buf_pins + get_reg_pins + + set op [open .ff.pins.tcl w] + foreach type {icg buf reg} { + foreach pin {clock enable input output} { + if {[info exists vars($type,${pin}_pin)]} { + puts $op "set vars($type,${pin}_pin) $vars($type,${pin}_pin)" + Puts " INFO: Found $type $pin -> $vars($type,${pin}_pin)" + } + } + } + close $op + } + + proc get_all_usable_bufinvs {} { + +# Puts "INFO: Executing get_all_usable_bufinvs" + set buf_list "" + set inv_list "" + set cell_types [dbGet head.allCells.name *] + foreach cell $cell_types { + set cell_id [ dbGetCellByName $cell] + if { [dbIsCellDontUse $cell_id] } { continue } + if { [dbIsCellDontTouch $cell_id] } { continue } + if { [dbIsCellSequential $cell_id] } { continue } + if { [::CPF::isAlwaysOnCell $cell] } { continue } + if { [ dbIsCellBuffer $cell_id] } { + lappend buf_list $cell + } elseif { [ dbIsCellInverter $cell_id ] } { + lappend inv_list $cell + } + } +# Puts "INFO: Found [llength $buf_list] buffers and [llength $inv_list] inverters" +# Puts "INFO: Finished executing get_all_usable_bufinvs" + return [list $buf_list $inv_list] + + } + proc assign_cts_cells {} { + +# Puts "INFO: Executing assign_cts_cells" + + global vars + if {![info exists vars(cts_cells)]} { + set rc [::ff_procs::get_all_usable_bufinvs] + set vars(cts_cells) [concat $rc] + } else { + set got_one 0 + foreach cell $vars(cts_cells) { + if {[dbGetCellByName $cell]!="0x0"} { + set got_one 1 + } + } + if {$got_one==0} { + Puts " WARNING: there is no valid cell in vars(cts_cells), will auto set to all usable buffers/inverters" + set rc [::ff_procs::get_all_usable_bufinvs] + set vars(cts_cells) [concat $rc] + } + } + set vars(cts_inverter_cells) [list] + set vars(cts_buffer_cells) [list] + foreach cell {$vars(cts_cells)} { + if { [dbIsCellBuffer $cell_id] } { + lappend vars(cts_buffer_cells) $cell + } elseif { [dbIsCellInverter $cell_id] } { + lappend vars(cts_inverter_cells) $cell + } + } +# Puts "INFO: Finished executing assign_cts_cells" + } + + proc enable_mmmc {} { + + Puts " INFO: Executing enable_mmmc" + global vars + # confirm default view defined + if {[info exists vars(default_setup_view)]==0} { + Puts "ERROR: default view vars(default_setup_view) not defined, exiting" + #exit 99 + } + set view $vars(default_setup_view) + if {[info exists vars($view,delay_corner)]==0} { + Puts " ERROR: default delay_corner vars($view,delay_corner) not defined, exiting" + #exit 99 + } + set dc $vars($view,delay_corner) + if {[info exists vars($dc,library_set)]==0} { + Puts " ERROR: default library_set vars($dc,library_set) not defined, exiting" + #exit 99 + } + set libset $vars($dc,library_set) + if {[info exists vars($dc,rc_corner)]==0} { + Puts " ERROR: default rc_corner vars($dc,rc_corner) not defined, exiting" + #exit 99 + } + set rc $vars($dc,rc_corner) + if {[info exists vars($view,constraint_mode)]==0} { + Puts " ERROR: default constraint_mode vars($view,constraint_mode) not defined, exiting" + #exit 99 + } + set mode $vars($view,constraint_mode) + if {[info exists vars($mode,pre_cts_sdc)]==0} { + Puts " ERROR: pre_cts_sdc for constraint_mode $mode in vars($mode,pre_cts_sdc), exiting" + #exit 99 + } + + if {[info exists vars($libset,timing)]==0} { + Puts " ERROR: library_set $libset libraries not defined in vars($libset,timing), exiting" + #exit 99 + } + create_library_set -name $libset -timing $vars($libset,timing) + + if {[info exists vars($rc,cap_table)]==0} { + Puts " ERROR: cap_table for rc_corner $rc not defined, exiting" + #exit 99 + } + if {[info exists vars($rc,pre_route_res_factor)]==0} { + Puts " WARNING: pre_route_res_factor for rc_corner $rc not defined, setting to 1.0" + set vars($rc,pre_route_res_factor) 1.0 + } + if {[info exists vars($rc,pre_route_cap_factor)]==0} { + Puts " WARNING: pre_route_cap_factor for rc_corner $rc not defined, setting to 1.0" + set vars($rc,pre_route_cap_factor) 1.0 + } + if {[info exists vars($rc,T)]==0} { + Puts " WARNING: temperature for rc_corner $rc not defined, setting to 25" + set vars($rc,pre_route_cap_factor) 25 + } + create_rc_corner -name $rc \ + -cap_table $vars($rc,cap_table) \ + -preRoute_res $vars($rc,pre_route_res_factor) \ + -preRoute_cap $vars($rc,pre_route_cap_factor) \ + -T $vars($rc,T) + + create_delay_corner -name $dc -library_set $libset -rc_corner $rc + if {[file isfile [lindex vars($mode,pre_cts_sdc) 0]]} { + if {[lsearch [all_constraint_modes] $mode] == -1} { + create_constraint_mode -name $mode -sdc_files $vars($mode,pre_cts_sdc) + } else { + update_constraint_mode -name $mode -sdc_files $vars($mode,pre_cts_sdc) + } + } + + create_analysis_view -name $view -constraint_mode $mode -delay_corner $dc + set_analysis_view -setup [list $view] -hold [list $view] + foreach object "cell net" { + foreach mode "early late" { + foreach type "data clock" { + if {[info exists vars($dc,${type}_${object}_${mode})]} { + set generated 1 + set_timing_derate -delay_corner $dc -$type -${object}_delay -$mode $vars($dc,${type}_${object}_${mode}) + } + if {[info exists vars($dc,${object}_${type}_${mode})]} { + set_timing_derate -delay_corner $dc -$type -${object}_delay -$mode $vars($dc,${object}_${type}_${mode}) + } + } + if {[info exists vars($dc,cell_check_${mode})]} { + set_timing_derate -delay_corner $dc -cell_check -$mode $vars($dc,cell_check_${mode}) + } + if {[info exists vars($dc,check_cell_${mode})]} { + set_timing_derate -delay_corner $dc -cell_check -$mode $vars($dc,check_cell_${mode}) + } + } + } + if {[info exists vars(derate_tcl)]&&[file isfile $vars(derate_tcl)]} { + source $vars(derate_tcl) + } + if {[info exists vars($dc,derate_tcl)]&&[file isfile $vars($dc,derate_tcl)]} { + source $vars($dc,derate_tcl) + } + Puts " INFO: Finished executing enable_mmmc" + + } + + proc build_guides {} { + + Puts " INFO: Creating floorplan guides ..." + global vars + unlogCommand addInstToInstGroup + unlogCommand createInstGroup + unlogCommand deleteInstGroup + unlogCommand setObjFPlanBoxList + suppressMessage ENCSYC-1962 + suppressMessage ENCSYC-791 + if {[info exists vars(guides)]==1&&[llength $vars(guides)]>0} { + foreach guide $vars(guides) { + # Check to make sure guide has a bound and some includes + if {[info exists vars(guide,$guide,bounds)]==0||[llength $vars(guide,$guide,bounds)]<4} { + Puts " WARNING: Guide $guide does not have a properly specified bound, guide not created" + } elseif {[info exists vars(guide,$guide,include)]==0||[llength $vars(guide,$guide,include)]<1} { + Puts " WARNING: Guide $guide does not have any includes, guide not created" + } else { + catch {deleteInstGroup $guide} + catch {unset insts} + if {[info exists vars(guide,$guide,exclude)]==0} { + set vars(guide,$guide,exclude) "" + } else { + regsub -all "\\\*" $vars(guide,$guide,exclude) "\.\*" excludes + } + foreach include $vars(guide,$guide,include) { + foreach i [dbFindInstsByName ${include}*] { + if {[info exists vars(guide,$guide,exclude)]==1&&[llength $vars(guide,$guide,exclude)]>0&&[regexp [join $excludes |] $i]<1} { + set insts($i) 1 + } elseif {[llength $vars(guide,$guide,exclude)]<1} { + set insts($i) 1 + } + } + } + if {[info exists insts]==1&&[llength [array names insts]]>0} { + set x1 [lindex $vars(guide,$guide,bounds) 0] + set y1 [lindex $vars(guide,$guide,bounds) 1] + set x2 [lindex $vars(guide,$guide,bounds) 2] + set y2 [lindex $vars(guide,$guide,bounds) 3] + createInstGroup $guide -guide $x1 $y1 $x2 $y2 + set c 0 + foreach i [array names insts] { + addInstToInstGroup $guide $i + incr c + } + set cmd "setObjFPlanBoxList Group $guide" + foreach i $vars(guide,$guide,bounds) { + set cmd "${cmd} $i" + } + catch {eval $cmd} + Puts " INFO: Added $c instances to guide $guide" + } else { + Puts " WARNING: Specified guide $guide has no instances, not creating" + } + } + } + } else { + Puts " INFO: No guides specified ... exiting" + } + logCommand addInstToInstGroup + logCommand createInstGroup + logCommand deleteInstGroup + logCommand setObjFPlanBoxList + Puts " INFO: Finished executing build_guides" + + } + + proc add_blockages {} { + + Puts "INFO: Creating blockages ..." + + global vars + + if {![info exists vars(blockages)]} { + puts "INFO: No blockages info defined ... existing" + return + } + set commands "" + foreach blockage $vars(blockages) { + switch $vars(blockage,$blockage,type) { + hard { + append commands "createObstruct $vars(blockage,$blockage,bounds) -name $blockage\n" + } + soft { + append commands "createObstruct $vars(blockage,$blockage,bounds) -name $blockage -type soft\n" + } + partial { + append commands "createObstruct $vars(blockage,$blockage,bounds) -name $blockage -type soft\n" + } + } + } + + eval $commands + + Puts "INFO: Finished executing add_blockages ..." + } + + proc save_results {{step ""}} { + + global vars + global errors + global env + + if {$step != ""} { + set vars(step) $step + } else { + Puts " Argument 'step' required ..." + return + } + + set commands "" + + set args "" + if {[info exists vars(save_rc)] && $vars(save_rc)} { + if {[regexp "route" $vars(step)]} { + append args " -rc" + } + } + if {[info exists vars(save_constraints)] && $vars(save_constraints)} { + append args " -tcon" + } + + # BCL: Added subst around vars(dbs_dir) to resolve vars(rundir) + set dir [subst $vars(dbs_dir)] + set design $vars(design) + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + if {$hier} { + set command "saveDesign $args -cellview {$vars(oa_partition_lib) $vars(design) $vars(step)}\n" + } else { + set command "saveDesign $args -cellview {$vars(oa_design_lib) $vars(design) $vars(step)}\n" + } + } else { + set command "saveOaDesign $vars(oa_design_lib) $design $vars(step)\n" + } + } else { + if {[info exists vars(relative_path)] && $vars(relative_path)} { + append args " -relativePath" + } + if {[info exists vars(absolute_lib_path)] && $vars(absolute_lib_path)} { + append args " -absoluteLibPath" + } + set command "saveDesign $args $dir/$vars(step).enc -compress\n" + } + + append commands $command + + if {![info exists env(VPATH)]} { + set env(VPATH) "make" + } + + if {$vars(makefile)} { + append commands "exec /bin/touch $env(VPATH)/$step\n" + } + + set header "#---------------------------------------------------------------------\n" + append header "# GENERATING REPORTS\n" + append header "#---------------------------------------------------------------------\n" + + if {$vars(report_power)} { + set command "report_power -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + append commands $command + } + + if {[info exists vars(cpf_file)] && ([info exists vars(power_domains)] && ([llength $vars(power_domains)] > 0))} { + append commands $header + set header "" + + ###################################################################### + # Verify power domain + ###################################################################### + + set command "verifyPowerDomain -bind -gconn" + append command " -isoNetPD $vars(rpt_dir)/$vars(step).isonets.rpt" + append command " -xNetPD $vars(rpt_dir)/$vars(step).xnets.rpt\n" + + append commands $command + + ###################################################################### + # Run CLP + ###################################################################### + + if {$vars(run_clp) && ([auto_execok lec] != "")} { + set command "runCLP " + if {[info exists vars(clp_options)]} { + append command $vars(clp_options) + } + append command "\n" + append commands $command + } else { + if {![info exists vars(clp_warning)]} { + puts " WARNING: UNABLE TO RUN CLP ... PLEASE MAKE SURE IT IS IN YOUR PATH" + set vars(clp_warning) true + } + } + } + +# append commands "#\n" +# append commands "# HOUSEKEEPING\n" +# append commands "#\n" + + if {[info exists vars(mail,to)]} { + if {![info exists vars(mail,steps)] || \ + ([info exists vars(mail,steps)] && ([lsearch $vars(mail,steps) $vars(step)] != -1))} { + append commands "Puts \" MAILING RESULTS TO $vars(mail,to)\"\n" + append commands "if {\[file exists $vars(rpt_dir)/$vars(step).summary\]} {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" < $vars(rpt_dir)/$vars(step).summary $vars(mail,to)\n" + append commands "} else {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" < /dev/null $vars(mail,to)\n" + append commands "}\n" + } + } + +# append commands "exec /bin/touch \$env(VPATH)/$vars(step)\n" + + append commands [::FF::source_plug final_always_source_tcl] + + if {$vars(makefile)} { + append commands "if {\[info exists env(VPATH)\]} {\n" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)\n" + append commands "}\n" + } + + uplevel #0 eval $commands + } + + proc load_applet {args} { + + set defAppletNS "::applet" + set defSeverity "error" + set defaultLocalInstall $::ns(applet)::localInstall + set defaultLocalServer $::ns(applet)::localServer + set reqAppletVersion "" + + switch -- [parse_options [calling_proc] {} $args \ + "-version sos required version of applet (equal or greater)" reqAppletVersion \ + "-severity sos severity (error|warning|info)" severity \ + "-namespace sos namespace to search for applet" appletNS \ + "srs name of applet" appletName] { + -2 { return } + 0 { return -code error } + } + + if {$appletNS eq ""} { + set appletNS $defAppletNS + } + + if {$severity eq ""} { + set severity $defSeverity + } + + # Check to see if the applet happened to already be loaded. If so, check + # whether there is a minimum version requirement met. If yes, skip the rest of the applet + # If the applet already does not meet the minimum version requirement, unload it (using package forget) + if {![catch {set providedVersion [package present ${appletNS}::$appletName]} errorMessage]} { + if {$reqAppletVersion ne ""} { + if {[package vcompare $providedVersion $reqAppletVersion] == -1} { + puts "load_applet INFO: applet $appletName was already loaded, but it's version ($providedVersion) did not meet the minimum required version ($reqAppletVersion)" + puts "load_applet INFO: This version of the $appletName applet will be removed and the load_applet will search for a newer version of $appletName..." + package forget ${appletNS}::$appletName + } else { + puts "load_applet INFO: Found $appletName already loaded and it's version ($providedVersion) already meets the minimum required version ($reqAppletVersion). Skipping load..." + return + } + } else { + puts "load_applet INFO: Found $appletName already loaded with version ($providedVersion). Skipping applet load..." + return + } + } + + # There is no previously loaded applet. Continue with this proc... + set FoundMinVersionPath 0 + set finalSearchPath "" + set failedPaths "" + # Because Innovus has it's own get_attribute command now, we need to set this depending on what tool we are in + if {[get_tool] eq "rc"} { + set searchPathList [get_attribute applet_search_path /] + } else { + set searchPathList [$::ns(compat)::get_attribute applet_search_path /] + } + set appletSearchPathCount [llength $searchPathList] + + set origappletSearchPathCount $appletSearchPathCount + set origSearchPath "" + # First pass: determine which applet installations meet min required version, if any + # This for loop does not load the applets, it only determines a final search path to use + # If none of the search paths contain the minimum version, and severity code is error, this proc + # will return inside this foreach loop with code error + if {$appletSearchPathCount > 1} { + puts "load_applet INFO: Checking all applet search paths for versions of $appletName" + } + foreach pathComponent $searchPathList { + incr appletSearchPathCount -1 + if {$origappletSearchPathCount > 1} { + puts -nonewline " $pathComponent ..." + } else { + puts -nonewline "load_applet INFO: Checking applet_search_path: $pathComponent ..." + } + # If the path component is replace with the applet designated search path value using "UpdateSeachPath" + if {[string match "" $pathComponent]} { + set pathComponent [$::ns(applet)::UpdateSearchPath $pathComponent] + } + lappend origSearchPath $pathComponent + if {[file isdirectory $pathComponent]} { + if {[file isfile $pathComponent/.servInfo]} { + if {[get_tool] eq "rc"} { + set sourceCommand tcl_source + } else { + set sourceCommand source + } + set errorMsg "" + if {[catch {$sourceCommand $pathComponent/.servInfo} errorMsg] || ![info exists appInfo(${appletNS}::${appletName},version)]} { + if {$errorMsg ne ""} { + puts " $errorMsg" + } else { + puts " BAD APPLET SERVER (corrupted .servInfo file)" + } + } else { + if {$reqAppletVersion eq "" } { + lappend minVersionSearchPath $pathComponent + set FoundMinVersionPath 1 + } elseif {[package vcompare $appInfo(${appletNS}::${appletName},version) $reqAppletVersion] != -1} { + lappend minVersionSearchPath $pathComponent + set FoundMinVersionPath 1 + } else { + lappend failedPaths $pathComponent + set failedPathver($pathComponent) $appInfo(${appletNS}::${appletName},version) + } + puts " Found $appInfo(${appletNS}::${appletName},version)" + } + } else { + puts " BAD APPLET INSTALL" + } + } else { + puts " NONEXISTENT APPLET SERVER" + } + };# end first foreach loop (distilling final minimum version applet_search_path + + # Second pass: attempt to load applet in each valid search_path until a successful applet load occurs + # This for loop must lead to a successful outcome (loaded applet) or an error will be issued + if {$FoundMinVersionPath} { + foreach searchPath $minVersionSearchPath { + set_attribute -quiet applet_search_path $searchPath / + if {[catch {applet load $appletName} errorMsg]} { + puts "load_applet INFO: Version check passed on applet install $appletName but applet load failed." + if {$appletSearchPathCount > 0} { + puts "load_applet: Trying next applet_search_path..." + } else { + puts "load_applet: ERROR: Failed to load applet $appletName. Please check your applet_search_path and applet installation(s)." + set_attribute -quiet applet_search_path $origSearchPath / + return -code error + } + } else { + if {[catch {set providedVersion [package present ${appletNS}::$appletName]} errorMessage]} { + puts "load_applet: ERROR: applet $appletName loaded correctly, but the applet did not correctly provide a package version. Trying next search path..." + } else { + puts "load_applet: INFO: Applet $appletName $providedVersion successfully loaded from applet installation at $pathComponent, meeting min version requirement ($reqAppletVersion)" + set_attribute -quiet applet_search_path $origSearchPath / + return + } + } + } + } else { + # Didn't find any searchy paths with minimum applet installed. + switch -exact -- $severity { + error { + puts "load_applet ERROR: Minimum applet version for applet $appletName is $reqAppletVersion, but no applet was found meeting this requirement." + } + warning { + puts "load_applet WARNING: Minimum applet version for applet $appletName is $reqAppletVersion, but no applet was found meeting this requirement." + } + info { + puts "load_applet INFO: Minimum applet version for applet $appletName is $reqAppletVersion, but no applet was found meeting this requirement." + } + } + puts "load_applet INFO: Search results:" + foreach searchPath $failedPaths { + puts " applet_search_path: $searchPath, $appletName version found: $failedPathver($searchPath)" + } + puts "load_applet INFO: Note applet search path that was set:" + puts " $origSearchPath" + switch -exact -- $severity { + error { + set_attribute -quiet applet_search_path $origSearchPath / + return -code 99 + } + } + } + set_attribute -quiet applet_search_path $origSearchPath / + } + +} diff --git a/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/vars.txt b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/vars.txt new file mode 100755 index 000000000..36382ccfa --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/INNOVUS/vars.txt @@ -0,0 +1,174 @@ +script_root^directory^string^SCRIPTS^{valid directory} +dbs_dir^directory^string^DBS^{valid directory} +rpt_dir^directory^string^RPT^{valid directory} +html_dir^directory^string^HTML^{valid directory} +plug_dir^directory^string^PLUG^{valid directory} +process^technology^string^90nm^{Valid range between 10nm and 250 nm} +lef_files^technology^list^UNDEFINED^{lef files} +netlist^design^string^UNDEFINED^{valid file name} +design^design^string^UNDEFINED^{valid file name} +fp_file^design^string^UNDEFINED^{valid file name} +def_files^design^list^UNDEFINED^{valid file names} +ilm_list^ilm^list^UNDEFINED^{ilms} +,ilm_dir^ilm^string^UNDEFINED^{ilm directory} +,lef_file^ilm^string^UNDEFINED^{lef file} +power_nets^design^list^UNDEFINED^{net names} +ground_nets^design^list^UNDEFINED^{net names} +starting_dbs^design^string^UNDEFINED^{valid FE database} +database_format^design^string^FE^{FE | OA} +oa_ref_lib^design^string^UNDEFINED^{valid OA library} +oa_design_lib^design^string^UNDEFINED^{valid OA library} +oa_abstract_name^manufacturing^string^UNDEFINED^{valid view name} +oa_layout_name^manufacturing^string^UNDEFINED^{valid view name} +cts_spec^design^list^UNDEFINED^{cts spec files} +cts_cells^clock^list^UNDEFINED^{clock cells} +enable_ss^analysis^enum^FALSE^{pre_place | pre_prects | pre_postcts | pre_postroute | pre_postroute_si | pre_signoff | false} +flow^flow^enum^default^{default | pr_mmmc | mmmc} +enable_ocv^analysis^enum^pre_postroute^{false | pre_postcts | pre_postroute | pre_postroute_si | pre_signoff} +library_sets^library^list^UNDEFINED^{library sets} +,si^library^list^UNDEFINED^{cdb files} +,timing^library^list^UNDEFINED^{library files} +rc_corners^technology^list^UNDEFINED^{rc corners} +,T^technology^integer^125^{temperature} +,cap_table^technology^file^UNDEFINED^{cap table} +,qx_tech_file^technology^file^UNDEFINED^{technology file} +,pre_route_cap_factor^technology^FLOAT^1.00^{FLOAT} +,pre_route_clk_cap_factor^technology^FLOAT^1.00^{FLOAT} +,pre_route_clk_res_factor^technology^FLOAT^1.00^{FLOAT} +,pre_route_res_factor^technology^FLOAT^1.00^{FLOAT} +,post_route_cap_factor^technology^FLOAT TRIPLE^"1.00 1.00 1.00"^{FLOAT TRIPLET} +,post_route_clk_cap_factor^technology^FLOAT TRIPLE^"1.00 1.00 1.00"^{FLOAT TRIPLET} +,post_route_clk_res_factor^technology^FLOAT TRIPLE^"1.00 1.00 1.00"^{FLOAT TRIPLET} +,post_route_res_factor^technology^FLOAT TRIPLE^"1.00 1.00 1.00"^{FLOAT TRIPLET} +,post_route_xcap_factor^technology^FLOAT TRIPLE^"1.00 1.00 1.00"^{FLOAT TRIPLET} +delay_corners^library^list^UNDEFINED^{delay corners} +,library_set^library^list^UNDEFINED^{valid library sets} +,rc_corner^technology^string^UNDEFINED^{valid delay corner} +,clock_cell_early^timing^FLOAT^UNDEFINED^{FLOAT} +,clock_cell_late^timing^FLOAT^UNDEFINED^{FLOAT} +,clock_net_early^timing^FLOAT^UNDEFINED^{FLOAT} +,clock_net_late^timing^FLOAT^UNDEFINED^{FLOAT} +,data_cell_early^timing^FLOAT^UNDEFINED^{FLOAT} +,data_cell_late^timing^FLOAT^UNDEFINED^{FLOAT} +,data_net_early^timing^FLOAT^UNDEFINED^{FLOAT} +,data_net_late^timing^FLOAT^UNDEFINED^{FLOAT} +,opcond^timing^string^UNDEFINED^{valid opcond name} +,opcond_library^timing^string^UNDEFINED^{valid library name} +constraint_modes^design^list^UNDEFINED^{constraint modes} +,pre_cts_sdc^design^list^UNDEFINED^{valid file names} +,incr_cts_sdc^design^list^UNDEFINED^{valid file names} +,post_cts_sdc^design^list^UNDEFINED^{valid file names} +enable_cppr^analysis^enum^none^{none | setup | hold | both} +analysis_views^library^list^UNDEFINED^{analysis views} +hold_analysis_views^timing^list^UNDEFINED^{analysis views} +setup_analysis_views^timing^list^UNDEFINED^{analysis views} +,constraint_mode^timing^string^UNDEFINED^{constraint mode} +,delay_corner^timing^string^UNDEFINED^{delay corner} +default_hold_view^timing^string^UNDEFINED^{analysis view} +default_setup_view^timing^string^UNDEFINED^{analysis view} +active_hold_views^timing^list^UNDEFINED^{analysis views} +active_setup_views^timing^list^UNDEFINED^{analysis views} +power_analysis_view^power^string^{default setup view}^{analysis view} +#cpf_file^design^string^UNDEFINED^{valid file name} +cpf_keep_rows^design^boolean^FALSE^{TRUE | FALSE} +cpf_power_domain^design^boolean^FALSE^{TRUE | FALSE} +cpf_power_switch^design^boolean^FALSE^{TRUE | FALSE} +cpf_isolation^design^boolean^FALSE^{TRUE | FALSE} +cpf_state_retention^design^boolean^FALSE^{TRUE | FALSE} +cpf_level_shifter^design^boolean^FALSE^{TRUE | FALSE} +leakage_power_effort^design^boolean^UNDEFINED^{TRUE | FALSE} +dynamic_power_effort^design^boolean^UNDEFINED^{TRUE | FALSE} +report_power^power^boolean^FALSE^{TRUE | FALSE} +activity_file^design^string^UNDEFINED^{activity file} +activity_file_type^design^enum^TCF^{TCF | VCD | SAIF} +welltaps^init^list^UNDEFINED^{welltap cells} +welltaps,cell_interval^init^FLOAT^UNDEFINED^{microns} +welltaps,max_gap^init^FLOAT^UNDEFINED^{microns} +welltaps,row_offset^init^integer^UNDEFINED^{microns} +welltaps,checkerboard^init^boolean^UNDEFINED^{TRUE | FALSE} +jtag_cells^init^list^UNDEFINED^{jtag cells} +jtag_rows^init^integer^UNDEFINED^{rows} +in_place_opt^place^boolean^FALSE^{TRUE | FALSE} +no_pre_place_opt^place^boolean^FALSE^{TRUE | FALSE} +place_io_pins^place^boolean^FALSE^{TRUE | FALSE} +tie_cells^place^list^UNDEFINED^{tie cells} +tie_cells,max_distance^place^FLOAT^UNDEFINED^{FLOAT in microns} +tie_cells,max_fanout^place^integer^UNDEFINED^{integer in microns} +filler_cells^route^list^UNDEFINED^{filler cells} +congestion_effort^init^enum^UNDEFINED^{low | medium | high} +skew_buffers^clock^list^UNDEFINED^{clock cells} +clock_gate_aware^clock^boolean^FALSE^{TRUE | FALSE} +clock_gate_clone^clock^boolean^FALSE^{TRUE | FALSE} +assign_buffer^init^boolean^FALSE^{TRUE | FALSE} +high_timing_effort^init^boolean^FALSE^{TRUE | FALSE} +dont_use_list^init^list^UNDEFINED^{dont use cells} +use_list^init^list^UNDEFINED^{cells to use} +critical_range^opt^FLOAT^UNDEFINED^{range between 0.0 and 1.0} +useful_skew^opt^boolean^UNDEFINED^{TRUE | FALSE} +preserve_assertions^opt^boolean^UNDEFINED^{TRUE | FALSE} +resize_shifter_and_iso_insts^opt^boolean^UNDEFINED^{TRUE | FALSE} +fix_hold^hold^boolean^TRUE^{TRUE | FALSE} +fix_hold_ignore_ios^hold^boolean^FALSE^{TRUE | FALSE} +fix_hold_allow_tns_degradation^hold^boolean^FALSE^{TRUE | FALSE} +route_clock_nets^clock^boolean^TRUE^{TRUE | FALSE} +clock_eco^clock^enum^none^{none | postcts | postroute | both} +max_route_layer^technology^integer^UNDEFINED^{integer} +generate_tracks^init^boolean^TRUE^{TRUE | FALSE} +postroute_extraction_effort^route^enum^UNDEFINED^{low | medium | high} +multicut_via_effort^route^enum^UNDEFINED^{low | medium | high} +litho_driven_routing^route^boolean^FALSE^{TRUE | FALSE} +postroute_spread_wires^route^boolean^FALSE^{TRUE | FALSE} +delta_delay_threshold^noise^FLOAT^UNDEFINED^{FLOAT in nanoseconds} +celtic_settings^noise^string^UNDEFINED^{valid celtic commands} +coupling_c_thresh^noise^FLOAT^UNDEFINED^{FLOAT} +relative_c_thresh^noise^FLOAT^UNDEFINED^{FLOAT} +total_c_thresh^noise^FLOAT^UNDEFINED^{FLOAT} +si_analysis_type^noise^enum^UNDEFINED^{default | pessimistic} +signoff_extraction_effort^noise^enum^high^{none | low | high} +metalfill^manufacturing^enum^FALSE^{pre_postroute | pre_postroute_si | pre_signoff | false} +metalfill_tcl^manufacturing^string^UNDEFINED^{valid file name} +gds_files^manufacturing^list^UNDEFINED^{gds files} +gds_map_file^manufacturing^string^UNDEFINED^{valid file names} +local_cpus^multicpu^integer^1^{integer} +remote_hosts^multicpu^integer^0^{integer} +cpus_per_remote_host^multicpu^integer^1^{integer} +always_source_tcl^plug-in^string^UNDEFINED^{valid file name} +final_always_source_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_assign_pin_tcl^plug-in^string^UNDEFINED^{valid file name} +post_assign_pin_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_partition_tcl^plug-in^string^UNDEFINED^{valid file name} +post_partition_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_init_tcl^plug-in^string^UNDEFINED^{valid file name} +post_init_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_place_tcl^plug-in^string^UNDEFINED^{valid file name} +place_tcl^plug-in^string^UNDEFINED^{valid file name} +post_place_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_cts_tcl^plug-in^string^UNDEFINED^{valid file name} +cts_tcl^plug-in^string^UNDEFINED^{valid file name} +post_cts_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_postcts_tcl^plug-in^string^UNDEFINED^{valid file name} +post_postcts_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_postcts_hold_tcl^plug-in^string^UNDEFINED^{valid file name} +post_postcts_hold_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_prects_tcl^plug-in^string^UNDEFINED^{valid file name} +post_prects_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_route_tcl^plug-in^string^UNDEFINED^{valid file name} +post_route_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_postroute_tcl^plug-in^string^UNDEFINED^{valid file name} +post_postroute_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_postroute_hold_tcl^plug-in^string^UNDEFINED^{valid file name} +post_postroute_hold_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_postroute_si_hold_tcl^plug-in^string^UNDEFINED^{valid file name} +post_postroute_si_hold_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_postroute_si_tcl^plug-in^string^UNDEFINED^{valid file name} +post_postroute_si_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_signoff_tcl^plug-in^string^UNDEFINED^{valid file name} +post_signoff_tcl^plug-in^string^UNDEFINED^{valid file name} +pre_assemble_tcl^plug-in^string^UNDEFINED^{valid file name} +post_assemble_tcl^plug-in^string^UNDEFINED^{valid file name} +abort^flow^boolean^FALSE^{TRUE | FALSE} +mail,to^flow^list^UNDEFINED^{email addresses} +mail,steps^flow^list^UNDEFINED^{steps} +#enable_pac^assembly^boolean^FALSE^{TRUE | FALSE} +#partition_list^design^list^UNDEFINED^{design partitions} +#,pac_mode^assembly^enum^read_only^{read_only | inteface | all | ilm} diff --git a/sky130_cds/pnr/SCRIPTS/ETC/common_defaults.tcl b/sky130_cds/pnr/SCRIPTS/ETC/common_defaults.tcl new file mode 100755 index 000000000..46c445bbb --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/common_defaults.tcl @@ -0,0 +1,12 @@ + ############################################################################### + # Define option defaults and initialize undefined variables + ############################################################################### + +set flow_defaults(rundir) . +set flow_defaults(script_dir) FF +set flow_defaults(plug_dir) PLUG +set flow_defaults(rpt_dir) RPT +set flow_defaults(dbs_dir) DBS +set flow_defaults(log_dir) LOG +set flow_defaults(html_dir) HTML +set flow_defaults(vpath) make diff --git a/sky130_cds/pnr/SCRIPTS/ETC/status.dat b/sky130_cds/pnr/SCRIPTS/ETC/status.dat new file mode 100755 index 000000000..8dfa1d8f2 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/status.dat @@ -0,0 +1,13 @@ + + +############################################################### +# Host ID: $info(host.name) +# OS: $info(host.distribution) $info(host.os) $info(host.osver) $info(host.machine) +# CPU: [expr $info(cpu.total) / $info(cpu.cpucores)] -- $info(cpu.modelname) @ $info(cpu.cpuMHz) MHz +# MEM: [size $info(mem.total)] +# SWAP: [size $info(mem.swap.total)] +# TIME: [clock format [clock seconds] -format "%H:%M:%S %Z"] +# UPTIME: $info(uptime.mon) month[singular $info(uptime.mon)], $info(uptime.wks) week[singular $info(uptime.wks)], $info(uptime.day) day[singular $info(uptime.day)], $info(uptime.hrs) hour[singular $info(uptime.hrs)], $info(uptime.min) minute[singular $info(uptime.min)], and $info(uptime.sec) second[singular $info(uptime.sec)] +############################################################### + + diff --git a/sky130_cds/pnr/SCRIPTS/ETC/utils.tcl b/sky130_cds/pnr/SCRIPTS/ETC/utils.tcl new file mode 100755 index 000000000..fa4610806 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/ETC/utils.tcl @@ -0,0 +1,5038 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +package provide foundation_flow 1.0 + +namespace eval FFMM:: { + + set validModes [list "flat" "hier" "top_down" "bottom_up" "user"] + + set missingFiles " ERROR: Could not find Foundation Flow script files in directory \"%s\"" + + set missingSetupFile " ERROR: Could not find setup.tcl in directory \"%s\"" + + set missingRC " ERROR: Could not find 'rc' executable" + + set noMode " ERROR: \"-m\" option specified without a runtime mode" + + set noFlat " ERROR: \"-f\" option specified without a valid option" + + set noVersion " ERROR: \"-v\" option specified without a valid option" + + set noPath " ERROR: \"-d\" option specified without a directory path" + + set noStyle " ERROR: \"-y\" option specified without a style option \[date|increment\]" + + set noRundir " ERROR: \"-u\" option specified without a directory path" + + set noSetupPath " ERROR: \"-s\" option specified without a directory path" + + set noAppletPath " ERROR: \"-a\" option specified without a directory path" + + set nosynth_flow " WARNING: \"-r\" option specified without a synthesis flow" + + set noSuchPath " ERROR: Directory path \"%s\" not found." + + set unknownMode " ERROR: Unknown runtime mode specified \"%s\" " + + set unknownOption " ERROR: Unrecognized option \"%s\" " + + + set usage " +Usage: tclsh /SCRIPTS/gen_flow.tcl step ?step? ... ?step? + The \"step\" is the portion of the flow that you want to execute. To find + the valid list of steps for a given mode, simply omit the step from the + command-line invocation. You can also specify step as either of the two + forms: + a-b : Execute all steps between step a and b, inclusive + a- : Execute all steps in the flow from step a, inclusive + Obviously, \"a\" and \"b\" should be valid steps for the specific mode. + + Options may be one or more of the following: + -h | --help : Print this message + -H | --Help : Print step help + -m | --mode : Set the script mode. The default is \"flat\". + Valid modes are: $validModes + -d | --dir : Output directory for generated scripts. + -f | --flat : Level of unrolling ... full, partial, none + -n | --nomake : Skip Makefile generation + -y | --style : Rundir naming style \[date|increment\] + -r | --rtl : Enable RTL Script Generation + -N | --Novus : Enable novus_ui flowkit generation + -s | --setup : Provide the directory containing the setup.tcl setup file + -u | --rundir : Directory to execute the flow + requried to run the Foundation Flow. + -v | --version : Target version (17.1.0, 16.2.0, 16.1.0, 15.2.0, 15.1.0, ...) + -V | --Verbose : Verbose mode + + Examples: + --------- + + tclsh SCRIPTS/gen_innovus_flow.tcl all + + tclsh SCRIPTS/gen_innovus_flow.tcl -m top_down all + + tclsh SCRIPTS/gen_innovus_flow.tcl -d prects_scripts init-prects + + tclsh SCRIPTS/gen_innovus_flow.tcl -u work/run -y date -r default_synthesis_flow_3step all + +" +} + +namespace eval FF:: { + variable valid_versions { + 17.1.0 + 16.2.0 16.1.0 + 15.2.0 15.1.0 + 14.2.0 14.1.0 + 13.2.0 13.1.0 + 12.1.0 + 11.1.3 11.1.2 11.1.1 11.1.0 + 10.1.3 10.1.2 10.1.1 10.1.0 + 9.1.3 9.1.2 + } + + proc wrap_command {tag command} { + + global vars + global env + global errors + +# if {$vars(debug)} { +# puts " Wrapping command: $command in step $vars(step) ..." +# } + + if {![info exists vars(tags,verbose)]} { + set verbose FALSE + } else { + set verbose $vars(tags,verbose) + } + + if {![info exists vars(tags,verbosity_level)]} { + set verbosity_level LOW + } else { + switch [string toupper $vars(tags,verbosity_level)] { + "LOW" { + set verbosity_level LOW + } + "HIGH" { + set verbosity_level HIGH + } + default { + set verbosity_level LOW + } + } + } + + if {[info exists vars($tag,pre_tcl)] || \ + [info exists vars($tag,post_tcl)] || \ + [info exists vars($tag,skip)] || \ + [info exists vars($tag,replace_tcl)]} { + if {![info exists vars(tagged)]} { + set vars(tagged) [list] + } + } + + if {$verbosity_level == "HIGH"} { + set commands "# $tag\n" + } else { + set commands "" + } +# set commands "" + if {[info exists vars($tag,skip)] && $vars($tag,skip)} { + lappend vars(tagged) $tag,skip + regsub -all "\\\n" "\n\n$command\n" "\n# " skip +# append skip "\n" + if {$verbose} { + append commands "\n# " + } + append commands $skip + if {$verbose} { + append commands "\n\n" + } + append commands "\n" + if {$verbose} { + return $commands + } else { + return + } + } + + if {[info exists vars($tag,pre_tcl)]} { + if {[file exists $vars($tag,pre_tcl)]} { + lappend vars(tagged) $tag,pre_tcl + if {$vars(flat) == "full"} { + set ip [open $vars($tag,pre_tcl) r] + if {$verbose} { + append commands "\n# \n" + } + while {[gets $ip line]>=0} { + append commands "$line\n" + } + close $ip + if {$verbose} { + append commands "# \n\n" + } + } else { + append commands "source $vars($tag,pre_tcl)\n" + } + } else { + puts " ERROR: $tag pre_tcl file ($vars($tag,pre_tcl)) not found" + set errors($vars(error_count)) "$tag pre_tcl file ($vars($tag,pre_tcl)) not found" + incr vars(error_count) + if {$verbose} { + append commands "# \n\n" + } + } + } + if {[info exists vars($tag,replace_tcl)]} { + if {[file exists $vars($tag,replace_tcl)]} { + lappend vars(tagged) $tag,replace_tcl + set ip [open $vars($tag,replace_tcl) r] + if {$verbose} { + append commands "\n# \n" + } + while {[gets $ip line]>=0} { + append commands "$line\n" + } + close $ip + } else { + puts " ERROR: $tag replace_tcl file ($vars($tag,replace_tcl)) not found" + set errors($vars(error_count)) "$tag replace_tcl file ($vars($tag,replace_tcl)) not found" + incr vars(error_count) + } + if {$verbose} { + append commands "# \n\n" + } + } else { + # Insert original command here + append commands $command + } + + if {[info exists vars($tag,post_tcl)]} { + if {[file exists $vars($tag,post_tcl)]} { + lappend vars(tagged) $tag,post_tcl + if {$verbose} { + append commands "\n# \n" + } + if {$vars(flat) == "full"} { + set ip [open $vars($tag,post_tcl) r] + while {[gets $ip line]>=0} { + append commands "$line\n" + } + close $ip +# if {$verbose} { +# append commands "#<<<\n" +# } + } else { + append commands "source $vars($tag,post_tcl)\n" + } + } else { + puts " ERROR: $tag post_tcl file ($vars($tag,post_tcl)) not found" + set errors($vars(error_count)) "$tag post_tcl file ($vars($tag,post_tcl)) not found" + incr vars(error_count) + } + if {$verbose} { + append commands "# \n\n" + } + } + if {$verbosity_level == "HIGH"} { + append commands "\n# $tag\n" + } + + return $commands + } + + proc get_line_match {pattern file} { + + set ip [open $file r] + + while {[gets $ip line]>=0} { + if {[regexp "$pattern" $line]>0} { + set match $line + } + } + + return $match + } + + proc singular {val {false "s"} {true ""}} { + if {$val==1} { return $true } else { return $false } + } + + proc size {val {suffix "byte"}} { + set level 0 + set prefixes [list "" kilo mega giga tera peta] + while {$val>1024} { + set val [expr $val/1024.0] + incr level + } + set val [expr int($val+0.5)] + return "$val [lindex $prefixes $level]$suffix[singular $val]" + } + + proc system_info {} { + + global vars + + set uname [exec uname] + + if {[lsearch "Linux" $uname] != -1} { + + set inFile "$vars(script_root)/ETC/status.dat" + + if {![file exists $inFile]} { + return + } + + set upId [open "/proc/uptime" r] + set info(uptime) [lindex [split [gets $upId] .] 0] + close $upId + + foreach {var val} {mon 2592000 wks 604800 day 86400 hrs 3600 min 60 sec 1} { + set info(uptime.${var}) [expr $info(uptime)/${val}] + set info(uptime) [expr $info(uptime)-($info(uptime.${var})*${val})] + } + + set info(host.fqdn) [info hostname] + set info(host.name) [lindex [split $info(host.fqdn) .] 0] + set info(host.domain) [string range $info(host.fqdn) [expr [string length $info(host.name)]+1] end] + set info(host.os) $::tcl_platform(os) + set info(host.osver) $::tcl_platform(osVersion) + set info(host.machine) $::tcl_platform(machine) + + if {$info(host.os)=="Linux"} { + if {[file exists /etc/slackware-version]} { set info(host.distribution) "Slackware" } + if {[file exists /etc/redhat-release]} { set info(host.distribution) "RedHat" } + if {[file exists /etc/mandrake-release]} { set info(host.distribution) "Mandrake" } + if {![info exists info(host.distribution)]} { set info(host.distribution) "Unknown" } + } else { + return + } + + set cpuId [open "/proc/cpuinfo" r] + set info(cpu.total) 0 + set info(cpu.cpucores) 1 + while {![eof $cpuId]} { + gets $cpuId ln + set ln [split $ln :] + set item [string trim [lindex $ln 0]] + set value [string trim [lindex $ln 1]] + set info(cpu.[lindex $item 0][lindex $item 1]) $value + if {[lindex $item 0] == "processor"} {incr info(cpu.total)} + } + close $cpuId + + set memId [open "/proc/meminfo" r] + set info(mem.free) 0 + while {![eof $memId]} { + gets $memId ln + set ln [split $ln :] + set item [string trim [lindex $ln 0]] + catch { set value [expr [string trim [lindex [lindex $ln 1] 0]]*1024] } + switch -- "$item" { + MemTotal { set info(mem.total) $value } + SwapTotal { set info(mem.swap.total) $value } + SwapFree { set info(mem.swap.free) $value } + MemFree { incr info(mem.free) $value } + Cached { incr info(mem.free) $value } + Buffers { incr info(mem.free) $value } + } + } + + set parseId [open $inFile r] + while 1 { + gets $parseId ln + if {[eof $parseId]} { break } + catch { puts [subst $ln] } err + } + close $parseId + } + } + + ############################################################################ + # This routine iterates over variables that maintain lists of files. If + # any element of the list is a wildcard, that entry is replaced with the + # Tcl command that will expand the name at runtime + ############################################################################ + + proc process_file_lists {} { + + global vars + + if {![info exists vars(globbed)]} { + set vars(globbed) false + } + if {$vars(globbed)} { + return + } + set vars(globbed) true + + if {[regexp "^11" $vars(version)]} { + return + } + # BCL: Removed def_files from this list + set var_indices [list "cts_spec" "lef_files" \ + "timing" "si" "ecsm" "cts_sdc"] + + # BCL: Add def_files to list only if it doesn't have [subst] in the name (other wise we need to keep [subst... unexpanded) + if {[info exists vars(def_files)] && ![regexp {\[subst \$vars} $vars(def_files)]} {lappend var_indices def_files} + + foreach index $var_indices { + set all_names [array names vars -glob "*$index"] + foreach name $all_names { + set expanded_files "" + # BCL: Added subst around final variable to resolve vars(rundir) references + foreach file [subst $vars($name)] { + if {([string first "*" $file] != -1) || + ([string first "?" $file] != -1)} { + if {![catch {set files [glob $file]}]} { + lappend expanded_files $files + } + } else { + lappend expanded_files $file + } + } + set vars($name) $expanded_files + } + } + } + + proc get_required_procs {file} { + # + # Given a list of required procedures, return the lines that represent + # those procedures from the utils.tcl file + # + + global vars + global errors + + # + # Read the file and gather all of the contents + # + + set all_lines "" + set length 0 + set ip [open $file] + while {[gets $ip line]>=0} { + if {[info exists vars(novus)] && $vars(novus)} { + set utils_lines($length) [regsub "Puts" $line "puts"] + } else { + set utils_lines($length) $line + } + incr length + } + close $ip + + # + # Iterate across each line and pull out relevant procedures + # + + set lines "" + set i 0 + while {$i < $length} { + set line $utils_lines($i) + foreach proc $vars(required_procs) { + if {[regexp "proc $proc" $line] > 0} { + append lines " $line\n" + incr i + while {$i < $length} { + set line $utils_lines($i) + if {[regexp "proc " $line] > 0} { + incr i -1 + break + } + if {![regexp "^#" [string trimleft $line] ] && ($i != [expr $length-1])} { + append lines "$line\n" + } + incr i + } + break + } + } + incr i + } + + set lines [string trimright $lines] + return "$lines\n" + } + + + proc source_plug {plugin {abort 1}} { + + global vars + global env + global warnings + global plugin_error + global errorInfo + global return_code + + # Added for ETS/EPS + if {![info exists vars(flat)]} { + set vars(flat) full + } + + if {[info exists vars(codegen)] && !$vars(codegen)} { + set vars(flat) full + } + + set flat $vars(flat) + + if {$vars(generate_flow_steps)} { + #set vars(flat) full + } + + if {[info exists vars(verbose)] && $vars(verbose)} { + set verbose true + } else { + set verbose false + } + + set commands "puts \" Plugin -> $plugin\"\n" + set no_comments "" + + if {[info exists vars($plugin)]} { + if {![info exists vars(plugins)]} { + set vars(plugins) [list] + } + if {[lsearch $vars(plugins) $plugin] == -1} { + set suffix [lindex [split $plugin ","] 1] + if {($suffix != "derate_tcl") && ($suffix != "scale_tcl")} { + lappend vars(plugins) $plugin + } + } + set found 0 + set plug_list [] + foreach plug_file $vars($plugin) { + if {[file exists $plug_file]} { + set found 1 + lappend plug_list $plug_file + continue + } elseif {[file exists $vars(plug_dir)/$plug_file]} { + set found 1 +# lappend plug_list $plug_file + lappend plug_list $vars(plug_dir)/$plug_file + continue + } else { + if {[file exists $vars(cwd)/$plug_file]} { + set found 1 + lappend plug_list $vars(cwd)/$plug_file + continue + } + } + } + if {!$found} { + if {![info exists vars(missing_plugins)]} { + set vars(missing_plugins) [list] + } + if {[lsearch $vars(missing_plugins) $plugin] == -1} { + lappend vars(missing_plugins) $plugin + set warnings($vars(warning_count)) "Plug-in $plugin defined but file(s) not found" + incr vars(warning_count) + } + } + if {$vars(flat) == "partial"} { + foreach plug_file $plug_file { + if {[file exists $plug_file]} { + append commands "puts \" LOADING \'$plug_file\' PLUG-IN FILE(s) \"\n" + append commands "if { \[ catch { source $plug_file } plugin_error \] } {\n" + append commands " puts \" ============= PLUG-IN ERROR ==================\"\n" + append commands " puts \" \$errorInfo\"\n" + append commands " puts \" \$plugin_error\"\n" + append commands " puts \" ==============================================\"\n" + append commands " set return_code 99\n" + if {$abort} { + append commands " exit \$return_code\n" + } + append commands "}\n" + } + } + } elseif {$vars(flat) == "full"} { + if {!$found} { + append commands "ff_procs::source_plug $plugin\n" + } else { + if {$verbose && ![regexp "," $plugin]} { + set commands "\n# \n" + } + if {![info exists vars(plug_files)]} { + set vars(plug_files) [list] + } + foreach plug_file $plug_list { + if {[file exists $plug_file]} { +# if {$verbose} { +# append commands "#>>>\n" +# } + append commands "# \n" + if {[info exists vars(old_plugins)] && $vars(old_plugins) && ([lsearch $vars(edi_plugins) $plugin] != -1)} { + append commands "eval_enc \{\n" + } + if {[lsearch $vars(plug_files) $plugin] == -1} { + set suffix [lindex [split $plugin ","] 1] + if {($suffix != "derate_tcl") && ($suffix != "scale_tcl")} { + lappend vars(plug_files) "$plugin" + } + } + set ip [open $plug_file r] + while {[gets $ip line]>=0} { +# if {![regexp "^$" $line]} { + if {$vars(generate_flow_steps)} { + append commands " $line\n" + } else { + append commands "$line\n" + } + if {![regexp "^#" $line]} { + append no_comments " $line\n" + } +# } + } + close $ip + append commands "# \n" + if {[info exists vars(old_plugins)] && $vars(old_plugins) && ([lsearch $vars(edi_plugins) $plugin] != -1)} { + append commands "\}\n" + } +# if {$verbose} { +# append commands "#<<<\n" +# } + } elseif {[file exists $vars(plug_dir)/$plug_file]} { +# if {$verbose} { +# append commands "#>>>\n" +# } + if {[lsearch $vars(plug_files) $plugin] == -1} { + set suffix [lindex [split $plugin ","] 1] + if {($suffix != "derate_tcl") && ($suffix != "scale_tcl")} { + lappend vars(plug_files) "$plugin" + } + } + set ip [open $vars(plug_dir)/$plug_file r] + while {[gets $ip line]>=0} { + if {![regexp "^$" $line]} { + append commands "$line\n" + } + if {![regexp "^#" $line]} { + append no_comments " $line\n" + } + } + close $ip +# if {$verbose} { +# append commands "#<<<\n" +# } + } + } + if {$verbose && ![regexp "," $plugin]} { + append commands "# \n\n" + } + } + } else { + append commands "ff_procs::source_plug $plugin\n" + } + } + set vars(flat) $flat + if {$vars(generate_flow_steps) && ($no_comments != "") && ![regexp ff_procs $commands] && ![regexp derate_tcl $plugin]} { + if {$no_comments == ""} { + set commands "" + } + if {[lindex [split $vars(version) "."] 0] > 14} { + if {![file exists $vars(cwd)/.plugins]} { + set op [open $vars(cwd)/.plugins w] + } else { + set op [open $vars(cwd)/.plugins a] + } + + if {[regexp "^pre_$vars(step)" $plugin] && ($vars(step) != "partition_place")} { + set type begin_tcl + } else { + if {[regexp "^post_$vars(step)" $plugin] && ($vars(step) != "partition_place")} { + set type end_tcl + } else { + if {[regexp "^syn" $plugin] || [regexp "^always" $plugin] || [regexp "^final_always" $plugin] || [regexp "^pre_syn" $plugin]} { + set type import + } else { + if {$vars(step) != "partition_place"} { + set type skip + } else { + set type import + } + } + } + } + + set step_plug [format %s_%s $vars(step) $plugin] + if {![info exists vars(processed_plugins)]} { + set vars(processed_plugins) [list] + lappend vars(processed_plugins) $step_plug + } else { +# puts "$vars(processed_plugins) : $step_plug" + if {[lsearch $vars(processed_plugins) $step_plug] == -1} { + lappend vars(processed_plugins) $step_plug + } else { + if {($vars(step) != "partition_place") && ![regexp "always" $plugin]} { + set type skip + } + } + } + if {$type != "skip"} { +# if {$type == "import"} { +# set ip [open $plug_file r] +# while {[gets $ip line]>=0} { +# if {![regexp "^$" $line]} { +# append commands " $line\n" +# if {![regexp "^#" $line]} { +# append no_comments " $line\n" +# } +# } +# } +# close $ip + return $commands + } else { + if {[info exists vars(old_plugins)] && ![regexp syn_ $vars(step)]} { + set temp "set_db flow_step:$vars(step) .$type { eval_enc {\n" + append temp $no_comments + append temp "}}\n" + puts $op $temp + } else { + set temp "set_db flow_step:$vars(step) .$type {\n" + append temp $no_comments + append temp "}\n" + puts $op $temp + } + } + } else { + puts "Skipping plugin $plugin as it cannot be (or already has been) tied to a flow_step attribute" + } + close $op + } else { + return $commands + } + } else { + return $commands + } + } + + namespace export get_tool + proc get_tool {} { + set tool_name "" + set path_to_exe [info nameofexecutable] + if {[regexp {/rc(64)?(-\w)?$} $path_to_exe]} { + set tool_name "rc" + } elseif {[regexp {/genus(64)?(-\w)?$} $path_to_exe]} { + set tool_name "rc" + } elseif {[regexp {.*\/(LEC|lec)} $path_to_exe]} { + set tool_name "lec" + } elseif {[regexp {.*\/verify} $path_to_exe]} { + set tool_name "clp" + } elseif {[regexp {.*\/CCD} $path_to_exe]} { + set tool_name "ccd" + } elseif {[regexp {.*\/ctos} $path_to_exe]} { + set tool_name "ctos" + } elseif {[regexp {.*\/tclsh} $path_to_exe]} { + set tool_name "tclsh" + } elseif {[regexp {.*\/innovus} $path_to_exe]} { + set tool_name "edi" + } elseif {[regexp {.*\/encounter} $path_to_exe]} { + set tool_name "edi" + } elseif {[regexp {.*\/velocity} $path_to_exe]} { + set tool_name "edi" + } elseif {[regexp {.*\/ncsim} $path_to_exe]} { + set tool_name "ies" + } + return $tool_name + } + + proc source_file {file {abort 1}} { + global vars + global source_error + global errorInfo + global return_code + +# puts " LOADING '$file' FILE" + if {[file exists $file]} { + if {[info command FF::get_tool] ne "" && [FF::get_tool] eq "rc" } { + set sourceResult [catch { uplevel tcl_source $file } source_error ] + } else { + set sourceResult [catch { uplevel source $file } source_error ] + } + if { $sourceResult } { + puts " =============== TCL ERROR ====================" + puts " Error loading $file file" + puts " $errorInfo" + puts " $source_error" + puts " ==============================================" + set return_code 99 + if {$abort} { + exit $return_code + } + } + } + } + + proc get_by_suffix {passed_array {suffix ""}} { + # + # Get the list of array indices that have a suffix of the + # passed string sequence + # + + upvar $passed_array the_array + + # + # If there is no suffix, return every name + # + + if {[string length $suffix] == 0} { + return array names the_array + } + + # + # If there is a suffix, find the matching names and return + # the list of those names (without the suffix attached to it). + # This is most helpful when looking for "multi-dimensional array + # indices" (in quotes because Tcl doesn't support multiple + # dimensions for array indices) + # + + set suffix_length [string length $suffix] + set all_names [array names the_array -glob "*$suffix"] + set names [list] + foreach name $all_names { + set length [string length $name] + set index [string range $name 0 [expr $length - $suffix_length - 1]] + lappend names $index + } + return $names + } + + ########################################################################### + # Utility procedures on lists + ########################################################################### + + proc lintersection {lista listb} { + # + # Return the intersection of lista and listb, removing any duplicates + # + + set intersect [list] + foreach a $lista { + if {([lsearch $listb $a] != -1) && \ + ([lsearch $intersect $a] == -1)} { + lappend intersect $a + } + } + return $intersect + } + + + proc lunion {lista listb} { + # + # Return the union of lista and listb, removing any duplicates + # + + set union [list] + foreach a $lista { + if {[lsearch $union $a] == -1} { + lappend union $a + } + } + foreach b $listb { + if {[lsearch $union $b] == -1} { + lappend union $b + } + } + return $union + } + + ########################################################################### + # Utilities to handle different control structure output (if-then-else, + # foreach, etc.) + ########################################################################### + + proc for_each {var var_list code_block} { + # + # Return a string for a Tcl foreach block + # + + set code "" + if {![llength $code_block]} { + return $code + } + + set code "foreach $var $var_list \{\n" + foreach line [getLines $code_block] { + append code " $line" + } + append code "\}\n" + return $code + } + + proc get_lines {code_block} { + # + # Return a list of lines from the strings in code_block + # + + set block [list] + while {[llength $code_block]} { + set index [string first "\n" $code_block] + if {$index == -1} { + set index [string length $code_block] + } + set line [string range $code_block 0 $index] + set code_block [string range $code_block [expr $index + 1] end] + + if {[string index $line end] != "\n"} { + append line "\n" + } + lappend block $line + } + + return $block + } + + proc if_else {cond then_block {else_block ""}} { + # + # Output a Tcl if-then-else block with the passed data. + # + + set command "if \{$cond\} \{\n" + foreach line [get_lines $then_block] { + append command " $line" + } + if {[llength $else_block]} { + append command "\} else \{\n" + foreach line [get_lines $else_block] { + append command " $line" + } + } + append command "\}\n" + return $command + } + + proc pretty_print_lists {line debug} { + # + # If there is an explicit Tcl list in the line, we may want to + # separate it out into multiple lines. It will turn a list from + # [list a b c] + # into + # [list a \ + # b \ + # c] + # That may not look like much, but for lists that have really *big* + # text entries, it makes it look a lot nicer + # + # If there is no list in the line, do nothing + # + + set endChar [string index $line end] + set line [string trimright $line] + if {$endChar == "\n"} { + append line "\n" + } + set listPos [string first "\[list " $line] + if {$listPos == -1} { + return $line + } + set original $line + + # + # Initialize the line with the contents of the line up to and including + # the "[list " text. Also determine the amount of indentation in the + # line so that we know what to do for subsequent lines + # + + incr listPos 5 + set nextLine [string range $line 0 $listPos] + set indent [string repeat " " [string length $nextLine]] + set line [string trimleft [string range $line $listPos end]] + + # + # Make sure that there is no space between the close brace in the list + # and the last text in the list. This will help with processing (below) + # + + set line [string trimright $line] + if {[string index $line end] != "\]"} { + return $original + } + set line [string range $line 0 [expr [string length $line] - 2]] + set line [string trimright $line] + append line "\]\n" + + # + # Parse each element in the list + # + + set printString "" + while {[string length $line]} { + # + # Get the next item in the list + # + + set space [string first " " $line] + if {$space == -1} { + set space [string length $line] + } + set arg [string range $line 0 $space] + append nextLine $arg + + # + # Remove that item from the line + # + + set line [string range $line [expr $space + 1] end] + set line [string trimleft $line] + if {[string length $line]} { + if {[string length $nextLine] > 80} { + append printString "$nextLine\\\n" + set nextLine $indent + } + } + } + append printString $nextLine + return $printString + } + + proc pretty_print {commands format_options {debug 0}} { + + global vars + + # + # Pretty print the lines, one by one. The following will be done: + # o If the line is greater than 80 columns, we will break it up + # along the options (-option) and indent + # o Fix any indentation + # + + if {[info exists vars(catch_errors)] && $vars(catch_errors)} { + set indent 3 + } else { + set indent 0 + } + set lines "" + set len [string length $commands] + while {$len > 0} { + # + # Handle the simple case. If the leading character is a carriage + # return, append a blank line to the pretty-printed lines and + # continue on + # + + set cr [string first "\n" $commands] + if {!$cr} { + set commands [string range $commands 1 end] + incr len -1 + append lines "\n" + continue + } + + # + # If we didn't find a carriage return in the string, the entire thing + # is a single line. Otherwise, remove the next line from the set of + # lines. If it still ends up being a blank line, append the blank + # line to the pretty-printed string and continue on + # + + if {$cr == -1} { + set line $commands + set commands "" + set len 0 + } else { + set line [string range $commands 0 $cr] + set commands [string range $commands [incr cr] end] + set len [expr $len - $cr] + } + set line [string trimright $line] + if {![string length $line]} { + append lines "\n" + continue + } + + # + # We have a real line with real text. If there is no quote in the + # string, compress multiple blank spaces to a single blank space + # + + set line [string trimleft $line] + if {[string first "\"" $line] == -1} { + set line [regsub -all {\s+} $line " "] + } + + # + # Apply the proper amount of indentation + # + + set isPut [string equal -nocase -length 5 $line "puts "] + set firstChar [string index $line 0] + if {$firstChar == "\}"} { + incr indent -3 + } + set blanks [string repeat " " $indent] + set line "${blanks}${line}" + if {[string index $line end] == "\{"} { + incr indent 3 + } + + # + # If the first character is a dash, we have already broken the line + # up for pretty printing. + # + + if {$firstChar == "-"} { + append lines " $line\n" + continue + } + + # + # Don't bother formatting comments or short lines. Also, if the + # routine has been told not to format the command line options, just + # output the line + # + + set lineLen [string length $line] + if {$isPut || ($firstChar == "\#") || + ($lineLen < 80) || !$format_options} { + append lines "$line\n" + continue + } + + # + # The line length is over 80, and it's a real Innovus command, and it's + # not a print (puts) statement. Start indenting on the -option + # options. The first "-option" should be on the same line as the + # command. All subsequent options should be on their own line, + # slightly indented from the basic command + # + + set firstDash [string first " -" $line] + if {$firstDash == -1} { + append lines "$line\n" + continue + } + + set dash [string first " -" $line [incr firstDash]] + set leading "" + while {$dash != -1} { + set fragment [string range $line 0 [expr $dash - 1]] + append lines \ + [pretty_print_lists "${leading}${fragment} \\\n" $debug] + set leading "$blanks " + set line [string range $line [expr $dash + 1] end] + set line [string trimleft $line] + set dash [string first " -" $line] + } + append lines [pretty_print_lists "${leading}${line}\n" $debug] + } + return $lines + } + + proc strip_lines {commands markers} { + # + # This routine strips out lines from $commands when they start with + # any of the list elements in $markers + # + + set lines "" + while {[string length $commands] > 0} { + # + # Get the next line from the set of commands + # + + set cr [string first "\n" $commands] + if {$cr == -1} { + set line $commands + set commands "" + } else { + set line [string range $commands 0 $cr] + set commands [string range $commands [incr cr] end] + } + + # + # If the line starts with a marker, ignore the line + # + + set trimmed [string trimleft $line] + set matched false + foreach marker $markers { + set len [string length $marker] + if {[string equal -nocase -length $len $marker $trimmed]} { + set matched true + break + } + } + if {$matched} { + continue + } + append lines $line + } + + return $lines + } + + proc gen_makefile {steps type} { + global vars + global desc + global env + global errors + + puts "HELLO" + + if {!$vars(makefile)} { + return + } + + set desc(syn_map) "Technology Mapping" + set desc(syn_incr) "Incremental Synthesis" + set desc(syn_place) "Placement/Physical Synthesis" + set desc(init) "Design Import / Initialization" + if {$vars(rc)} { + set desc(place) "Legalization" + } else { + set desc(place) "Cell Placement" + } + set desc(prects) "PreCTS Optimization" + set desc(cts) "Clock Tree Synthesis" + set desc(postcts) "PostCTS Optimization" + set desc(postcts_hold) "PostCTS Hold Fixing" + set desc(route) "Global/Detail Route" + set desc(postroute) "PostRoute Optimization" + set desc(postroute_hold) "PostRoute Hold Fixing" + set desc(postroute_si_hold) "SI Hold Fixing" + set desc(postroute_si) "SI Optimization" + set desc(signoff) "Signoff Timing / Verify" + + if {$vars(debug)} { + puts " Generating $type makefile in [exec pwd] for steps $steps ..." +# if {[info exists vars(partition_dir)]} { +# puts "vars(partition_dir) -> $vars(partition_dir)" +# puts "[file tail [file dirname [exec pwd]]] == $vars(partition_dir)" +# puts "[file dirname [exec pwd]] == [file normalize $vars(partition_dir)]" +# } + } + + puts "-------------------------------------------------" + puts " Generating $type Makefile for [llength $steps] steps" + puts " Directory: [pwd]" + puts " Steps: $steps" +# puts "-------------------------------------------------" + # BCL: Note - the Makefile needs to be fixed to the rundir here, as it will be dumped in the final exported + # vars.tcl + if {$vars(make) == "all"} { + if {([file tail [file dirname [exec pwd]]] == $vars(partition_dir)) || \ + ([file tail [file dirname [exec pwd]]] == $vars(partition_dir_pass2))} { + set vars(makefile_name) "Makefile" + } else { + set vars(makefile_name) "\$vars(rundir)/Makefile" + } + } else { + if {[file tail [file dirname [exec pwd]]] == $vars(partition_dir)} { + set vars(makefile_name) "Makefile.$vars(argv)" + } else { + set vars(makefile_name) "\$vars(rundir)/Makefile.$vars(argv)" + } + } + + regsub -all " " $vars(makefile_name) "_" vars(makefile_name) + + set op [open [subst $vars(makefile_name)] w] +# if {$vars(debug)} { +# puts " Opening file: $vars(makefile_name) in [exec pwd] -> $op" +# } +# set stop signoff + set stop [lindex $vars(steps) [expr [llength $vars(steps)]-1]] + if {$vars(rc) && [info exists vars(rc_steps)]} { + set start [lindex $vars(rc_steps) 0] + } else { + set start [lindex $vars(steps) 0] + } + + if {$type == "hier"} { + set type top_down + if {$vars(hier_flow_type) == "2pass"} { + set type 2pass + if {$vars(enable_flexilm)} { + set type flexilm + } + } + } + if {$type == "user"} { set type flat } + + switch $type { + + "flat" { + set execute_string [join $vars(execute_string)] + puts $op "VERSION=17.10-p003_1" + puts $op "VPATH=$env(VPATH)" + puts $op "TCLSH=[lindex $execute_string 0]" + puts $op "GEN_FLOW=[::FF::relPathTo [file normalize [subst [lindex $execute_string 1]]] [file normalize [subst $vars(rundir)]]]" + puts $op "SETUP_PATH=[relPathTo [file normalize [subst $vars(setup_path)]] [file normalize [subst $vars(rundir)]]]" + puts $op "TOOL=$vars(make_tool)" + puts $op "ARGS=$vars(make_tool_args)" + puts $op "FSTEPS=$steps" + if {$vars(rc)} { + puts $op "SYN_TOOL=$vars(make_syn_tool)" + puts $op "SYN_ARGS=$vars(make_syn_tool_args)" + if {[info exists vars(syn_log_dir)]} { + puts $op "SYN_LOG=[relPathTo [file normalize [subst $vars(syn_log_dir)]] [file normalize $vars(rundir)]]" + } + } + if {[regexp $vars(partition_dir) [file tail [file dirname [pwd]]]]} { + puts $op "SCRIPTS=$vars(script_dir)" + puts $op "LOG=$vars(log_dir)" + } else { + # BCL: Added the following in order to fix the difference in location between the rundir and scripts location + puts $op "SCRIPTS=[relPathTo [file normalize $vars(script_dir)] [file normalize $vars(rundir)]]" + # BCL: Added subst to resolve vars(rundir) + # BCL: Then modified to make relative to the rundir + puts $op "LOG=[relPathTo [file normalize [subst $vars(log_dir)]] [file normalize $vars(rundir)]]" + } + puts $op "BROWSER=$vars(make_browser)" + if {[info exists vars(make_update)]} { + puts $op "UPDATE=$vars(make_update)" + } elseif {[file tail [file dirname [pwd]]] != "$vars(partition_dir)"} { + puts $op "UPDATE=yes" + } + puts $op "" + + puts $op "STEPS = [format "version setup %s do_cleanup" $steps]" + puts $op "FF_START = $start" + puts $op "FF_STOP = $stop" + puts $op "" + puts $op [format "all: version setup %s do_cleanup" $steps] + puts $op "" + puts $op "version:" + puts $op "\t@echo \"\# Foundation Flows Version \$(VERSION)\"" + puts $op "" + puts $op "help:" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" \$(VERSION) Foundation Flows\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" Makefile Targets\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" setup : Setup Run Directory\"" + if {$vars(rc) && [info exists vars(rc_steps)]} { + foreach step $vars(rc_steps) { + puts $op "\t@echo \" $step : $desc($step)\"" + } + } + foreach step $steps { +# puts $op "\t@echo \" $step : $desc($step)\"" + if {![info exists desc($step)]} { + set desc($step) "No information for this step" + } + set temp [format "%+21s : %-45s" $step $desc($step)] + puts $op "\t@echo $temp" + } + puts $op "\t@echo \"---------------------------------------------------\"" + puts $op "\t@echo \" all : All design steps\"" + puts $op "\t@echo \" simple : Single script (all steps in a single session) - no stop/start\"" + puts $op "\t@echo \" single : Single script (all steps in a single session)\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" Makefile Options\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" VPATH : Make directory (default make)\"" + if {$vars(novus)} { + puts $op "\t@echo \" TOOL : INNOVUS executable (default innovus)\"" + puts $op "\t@echo \" ARGS : INNOVUS arguments (default -nowin -64)\"" + } else { + puts $op "\t@echo \" TOOL : INNOVUS executable (default innovus)\"" + puts $op "\t@echo \" ARGS : INNOVUS arguments (default -nowin -64)\"" + } + if {$vars(rc)} { + puts $op "\t@echo \"SYN_TOOL : GENUS executable (default genus)\"" + puts $op "\t@echo \"SYN_ARGS : GENUS arguments (default -64)\"" + puts $op "\t@echo \"SYN_LOG : GENUS log dir (default RC/logs/.log)\"" + } + if {[file tail [file dirname [pwd]]] != "$vars(partition_dir)"} { + puts $op "\t@echo \" UPDATE : Update scripts (default yes)\"" + } + puts $op "\t@echo \" SCRIPTS : Script directory (default $vars(script_dir))\"" + puts $op "\t@echo \" LOG : Logfile directory (default [subst $vars(log_dir))]\"" + puts $op "\t@echo \"===================================================\"" + puts $op "" +# if {[file tail [file dirname [pwd]]] != "$vars(partition_dir)"} { +# if {[info exists vars(plug_files)]} { +# puts $op "flow: $vars(config_files) $vars(plug_files)" +# } else { +# puts $op "flow: $vars(config_files)" +# } +# puts $op "\t@if \[ \$(UPDATE) == yes ] ; then \\" +# puts $op "\t\t[lindex $execute_string 0] [lindex $execute_string 1] -m flat all ; \\" +# puts $op "\t\t/bin/touch \$(VPATH)/\$@ ; \\" +# puts $op "\telse \\" +# puts $op "\t\techo 'SKIPPING FLOW UPDATE ...' ; \\" +# puts $op "\tfi" +# } else { +# puts $op "flow:" +# } + + puts $op "\nsimple: setup" + if {$vars(step_arg) == "all"} { + puts $op "\tFF_STOP=\$(FF_STOP); VPATH=\$(VPATH); export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_simple.tcl -log \$(LOG)/simple.log \$(ARGS)" + } else { + puts $op "\tFF_STOP=\$(FF_STOP); VPATH=\$(VPATH); export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_simple.$vars(step_arg).tcl -log \$(LOG)/simple.$vars(step_arg).log \$(ARGS)" + } + puts $op "" + puts $op "\nsingle: setup" + puts $op "\tFF_STOP=\$(FF_STOP); VPATH=\$(VPATH); export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_all.tcl -log \$(LOG)/single.log \$(ARGS)" + puts $op "" + puts $op "setup:" + puts $op "\t@/bin/mkdir -p \$(VPATH) \$(LOG)" + puts $op "\t@/bin/touch \$(VPATH)/\$@" + if {[info exists vars(enable_ldb)] && $vars(enable_ldb)} { + puts $op "\t\$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_compile.tcl -log \$(LOG)/compile.log -win \$(ARGS)" + } + puts $op "" + + + set prior_step "setup" + + set arg_list "-n " +# if {$vars(novus)} { +# append arg_list "-N " +# } + if {$vars(verbose)} { + append arg_list "-V " + } + if {$vars(edi)} { + append arg_list "-e " + } + if {$vars(rc)} { + append arg_list "-r " + } + # RC Steps, if any, always go first + if {[info exists vars(rc_steps)] && $vars(rc_steps) ne ""} { + foreach step $vars(rc_steps) { + puts $op "$step: $prior_step" + puts $op "\t@mkdir -p \$(SYN_LOG);" + if {![regexp $vars(partition_dir) [file tail [file dirname [pwd]]]]} { + puts $op "\t@if \[ \"\$(UPDATE)\" = \"yes\" ] ; then \\" + if {[file normalize .] ne [file normalize $vars(rundir)]} { + puts $op "\t\tcd [relPathTo [file normalize .] [file normalize $vars(rundir)]]; [lindex $execute_string 0] [::FF::relPathTo [file normalize [subst [lindex $execute_string 1]]] [file normalize [subst $vars(rundir)]]] -m flat -d [relPathTo [file normalize $vars(script_dir)] [file normalize $vars(rundir)]] -v $vars(version) -s [relPathTo [file normalize [subst $vars(setup_path)]] [file normalize [subst $vars(rundir)]]] -y none -u [relPathTo [file normalize $vars(rundir)] [file normalize .]] $arg_list $step ; \\" + } else { + puts $op "\t\t[lindex $execute_string 0] [::FF::relPathTo [file normalize [subst [lindex $execute_string 1]]] [file normalize [subst $vars(rundir)]]] -m flat -d [relPathTo [file normalize $vars(script_dir)] [file normalize $vars(rundir)]] -v $vars(version) -s [relPathTo [file normalize [subst $vars(setup_path)]] [file normalize [subst $vars(rundir)]]] -y none $arg_list $step ; \\" + } + puts $op "\tfi" + } + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(SYN_TOOL) -f \$(SCRIPTS)/GENUS/$step.tcl -logfile \$(SYN_LOG)/$step.log -cmdfile \$(SYN_LOG)/$step.cmd \$(SYN_ARGS)" + set prior_step $step + } + } + + foreach step $steps { + # These steps should not also be rc_steps: + if {![info exists vars(rc_steps)] || [lsearch $vars(rc_steps) $step] == "-1"} { + puts $op "$step: $prior_step" + puts $op "\t@mkdir -p \$(LOG);" +# puts $op "\t@\$(MAKE) -f Makefile flow" + if {![regexp $vars(partition_dir) [file tail [file dirname [pwd]]]]} { + puts $op "\t@if \[ \"\$(UPDATE)\" = \"yes\" ] ; then \\" + # cd to ff_exe_dir here only if vars(rundir) ne vars(ff_exe_dir) + if {[file normalize .] ne [file normalize $vars(rundir)]} { + puts $op "\t\tcd [relPathTo [file normalize .] [file normalize $vars(rundir)]]; [lindex $execute_string 0] [::FF::relPathTo [file normalize [subst [lindex $execute_string 1]]] [file normalize [subst $vars(rundir)]]] -m $vars(mode) -d [relPathTo [file normalize $vars(script_dir)] [file normalize $vars(rundir)]] -v $vars(version) -s [relPathTo [file normalize [subst $vars(setup_path)]] [file normalize [subst $vars(rundir)]]] -y none -u [relPathTo [file normalize $vars(rundir)] [file normalize .]] $arg_list $step ; \\" + } else { + puts $op "\t\t[lindex $execute_string 0] [::FF::relPathTo [file normalize [subst [lindex $execute_string 1]]] [file normalize [subst $vars(rundir)]]] -m $vars(mode) -d [relPathTo [file normalize $vars(script_dir)] [file normalize $vars(rundir)]] -v $vars(version) -s [relPathTo [file normalize [subst $vars(setup_path)]] [file normalize [subst $vars(rundir)]]] -y none $arg_list $step ; \\" + } + # Need to add code to cd back to rundir here + puts $op "\tfi" + } + if {[regexp "^syn" $step]} { + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(SYN_TOOL) -f \$(SCRIPTS)/GENUS/run_$step.tcl -logfile \$(LOG)/$step.log -cmdfile \$(LOG)/$step.cmd \$(SYN_ARGS)" + } else { + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_$step.tcl -log \$(LOG)/$step.log -overwrite \$(ARGS)" + } +# puts $op "\t/bin/touch \$(VPATH)/$step\n" + set prior_step $step + } + } + +# puts $op "html:" +# puts $op "\tFFVARS=$vars(script_dir)/vars.tcl; export FFVARS; /usr/bin/tclsh \$(SCRIPTS)/INNOVUS/gen_html.tcl .; cd $vars(html_dir); \$(BROWSER) file:`pwd`/index.html" +# puts $op "" + puts $op "debug_%:" + puts $op "\tVPATH=\$(VPATH); export STEP=\$* ; export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_debug.tcl -log \$(LOG)/\$@.log -win \$(ARGS:-nowin=)" + puts $op "" + puts $op "lec_%:" + puts $op "\texport STEP=\$* ; lec -64 -xl -Dofile \$(SCRIPTS)/INNOVUS/run_lec.tcl -NOGui -LOGfile \$(LOG)/\$@.log" + puts $op "" + puts $op "help_%:" + puts $op "\t[lindex $execute_string 0] \$(GEN_FLOW) -H \$*" + puts $op "" +# puts $op ".PHONY: clean html" + puts $op ".PHONY: clean" + puts $op "" + puts $op "clean:" + puts $op "\t/bin/mv *.rpt $vars(rpt_dir) ;\\" + puts $op "\t/bin/rm -fr extLogDir* __qrc.log *cts_trace *.rpt.old *delete* placementReports* *.rguide *_mmmc \\\n\t*_constr.pt .constr* .FE* .routing* .timing_file* .tdrlog*" + puts $op "\trm make/*" + puts $op "" + puts $op "do_cleanup: signoff" + puts $op "\t\$(MAKE) clean" + puts $op "\t/bin/touch \$(VPATH)/\$@" + puts $op "" + puts $op "reset : version" + puts $op "\t/bin/rm -fr \$(VPATH)/* extLogDir* __qrc.log *cts_trace *.rpt.old *delete* placementReports* *.rguide *_mmmc" + puts $op "\t@for file in \$(STEPS) ; \\" + puts $op "\tdo \\" + puts $op "\t\tif \[ -r \$(VPATH)/\$\$file \] ; then \\" + puts $op "\t\t\t/bin/rm \$(VPATH)/\$\$file ; \\" + puts $op "\t\tfi \\" + puts $op "\tdone" + puts $op "" + puts $op "block_%: setup" + puts $op "\t@if \[ \"x\$*\" = \"xsingle\" \] ; then \\" + puts $op "\t\tff_stop=\$(FF_STOP); \\" + puts $op "\t\ttarget=\"\$@ (from: \$(FF_START) to: \$(FF_STOP))\"; \\" + puts $op "\telse \\" + puts $op "\t\tff_stop=\$* ; \\" + puts $op "\t\ttarget=\$@; \\" + puts $op "\tfi; \\" + puts $op "\tif \[ -r \$(VPATH)/.RUNNING \] ; then \\" + puts $op "\t\techo \"INFO: A build seems to be running already... check \$(VPATH)/.RUNNING file and remove that file if the process is dead\" ; \\" + puts $op "\t\t/bin/head -1 \$(VPATH)/.RUNNING ; \\" + puts $op "\t\texit -1 ; \\" + puts $op "\telse \\" + puts $op "\t\t/bin/rm -f \$(VPATH)/block_\$\$\{ff_stop\}.DONE \$(VPATH)/block_\$\$\{ff_stop\}.FAILED \$(VPATH)/block_\$\$\{ff_stop\}.PASS ; \\" + puts $op "\t\t(echo \"# Started building \$\$\{target\} at \"`/bin/date`\" on \"`/bin/hostname`\" PID: \$\$\$\$\" ; \$(MAKE) \$(TARGET) ) &>\$(VPATH)/.RUNNING ; \\" + puts $op "\t\tif \[ -r \$(VPATH)/\$\$\{ff_stop\} \] ; then \\" + puts $op "\t\t\tif \[ -r \$(VPATH)/.RUNNING \] ; then \\" + puts $op "\t\t\t\t/bin/mv \$(VPATH)/.RUNNING \$(VPATH)/block_\$\$\{ff_stop\}.PASS ; \\" + puts $op "\t\t\t\t/bin/touch \$(VPATH)/block_\$\$\{ff_stop\} ; \\" + puts $op "\t\t\t\t/bin/touch \$(VPATH)/block_\$\$\{ff_stop\}.DONE ; \\" + puts $op "\t\t\telse \\" + puts $op "\t\t\t\techo \"# Something did not work properly\" > \$(VPATH)/block_\$\$\{ff_stop\}.FAILED ; \\" + puts $op "\t\t\t\t/bin/touch \$(VPATH)/block_\$\$\{ff_stop\}.DONE ; \\" + puts $op "\t\t\t\texit -1; \\" + puts $op "\t\t\tfi ; \\" + puts $op "\t\telse \\" + puts $op "\t\t\tif \[ -r \$(VPATH)/.RUNNING \] ; then \\" + puts $op "\t\t\t\t/bin/mv \$(VPATH)/.RUNNING \$(VPATH)/block_\$\$\{ff_stop\}.FAILED ; \\" + puts $op "\t\t\telse \\" + puts $op "\t\t\t\techo \"# Something did not work properly\" > \$(VPATH)/block_\$\$\{ff_stop\}.FAILED ; \\" + puts $op "\t\t\tfi ; \\" + puts $op "\t\t\t/bin/touch \$(VPATH)/block_\$\$\{ff_stop\}.DONE ; \\" + puts $op "\t\t\texit -1 ; \\" + puts $op "\t\tfi ; \\" + puts $op "\tfi" + + if {$vars(generate_flow_steps) && [info exists vars(flow_steps)]} { + if {[info exists vars(flow_steps,flat)]} { + set fp1 [open $vars(script_dir)/flow_config.tcl w] + set fp2 [open $vars(script_dir)/flow_steps.tcl w] + puts $fp1 "set_db flow_database_directory $vars(dbs_dir)" + puts $fp1 "set_db flow_report_directory $vars(rpt_dir)" + puts $fp1 "set_db flow_log_directory $vars(log_dir)" + puts $fp2 [regsub "create_flow_step -name init " $vars(flow_steps,flat) "create_flow_step -name init_design "] + puts $fp1 "\nset_db flow_mail_to [exec whoami]" + puts $fp1 "set_db flow_mail_on_error true\n" + if {$vars(top)} { + set vars(flow_name) top + } else { + set vars(flow_name) block + } + if {[file exists $vars(cwd)/.plugins]} { + set ip [open $vars(cwd)/.plugins r] + while {[gets $ip line]>=0} { + puts $fp1 $line + } + close $ip +# file delete $vars(cwd)/.plugins + } + close $fp1 + puts $fp2 "create_flow_step -name init_floorplan { }" + close $fp2 + if {[info exists vars(partition_list)]} { + if {($vars(design) == [lindex $vars(partition_list) 0]) || $vars(top)} { + set hp [open $vars(script_dir)/.hiersteps.tcl w] + if {$vars(top)} { + set temp [regsub -all "create_flow_step -name init" $vars(flow_steps,flat) "create_flow_step -name top_init"] + set temp2 [regsub -all "create_flow_step -name prects" $temp "create_flow_step -name top_prects"] + set temp3 [regsub -all "create_flow_step -name place" $temp2 "create_flow_step -name top_place"] + set temp4 [regsub -all "create_flow_step -name cts" $temp3 "create_flow_step -name top_cts"] + set vars(flow_steps,flat) [regsub -all "create_flow_step -name signoff" $temp4 "create_flow_step -name top_signoff"] + } + puts $hp $vars(flow_steps,flat) + close $hp + } + } + unset vars(flow_steps) + } + } + if {$vars(generate_flow_steps)} { + if {[lsearch $steps "assemble"] != -1} { + set steps [lreplace $steps end end] + } + set fp [open run_flow.tcl w] + puts $fp "source $vars(script_dir)/flow_steps.tcl" + puts $fp "if \{\[file exists $vars(script_dir)/plug_steps.tcl\]\} \{" + puts $fp " source $vars(script_dir)/plug_steps.tcl" + puts $fp "\}" + if {[file tail [pwd]] == $vars(top_cell)} { + if {[file tail [file dirname [pwd]]] == "$vars(partition_dir)"} { + set vars(flow_name) "top" + } else { + set vars(flow_name) "top_pass2" + } + set top_steps " $steps" + foreach s "init place prects cts signoff" { + set temp [regsub " $s" $top_steps " top_$s"] + set top_steps $temp + } + puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $top_steps\]\n" + } else { + set dir [file tail [pwd]] + set pdir [file tail [file tail $dir]] + if {[info exists vars(partition_list)]} { + if {([file tail [pwd]] == [lindex $vars(partition_list) 0])} { + if {[file tail [file dirname [pwd]]] == "$vars(partition_dir)"} { + set vars(flow_name) "block" + } else { + set vars(flow_name) "block_pass2" + } + puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $steps\]\n" + } + } else { + if {!$vars(rc)} { + set vars(flow_name) "innovus" + puts $fp "source $vars(script_dir)/flow_config.tcl" + puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $steps\]\n" + } else { + set rc_steps [list] + set edi_steps [list] + foreach s $steps { + if {[regexp syn_ $s]} { + lappend rc_steps $s + } else { + lappend edi_steps $s + } + } + set vars(flow_name) "genus" +# puts $fp "source $vars(script_dir)/flow_steps.tcl" + puts $fp "source $vars(script_dir)/flow_config.tcl" + puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_syn_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $rc_steps\]\n" + set vars(flow_name) "innovus" + puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $edi_steps\]\n" + } + } + } + close $fp + } + } + "bottom_up" { + puts $op "VERSION=17.10-p003_1" + puts $op "VPATH=$env(VPATH)" + puts $op "TOOL=$vars(make_tool)" + puts $op "SCRIPTS=$vars(script_dir)" + puts $op "LOG=$vars(log_dir)" + puts $op "BROWSER=$vars(make_browser)" + if {[info exists vars(make_update)]} { + puts $op "UPDATE=$vars(make_update)" + } elseif {[file tail [file dirname [pwd]]] != "$vars(partition_dir)"} { + puts $op "UPDATE=yes" + } + puts $op "" + puts $op "ARGS=$vars(make_tool_args)" + puts $op "STEPS = [format "version setup %s do_cleanup" $steps]" + puts $op "FF_STOP = signoff" + puts $op "FF_START = init" + puts $op "" + puts $op [format "all: version setup %s do_cleanup" $steps] + puts $op "" + puts $op "version:" + puts $op "\t@echo \"\# Foundation Flows Version \$(VERSION)\"" + puts $op "" + puts $op "help:" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" \$(VERSION) Foundation Flows\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" Makefile Targets\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" setup : Setup Run Directory\"" + puts $op "\t@echo \" init : Create Initial Database\"" + puts $op "\t@echo \" place : Cell Placement\"" + puts $op "\t@echo \" prects : PreCTS Optimization\"" + puts $op "\t@echo \" cts : Clock Tree Synthesis\"" + puts $op "\t@echo \" postcts : PostCTS Optimization\"" + puts $op "\t@echo \" postcts_hold : PostCTS Oold Fixing\"" + puts $op "\t@echo \" route : Global/Detail Route\"" + puts $op "\t@echo \" postroute : PostRoute Optimization\"" + puts $op "\t@echo \" postroute_hold : PostRoute Hold Fixing\"" + puts $op "\t@echo \" postroute_si_hold : SI Hold Fixing\"" + puts $op "\t@echo \" postroute_si : SI Optimization\"" + puts $op "\t@echo \" signoff : Signoff Timing / Verify\"" + puts $op "\t@echo \" assemble : Design Assembly / Verify\"" + puts $op "\t@echo \"---------------------------------------------------\"" + puts $op "\t@echo \" all : All design steps\"" + puts $op "\t@echo \" simple : Single script (all steps in a single session) - no stop/start\"" + puts $op "\t@echo \" single : Single script (all steps in a single session)\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" Makefile Options\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" VPATH : Make directory (default make)\"" + if {$vars(novus)} { + puts $op "\t@echo \" TOOL : INNOVUS executable (default innovus)\"" + puts $op "\t@echo \" ARGS : INNOVUS arguments (default -nowin -64)\"" + } else { + puts $op "\t@echo \" TOOL : INNOVUS executable (default innovus)\"" + puts $op "\t@echo \" ARGS : INNOVUS arguments (default -nowin -64)\"" + } + if {[file tail [file dirname [pwd]]] != "$vars(partition_dir)"} { + puts $op "\t@echo \" UPDATE : Update scripts (default yes)\"" + } +# puts $op "\t@echo \" BROWSER : HTML browser (default netscape)\"" + puts $op "\t@echo \" SCRIPTS : Script directory (default $vars(script_dir))\"" + puts $op "\t@echo \" LOG : Logfile directory (default $vars(log_dir))\"" + puts $op "\t@echo \"===================================================\"" + puts $op "" +# if {[file tail [file dirname [pwd]]] != "$vars(partition_dir)"} { +# if {[info exists vars(plug_files)]} { +# puts $op "flow: $vars(config_files) $vars(plug_files)" +# } else { +# puts $op "flow: $vars(config_files)" +# } +# puts $op "\t@if \[ \$(UPDATE) == yes ] ; then \\" +# puts $op "\t\t[lindex $execute_string 0] [lindex $execute_string 1] -m flat all ; \\" +# puts $op "\t\t/bin/touch \$(VPATH)/\$@ ; \\" +# puts $op "\telse \\" +# puts $op "\t\techo 'SKIPPING FLOW UPDATE ...' ; \\" +# puts $op "\tfi" +# } else { +# puts $op "flow:" +# } + + puts $op "\nsimple: setup" + if {$vars(step_arg) == "all"} { + puts $op "\tFF_STOP=\$(FF_STOP); VPATH=\$(VPATH); export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_simple.tcl -log \$(LOG)/simple.log \$(ARGS)" + } else { + puts $op "\tFF_STOP=\$(FF_STOP); VPATH=\$(VPATH); export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_simple.$vars(step_arg).tcl -log \$(LOG)/simple.$vars(step_arg).log \$(ARGS)" + } + puts $op "" + puts $op "\nsingle: setup" + puts $op "\tFF_STOP=\$(FF_STOP); VPATH=\$(VPATH); export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_all.tcl -log \$(LOG)/single.log \$(ARGS)" + puts $op "" + puts $op "setup:" + puts $op "\t@/bin/mkdir -p \$(VPATH) \$(LOG)" + puts $op "\t@/bin/touch \$(VPATH)/\$@" + if {[info exists vars(enable_ldb)] && $vars(enable_ldb)} { + puts $op "\t\$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_compile.tcl -log \$(LOG)/compile.log -win \$(ARGS)" + } + puts $op "" + + set prior_step "setup" + foreach step $steps { + puts $op "$step: $prior_step" +# puts $op "\t@\$(MAKE) -f Makefile flow" + if {[file dirname [pwd]] != "$vars(partition_dir)"} { + puts $op "\t@if \[ \$(UPDATE) == yes ] ; then \\" + puts $op "\t\t[lindex $execute_string 0] [lindex $execute_string 1] -n -m bottom_up $step ; \\" + puts $op "\tfi" + } + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_$step.tcl -log \$(LOG)/$step.log -overwrite \$(ARGS)" + puts $op "\t/bin/touch \$(VPATH)/$step\n" + set prior_step $step + } + +# puts $op "html:" +# puts $op "\tFFSTEPS=\$(STEPS); export FFSTEPS; FFLOGDIR=\$(LOG); export FFLOGDIR; /usr/bin/tclsh \$(SCRIPTS)/INNOVUS/gen_html.tcl .; cd HTML; \$(BROWSER) file:`pwd`/index.html" +# puts $op "" + puts $op "debug_%:" + puts $op "\tVPATH=\$(VPATH); export STEP=\$* ; export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_debug.tcl -log \$(LOG)/\$@.log -win \$(ARGS:-nowin=)" + puts $op "" + puts $op "lec_%:" + puts $op "\texport STEP=\$* ; lec -64 -xl -Dofile \$(SCRIPTS)/INNOVUS/run_lec.tcl -NOGui -LOGfile \$(LOG)/\$@.log" + puts $op "" +# puts $op ".PHONY: clean html" + puts $op ".PHONY: clean" + puts $op "" + puts $op "clean:" + puts $op "\t/bin/mv *.rpt $vars(rpt_dir) ;\\" + puts $op "\t/bin/rm -fr extLogDir* __qrc.log *cts_trace *.rpt.old *delete* placementReports* *.rguide *_mmmc \\\n\t*_constr.pt .constr* .FE* .routing* .timing_file* .tdrlog*" + puts $op "\trm make/*" + puts $op "" + puts $op "do_cleanup: signoff" + puts $op "\t\$(MAKE) clean" + puts $op "\t/bin/touch \$(VPATH)/\$@" + puts $op "" + puts $op "reset : version" + puts $op "\t/bin/rm -fr \$(VPATH)/* extLogDir* __qrc.log *cts_trace *.rpt.old *delete* placementReports* *.rguide *_mmmc" + puts $op "\t@for file in \$(STEPS) ; \\" + puts $op "\tdo \\" + puts $op "\t\tif \[ -r \$(VPATH)/\$\$file \] ; then \\" + puts $op "\t\t\t/bin/rm \$(VPATH)/\$\$file ; \\" + puts $op "\t\tfi \\" + puts $op "\tdone" + puts $op "" + puts $op "block_%: setup" + puts $op "\t@if \[ \"x\$*\" = \"xsingle\" \] ; then \\" + puts $op "\t\tff_stop=\$(FF_STOP); \\" + puts $op "\t\ttarget=\"\$@ (from: \$(FF_START) to: \$(FF_STOP))\"; \\" + puts $op "\telse \\" + puts $op "\t\tff_stop=\$* ; \\" + puts $op "\t\ttarget=\$@; \\" + puts $op "\tfi; \\" + puts $op "\tif \[ -r \$(VPATH)/.RUNNING \] ; then \\" + puts $op "\t\techo \"INFO: A build seems to be running already... check \$(VPATH)/.RUNNING file and remove that file if the process is dead\" ; \\" + puts $op "\t\t/bin/head -1 \$(VPATH)/.RUNNING ; \\" + puts $op "\t\texit -1 ; \\" + puts $op "\telse \\" + puts $op "\t\t/bin/rm -f \$(VPATH)/block_\$\$\{ff_stop\}.DONE \$(VPATH)/block_\$\$\{ff_stop\}.FAILED \$(VPATH)/block_\$\$\{ff_stop\}.PASS ; \\" + puts $op "\t\t(echo \"# Started building \$\$\{target\} at \"`/bin/date`\" on \"`/bin/hostname`\" PID: \$\$\$\$\" ; \$(MAKE) \$(TARGET) ) &>\$(VPATH)/.RUNNING ; \\" + puts $op "\t\tif \[ -r \$(VPATH)/\$\$\{ff_stop\} \] ; then \\" + puts $op "\t\t\tif \[ -r \$(VPATH)/.RUNNING \] ; then \\" + puts $op "\t\t\t\t/bin/mv \$(VPATH)/.RUNNING \$(VPATH)/block_\$\$\{ff_stop\}.PASS ; \\" + puts $op "\t\t\t\t/bin/touch \$(VPATH)/block_\$\$\{ff_stop\} ; \\" + puts $op "\t\t\t\t/bin/touch \$(VPATH)/block_\$\$\{ff_stop\}.DONE ; \\" + puts $op "\t\t\telse \\" + puts $op "\t\t\t\techo \"# Something did not work properly\" > \$(VPATH)/block_\$\$\{ff_stop\}.FAILED ; \\" + puts $op "\t\t\t\t/bin/touch \$(VPATH)/block_\$\$\{ff_stop\}.DONE ; \\" + puts $op "\t\t\t\texit -1; \\" + puts $op "\t\t\tfi ; \\" + puts $op "\t\telse \\" + puts $op "\t\t\tif \[ -r \$(VPATH)/.RUNNING \] ; then \\" + puts $op "\t\t\t\t/bin/mv \$(VPATH)/.RUNNING \$(VPATH)/block_\$\$\{ff_stop\}.FAILED ; \\" + puts $op "\t\t\telse \\" + puts $op "\t\t\t\techo \"# Something did not work properly\" > \$(VPATH)/block_\$\$\{ff_stop\}.FAILED ; \\" + puts $op "\t\t\tfi ; \\" + puts $op "\t\t\t/bin/touch \$(VPATH)/block_\$\$\{ff_stop\}.DONE ; \\" + puts $op "\t\t\texit -1 ; \\" + puts $op "\t\tfi ; \\" + puts $op "\tfi" + + if {$vars(generate_flow_steps) && [info exists vars(flow_steps)]} { + if {[info exists vars(flow_steps,flat)]} { + set fp1 [open $vars(script_dir)/flow_config.tcl w] + set fp2 [open $vars(script_dir)/flow_steps.tcl w] + puts $fp1 "set_db flow_database_directory $vars(dbs_dir)" + puts $fp1 "set_db flow_report_directory $vars(rpt_dir)" + puts $fp1 "set_db flow_log_directory $vars(log_dir)" + puts $fp2 $vars(flow_steps,flat) + puts $fp1 "\nset_db flow_mail_to [exec whoami]" + puts $fp1 "set_db flow_mail_on_error true\n" + if {$vars(top)} { + set vars(flow_name) top + } else { + set vars(flow_name) block + } +# puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list [FF::adjust_steps]\]\n" +# puts $hp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $steps\]\n" +# puts $fp "run_flow -flow $vars(flow_name)" + if {[file exists $vars(cwd)/.plugins]} { + set ip [open $vars(cwd)/.plugins r] + while {[gets $ip line]>=0} { + puts $fp1 $line + } + close $ip + file delete $vars(cwd)/.plugins + } + close $fp1 + close $fp2 + if {[info exists vars(partition_list)]} { + if {($vars(design) == [lindex $vars(partition_list) 0]) || $vars(top)} { + set hp [open $vars(script_dir)/.hiersteps.tcl w] + if {$vars(top)} { + set temp [regsub -all "create_flow_step -name init" $vars(flow_steps,flat) "create_flow_step -name top_init"] + set temp2 [regsub -all "create_flow_step -name cts" $temp "create_flow_step -name top_cts"] + set vars(flow_steps,flat) [regsub -all "create_flow_step -name signoff" $temp2 "create_flow_step -name top_signoff"] + } + puts $hp $vars(flow_steps,flat) + if {$vars(top)} { + set top_steps " $steps" + foreach s " init prects cts signoff" { + set temp [regsub " $s" $top_steps " top_$s"] + set top_steps $temp + } +## set temp [regsub "init" [FF::adjust_steps] "top_init"] +# set temp [regsub "init" $steps "top_init"] +# set temp2 [regsub " prects " $temp " top_prects "] +# set temp3 [regsub " cts " $temp2 " top_cts "] +# set top_steps [regsub "signoff" $temp3 "top_signoff"] + puts $hp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $top_steps\]\n" + } else { +# puts $hp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list [FF::adjust_steps]\]\n" + puts $hp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $steps\]\n" + } + close $hp + } + } + unset vars(flow_steps) + } + } + } + "top_down" { + puts $op "VERSION=17.10-p003_1" + puts $op "VPATH=./make" + puts $op "TOOL=$vars(make_tool)" + puts $op "SCRIPTS=$vars(script_dir)" + puts $op "LOG=$vars(log_dir)" + puts $op "ARGS=$vars(make_tool_args)" + puts $op "PARALLEL=-j2" + puts $op "SUBMIT=\"\"" + puts $op "TARGET=signoff" + puts $op "FF_STOP=signoff" + puts $op "STEPS = [format "version setup %s do_cleanup" $steps]" + puts $op "" +# puts $op "TOP=`/bin/grep \"^set vars(design)\" $vars(setup_tcl) | /bin/awk ' { printf(\"%s\\n\",\$\$3) } '`" + puts $op "TOP=$vars(design)" + puts $op "" + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + if {[info exists vars(flexmodel_prototype)] && $vars(flexmodel_prototype)} { + puts $op "all: setup model_gen prototype partition_place assign_pin partition blocks.\$(TARGET) top.\$(TARGET) assemble" + } else { + puts $op "all: setup model_gen partition_place assign_pin partition blocks.\$(TARGET) top.\$(TARGET) assemble" + } + } else { + puts $op "all: setup partition_place assign_pin partition blocks.\$(TARGET) top.\$(TARGET) assemble" + } + puts $op "" + puts $op "help:" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" \$(VERSION) Foundation Flows\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" Makefile Targets\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" all : Run complete flow (default)\"" + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + puts $op "\t@echo \" model_gen : Generate flexmodels\"" + if {[info exists vars(flexmodel_prototype)] && $vars(flexmodel_prototype)} { + puts $op "\t@echo \" prototype : Flexmodel prototype\"" + } + } + puts $op "\t@echo \" partition_place : Initial placement & feedthrough\"" + puts $op "\t@echo \" assign_pin : Pin assignment\"" + puts $op "\t@echo \" partition : Partition design\"" + puts $op "\t@echo \" blocks. : Implement blocks\"" + puts $op "\t@echo \" assemble : Assemble design\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" Makefile Options\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" VPATH : Make directory (default make)\"" + puts $op "\t@echo \" SUBMIT : LSF launch command (default '')\"" + puts $op "\t@echo \" PARALLEL : Number of machines (default -j2)\"" + if {$vars(novus)} { + puts $op "\t@echo \" TOOL : INNOVUS executable (default innovus)\"" + puts $op "\t@echo \" ARGS : INNOVUS arguments (default -nowin -64)\"" + } else { + puts $op "\t@echo \" TOOL : INNOVUS executable (default innovus)\"" + puts $op "\t@echo \" ARGS : INNOVUS arguments (default -nowin -64)\"" + } + puts $op "\t@echo \" SCRIPTS : Script directory (default $vars(script_dir))\"" + puts $op "\t@echo \" LOG : Logfile directory (default $vars(log_dir))\"" + puts $op "\t@echo \"===================================================\"" + puts $op "" +# puts $op "flow: $vars(config_files)" +# puts $op "\texecute_string" +# puts $op "\t@/bin/touch \$(VPATH)/\$@" + puts $op "assemble: top.\$(TARGET)" + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_assemble.tcl -log \$(LOG)/assemble.log -overwrite" + puts $op "\t/bin/touch \$(VPATH)/assemble" + puts $op "" + puts $op "top.\$(TARGET) : blocks.\$(TARGET)" + puts $op "\tcd $vars(partition_dir)/\$(TOP); \$(MAKE) -f Makefile FF_STOP=\$(FF_STOP) \$(TARGET) " + puts $op "\t/bin/touch \$(VPATH)/\$@" + puts $op "" + puts $op "blocks.\$(TARGET) : partition" + puts $op "\tcd $vars(partition_dir); VPATH=\$(VPATH); export VPATH; \$(MAKE) \$(PARALLEL) blocks FF_STOP=\$(FF_STOP) TARGET=\$(TARGET)" + puts $op "\t/bin/touch \$(VPATH)/\$@" + puts $op "" + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + puts $op "model_gen : setup" + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_model_gen.tcl -log \$(LOG)/model_gen.log -overwrite" + puts $op "\t/bin/touch \$(VPATH)/model_gen" + puts $op "" + if {[info exists vars(flexmodel_prototype)] && $vars(flexmodel_prototype)} { + puts $op "prototype : model_gen" + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_prototype.tcl -log \$(LOG)/prototype.log -overwrite" + puts $op "\t/bin/touch \$(VPATH)/prototype" + puts $op "" + puts $op "partition_place : prototype" + } else { + puts $op "partition_place : model_gen" + } + } else { + puts $op "partition_place : setup" + } + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_partition_place.tcl -log \$(LOG)/partition_place.log -overwrite" + puts $op "\t/bin/touch \$(VPATH)/partition_place" + puts $op "" + puts $op "assign_pin : partition_place" + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_assign_pin.tcl -log \$(LOG)/assign_pin.log -overwrite" + puts $op "\t/bin/touch \$(VPATH)/assign_pin" + puts $op "" + puts $op "partition : assign_pin" + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_partition.tcl -log \$(LOG)/partition.log -overwrite" + puts $op "\t/bin/touch \$(VPATH)/partition" + puts $op "" + puts $op "single:" + puts $op "\t@\$(MAKE) TARGET=single FF_STOP=\$(FF_STOP)" + puts $op "" + puts $op "debug_%:" + puts $op "\texport STEP=\$* ; VPATH=\$(VPATH); export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_debug.tcl -log \$(LOG)/\$@.log -win \$(ARGS:-nowin=)" + puts $op "" + puts $op "reset:" + puts $op "\t@/bin/rm -f \$(VPATH)/* $vars(partition_dir)/*/\$(VPATH)/* $vars(partition_dir)/*/\$(VPATH)/.RUNNING" + puts $op "" + puts $op "setup:" + puts $op "#\t/bin/rm -fr $vars(partition_dir) \$(VPATH) LOG" + puts $op "\t/bin/mkdir -p \$(VPATH) LOG" + puts $op "\t/bin/touch \$(VPATH)/setup" + + if {$vars(generate_flow_steps) && [info exists vars(flow_steps)]} { + set fp [open run_flow.tcl w] +# puts $fp "source $vars(script_dir)/flow_steps.tcl" + set fp1 [open $vars(script_dir)/flow_config.tcl w] + set fp2 [open $vars(script_dir)/flow_steps.tcl w] +# puts $fp1 "set_db flow_step:assemble .skip_db true" +# puts $fp1 "set_db flow_step:partition .skip_db true" + puts $fp1 "set_db flow_database_directory $vars(dbs_dir)" + puts $fp1 "set_db flow_report_directory $vars(rpt_dir)" + puts $fp1 "set_db flow_log_directory $vars(log_dir)" + puts $fp1 "\nset_db flow_mail_to [exec whoami]" + puts $fp1 "set_db flow_mail_on_error true\n" + foreach p [concat $vars(partition_list) $vars(design)] { +# set vars(flow_name) $p + if {[file exists $vars(partition_dir)/$p/$vars(script_dir)/.hiersteps.tcl]} { + puts $fp2 "#-------------------------- $p --------------------------" + set ip [open $vars(partition_dir)/$p/$vars(script_dir)/.hiersteps.tcl r] + if {$p != $vars(design)} { + while {[gets $ip line]>=0} { + puts $fp2 $line + } + } else { + while {[gets $ip line]>=0} { + if {[regexp "create_flow_step -name top_" $line]} { + puts $fp2 $line + while {[gets $ip line]>=0} { + if {[regexp "^\}" $line]} { + puts $fp2 $line + break + } else { + puts $fp2 $line + } + } + } + } + } + } + if {[file exists $vars(partition_dir)/$p/run_flow.tcl]} { + set ip [open $vars(partition_dir)/$p/run_flow.tcl r] + while {[gets $ip line]>=0} { + puts $fp $line + } + } + if {[info exists vars(partition_dir_pass2)] && [file exists $vars(partition_dir_pass2)/$p/run_flow.tcl]} { + set ip [open $vars(partition_dir_pass2)/$p/run_flow.tcl r] + while {[gets $ip line]>=0} { + puts $fp $line + } + } + } + puts $fp2 "#-------------------------- HIER STEPS --------------------------" + puts $fp2 $vars(flow_steps,hier) + set asteps [FF::adjust_steps] +# set vars(flow_name) $vars(design) +# puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $asteps\]\n" + set psteps [list] + set bsteps [list] + foreach s $asteps { + if {([lsearch $vars(fsteps) $s] != -1) && ($s != "assemble")} { + lappend bsteps $s + } else { + if {$s != "assemble"} { + lappend psteps $s + } + } + } + set vars(flow_name) final_assembly + puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list assemble\]\n" + set vars(flow_name) partitioning + puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $psteps\]\n" + unset vars(flow_steps) +# set vars(flow_name) $vars(design) +# puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $bsteps\]\n" + if {[file exists $vars(cwd)/.plugins]} { + set ip [open $vars(cwd)/.plugins r] + while {[gets $ip line]>=0} { + puts $fp1 $line + } + close $ip + file delete $vars(cwd)/.plugins + } + if {![info exists vars(run_flow)]} { + puts $fp "source $vars(script_dir)/flow_config.tcl" + set vars(run_flow) DONE + } + close $fp + close $fp1 + close $fp2 + } + } + "2pass" { + set op1 [open Makefile.pass1 w] + puts $op1 "VERSION=17.10-p003_1" + puts $op1 "VPATH=./make" + puts $op1 "TOOL=$vars(make_tool)" + puts $op1 "SCRIPTS=$vars(script_dir)" + puts $op1 "LOG=$vars(log_dir)" + puts $op1 "ARGS=$vars(make_tool_args)" + puts $op1 "PARALLEL=-j2" + puts $op1 "SUBMIT=\"\"" + puts $op1 "TARGET=cts" + puts $op1 "FF_STOP=cts" + puts $op1 "STEPS = [format "version setup %s do_cleanup" $steps]" + puts $op1 "" +# puts $op1 "TOP=`/bin/grep \"^set vars(design)\" $vars(setup_tcl) | /bin/awk ' { printf(\"%s\\n\",\$\$3) } '`" + puts $op1 "TOP=$vars(design)" + puts $op1 "" + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + if {[info exists vars(flexmodel_prototype)] && $vars(flexmodel_prototype)} { + puts $op1 "all: setup prototype model_gen partition_place assign_pin partition blocks.\$(TARGET) top.\$(TARGET)" + } else { + puts $op1 "all: setup model_gen partition_place assign_pin partition blocks.\$(TARGET) top.\$(TARGET)" + } + } else { + puts $op1 "all: setup partition_place assign_pin partition blocks.\$(TARGET) top.\$(TARGET)" + } + puts $op1 "\t@echo \" Makefile Targets\"" + puts $op1 "\t@echo \"===================================================\"" + puts $op1 "\t@echo \" all : Run complete flow (default)\"" + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + if {[info exists vars(flexmodel_prototype)] && $vars(flexmodel_prototype)} { + puts $op "\t@echo \" prototype : Flexmodel prototype\"" + } + puts $op "\t@echo \" model_gen : Generate flexmodels\"" + } + puts $op1 "\t@echo \" partition_place : Initial placement & feedthrough\"" + puts $op1 "\t@echo \" assign_pin : Pin assignment\"" + puts $op1 "\t@echo \" partition : Partition design\"" + puts $op1 "\t@echo \" blocks. : Implement blocks\"" + if {$vars(enable_flexilm)} { + puts $op1 "\t@echo \" flexilm : PreCTS DLM flow\"" + } else { + puts $op1 "\t@echo \" rebudget : Rebudget constraints\"" + } + puts $op1 "\t@echo \"===================================================\"" + puts $op1 "\t@echo \" Makefile Options\"" + puts $op1 "\t@echo \"===================================================\"" + puts $op1 "\t@echo \" VPATH : Make directory (default make)\"" + puts $op1 "\t@echo \" SUBMIT : LSF launch command (default '')\"" + puts $op1 "\t@echo \" PARALLEL : Number of machines (default -j2)\"" + if {$vars(novus)} { + puts $op1 "\t@echo \" TOOL : INNOVUS executable (default innovus)\"" + puts $op1 "\t@echo \" ARGS : INNOVUS arguments (default -novus_ui -64)\"" + } else { + puts $op1 "\t@echo \" TOOL : INNOVUS executable (default innovus)\"" + puts $op1 "\t@echo \" ARGS : INNOVUS arguments (default -nowin -64)\"" + } + puts $op1 "\t@echo \" SCRIPTS : Script directory (default $vars(script_dir))\"" + puts $op1 "\t@echo \" LOG : Logfile directory (default $vars(log_dir))\"" + puts $op1 "\t@echo \"===================================================\"" + puts $op1 "" +# puts $op1 "flow: $vars(config_files)" +# puts $op1 "\texecute_string" +# puts $op1 "\t@/bin/touch \$(VPATH)/\$@" + puts $op1 "top.\$(TARGET) : blocks.\$(TARGET)" + puts $op1 "\tcd $vars(partition_dir)/\$(TOP); \$(MAKE) -f Makefile FF_STOP=\$(FF_STOP) \$(TARGET) " + puts $op1 "\t/bin/touch \$(VPATH)/\$@" + puts $op1 "" + puts $op1 "blocks.\$(TARGET) : partition" + puts $op1 "\tcd $vars(partition_dir); VPATH=\$(VPATH); export VPATH; \$(MAKE) \$(PARALLEL) blocks FF_STOP=\$(FF_STOP) TARGET=\$(TARGET)" + puts $op1 "\t/bin/touch \$(VPATH)/\$@" + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + if {[info exists vars(flexmodel_prototype)] && $vars(flexmodel_prototype)} { + puts $op1 "prototype : setup" + puts $op1 "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_prototype.tcl -log \$(LOG)/prototype.log -overwrite" + puts $op1 "\t/bin/touch \$(VPATH)/prototype" + puts $op1 "" + puts $op1 "model_gen : prototype" + } else { + puts $op1 "model_gen : setup" + } + puts $op1 "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_model_gen.tcl -log \$(LOG)/model_gen.log -overwrite" + puts $op1 "\t/bin/touch \$(VPATH)/model_gen" + puts $op1 "" + puts $op1 "partition_place : model_gen" + } else { + puts $op1 "partition_place : setup" + } + puts $op1 "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_partition_place.tcl -log \$(LOG)/partition_place.log -overwrite" + puts $op1 "\t/bin/touch \$(VPATH)/partition_place" + puts $op1 "" + puts $op1 "assign_pin : partition_place" + puts $op1 "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_assign_pin.tcl -log \$(LOG)/assign_pin.log -overwrite" + puts $op1 "\t/bin/touch \$(VPATH)/assign_pin" + puts $op1 "" + puts $op1 "partition : assign_pin" + puts $op1 "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_partition.tcl -log \$(LOG)/partition.log -overwrite" + puts $op1 "\t/bin/touch \$(VPATH)/partition" + puts $op1 "" + puts $op1 "single:" + puts $op1 "\t@\$(MAKE) TARGET=single FF_STOP=\$(FF_STOP)" + puts $op1 "" + puts $op1 "debug_%:" + puts $op1 "\texport STEP=\$* ; VPATH=\$(VPATH); export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_debug.tcl -log \$(LOG)/\$@.log -win \$(ARGS:-nowin=)" + puts $op1 "" + puts $op1 "reset:" + puts $op1 "\t@/bin/rm -f \$(VPATH)/* $vars(partition_dir)/*/\$(VPATH)/* $vars(partition_dir)/*/\$(VPATH)/.RUNNING" + puts $op1 "" + puts $op1 "setup:" + puts $op1 "#\t/bin/rm -fr $vars(partition_dir) \$(VPATH) LOG" + puts $op1 "\t/bin/mkdir -p \$(VPATH) LOG" + puts $op1 "\t/bin/touch \$(VPATH)/setup" + close $op1 + set op2 [open Makefile.pass2 w] + puts $op2 "VERSION=17.10-p003_1" + puts $op2 "VPATH=./make" + puts $op2 "TOOL=$vars(make_tool)" + puts $op2 "SCRIPTS=$vars(script_dir)" + puts $op2 "LOG=$vars(log_dir)" + puts $op2 "ARGS=$vars(make_tool_args)" + puts $op2 "PARALLEL=-j2" + puts $op2 "SUBMIT=\"\"" + puts $op2 "TARGET=signoff" + puts $op2 "FF_STOP=signoff" + puts $op2 "STEPS = [format "version setup %s do_cleanup" $steps]" + puts $op2 "" +# puts $op2 "TOP=`/bin/grep \"^set vars(design)\" $vars(setup_tcl) | /bin/awk ' { printf(\"%s\\n\",\$\$3) } '`" + puts $op2 "TOP=$vars(design)" + puts $op2 "" + if {$vars(enable_flexilm)} { + puts $op2 "all: setup rebudget blocks.\$(TARGET) top.\$(TARGET) assemble" + } else { + puts $op2 "all: setup rebudget blocks.\$(TARGET) top.\$(TARGET) assemble" + } + puts $op2 "" + puts $op2 "help:" + puts $op2 "\t@echo \"===================================================\"" + puts $op2 "\t@echo \" \$(VERSION) Foundation Flows\"" + puts $op2 "\t@echo \"===================================================\"" + puts $op2 "\t@echo \" Makefile Targets\"" + puts $op2 "\t@echo \"===================================================\"" + puts $op2 "\t@echo \" all : Run complete flow (default)\"" + if {$vars(enable_flexilm)} { + puts $op2 "\t@echo \" rebudget : Rebudget design\"" + } + puts $op2 "\t@echo \" blocks. : Implement blocks\"" + puts $op2 "\t@echo \" assemble : Assemble design\"" + puts $op2 "\t@echo \"===================================================\"" + puts $op2 "\t@echo \" Makefile Options\"" + puts $op2 "\t@echo \"===================================================\"" + puts $op2 "\t@echo \" VPATH : Make directory (default make)\"" + puts $op2 "\t@echo \" SUBMIT : LSF launch command (default '')\"" + puts $op2 "\t@echo \" PARALLEL : Number of machines (default -j2)\"" + if {$vars(novus)} { + puts $op2 "\t@echo \" TOOL : INNOVUS executable (default innovus)\"" + puts $op2 "\t@echo \" ARGS : INNOVUS arguments (default -novus_ui -64)\"" + } else { + puts $op2 "\t@echo \" TOOL : INNOVUS executable (default innovus)\"" + puts $op2 "\t@echo \" ARGS : INNOVUS arguments (default -nowin -64)\"" + } + puts $op2 "\t@echo \" SCRIPTS : Script directory (default $vars(script_dir))\"" + puts $op2 "\t@echo \" LOG : Logfile directory (default $vars(log_dir))\"" + puts $op2 "\t@echo \"===================================================\"" + puts $op2 "" +# puts $op2 "flow: $vars(config_files)" +# puts $op2 "\texecute_string" +# puts $op2 "\t@/bin/touch \$(VPATH)/\$@" + puts $op2 "assemble: top.\$(TARGET)" + puts $op2 "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_assemble.tcl -log \$(LOG)/assemble.log -overwrite" + puts $op2 "\t/bin/touch \$(VPATH)/assemble" + puts $op2 "" + puts $op2 "top.\$(TARGET) : blocks.\$(TARGET)" + puts $op2 "\tcd $vars(partition_dir_pass2)/\$(TOP); \$(MAKE) -f Makefile FF_STOP=\$(FF_STOP) \$(TARGET) " + puts $op2 "\t/bin/touch \$(VPATH)/\$@" + puts $op2 "" + puts $op2 "blocks.\$(TARGET) : rebudget" + puts $op2 "\tcd $vars(partition_dir_pass2); VPATH=\$(VPATH); export VPATH; \$(MAKE) \$(PARALLEL) blocks FF_STOP=\$(FF_STOP) TARGET=\$(TARGET)" + puts $op2 "\t/bin/touch \$(VPATH)/\$@" + puts $op2 "" + puts $op1 "rebudget : top.cts" + puts $op1 "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_rebudget.tcl -log \$(LOG)/rebudget.log -overwrite" + puts $op1 "\t/bin/touch \$(VPATH)/rebudget" + puts $op1 "" + puts $op2 "single:" + puts $op2 "\t@\$(MAKE) TARGET=single FF_STOP=\$(FF_STOP)" + puts $op2 "" + puts $op2 "debug_%:" + puts $op2 "\texport STEP=\$* ; VPATH=\$(VPATH); export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_debug.tcl -log \$(LOG)/\$@.log -win \$(ARGS:-nowin=)" + puts $op2 "" + puts $op2 "reset:" + puts $op2 "\t@/bin/rm -f \$(VPATH)/* $vars(partition_dir_pass2)/*/\$(VPATH)/* $vars(partition_dir_pass2)/*/\$(VPATH)/.RUNNING" + puts $op2 "" + puts $op2 "setup:" + puts $op2 "#\t/bin/rm -fr $vars(partition_dir_pass2) \$(VPATH) LOG" + puts $op2 "\t/bin/mkdir -p \$(VPATH) LOG" + close $op2 + + puts $op "include Makefile.pass1" + puts $op "include Makefile.pass2" + + if {$vars(generate_flow_steps) && [info exists vars(flow_steps)]} { + set fp1 [open $vars(script_dir)/flow_config.tcl w] + set fp2 [open $vars(script_dir)/flow_steps.tcl w] + puts $fp1 "set_db flow_database_directory $vars(dbs_dir)" + puts $fp1 "set_db flow_report_directory $vars(rpt_dir)" + puts $fp1 "set_db flow_log_directory $vars(log_dir)" + puts $fp1 "\nset_db flow_mail_to [exec whoami]" + puts $fp1 "set_db flow_mail_on_error true\n" +# puts $fp $vars(flow_steps) + foreach p [concat $vars(partition_list) $vars(design)] { +# set vars(flow_name) $p + if {[file exists $vars(partition_dir)/$p/$vars(script_dir)/.hiersteps.tcl]} { +# puts $fp2 "#-------------------------- $p --------------------------" + set ip [open $vars(partition_dir)/$p/$vars(script_dir)/.hiersteps.tcl r] + if {$p != $vars(design)} { + while {[gets $ip line]>=0} { + puts $fp2 $line + } + } else { + while {[gets $ip line]>=0} { + if {[regexp "create_flow_step -name top_" $line]} { + puts $fp2 $line + while {[gets $ip line]>=0} { + if {[regexp "^\}" $line]} { + puts $fp2 $line + break + } else { + puts $fp2 $line + } + } + } + } + } + } + if {[file exists $vars(partition_dir)/$p/run_flow.tcl]} { + set ip [open $vars(partition_dir)/$p/run_flow.tcl r] + while {[gets $ip line]>=0} { + puts $fp $line + } + } + if {[info exists vars(partition_dir_pass2)] && [file exists $vars(partition_dir_pass2)/$p/run_flow.tcl]} { + set ip [open $vars(partition_dir_pass2)/$p/run_flow.tcl r] + while {[gets $ip line]>=0} { + puts $fp $line + } + } + } + puts $fp2 "#-------------------------- HIER STEPS --------------------------" + puts $fp2 $vars(flow_steps,hier) + set vars(flow_name) $vars(design) + set asteps [FF::adjust_steps] +# puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $asteps\]\n" + set psteps [list] + set bsteps [list] + foreach s $asteps { + if {([lsearch $vars(fsteps) $s] != -1) && ($s != "assemble")} { + lappend bsteps $s + } else { + if {$s != "assemble"} { + lappend psteps $s + } + } + } + set vars(flow_name) final_assembly + puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list assemble\]\n" + set vars(flow_name) partitioning + puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $psteps\]\n" +# puts $fp "run_flow -flow $vars(flow_name)" + unset vars(flow_steps) +# set vars(flow_name) $vars(design) +# puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $bsteps\]\n" + if {[file exists $vars(cwd)/.plugins]} { + set ip [open $vars(cwd)/.plugins r] + while {[gets $ip line]>=0} { + puts $fp1 $line + } + close $ip + file delete $vars(cwd)/.plugins + } + close $fp + close $fp1 + close $fp2 + } + } + "flexilm" { + puts $op "VERSION=17.10-p003_1" + puts $op "VPATH=./make" + puts $op "TOOL=$vars(make_tool)" + puts $op "SCRIPTS=FF" + puts $op "LOG=LOG" + puts $op "ARGS=$vars(make_tool_args)" + puts $op "PARALLEL=-j2" + puts $op "SUBMIT=\"\"" + puts $op "TARGET=assemble" + puts $op "FF_STOP=assemble" + puts $op "STEPS = version setup do_cleanup" + puts $op "" +# puts $op "TOP=`/bin/grep \"^set vars(design)\" $vars(setup_tcl) | /bin/awk ' { printf(\"%s\\n\",\$\$3) } '`" + puts $op "TOP=$vars(design)" + puts $op "" + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + if {[info exists vars(flexmodel_prototype)] && $vars(flexmodel_prototype)} { + puts $op "all: setup prototype model_gen partition_place assign_pin partition blocks.prects top.prects assemble_flexilm blocks.signoff top.signoff assemble" + } else { + puts $op "all: setup model_gen partition_place assign_pin partition blocks.prects top.prects assemble_flexilm blocks.signoff top.signoff assemble" + } + } else { + puts $op "all: setup partition_place assign_pin partition blocks.prects top.prects assemble_flexilm blocks.signoff top.signoff assemble" + } + + puts $op "" + puts $op "help:" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" \$(VERSION) Foundation Flows\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" Makefile Targets\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" all : Run complete flow (default)\"" + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + if {[info exists vars(flexmodel_prototype)] && $vars(flexmodel_prototype)} { + puts $op "\t@echo \" prototype : Flexmodel prototype\"" + } + puts $op "\t@echo \" model_gen : Generate flexmodels\"" + } + puts $op "\t@echo \" partition_place : Initial placement & feedthrough\"" + puts $op "\t@echo \" assign_pin : Pin assignment\"" + puts $op "\t@echo \" partition : Partition design\"" + puts $op "\t@echo \" block.prects : Implement blocks to preCTS and generate flexIlm\"" + puts $op "\t@echo \" top.prects : flexIlm prects optimization and flexIlm ECO\"" + puts $op "\t@echo \" assemble_flexilm : Check assembled preCTS timing\"" + puts $op "\t@echo \" block.signoff : implement blocks\"" + puts $op "\t@echo \" top.signoff : implement top\"" + puts $op "\t@echo \" assemble : final chip assembly\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" Makefile Options\"" + puts $op "\t@echo \"===================================================\"" + puts $op "\t@echo \" VPATH : Make directory (default make)\"" + puts $op "\t@echo \" SUBMIT : LSF launch command (default '')\"" + puts $op "\t@echo \" PARALLEL : Number of machines (default -j2)\"" + if {$vars(novus)} { + puts $op "\t@echo \" TOOL : INNOVUS executable (default innovus)\"" + puts $op "\t@echo \" ARGS : INNOVUS arguments (default -novus_ui -64)\"" + } else { + puts $op "\t@echo \" TOOL : INNOVUS executable (default innovus)\"" + puts $op "\t@echo \" ARGS : INNOVUS arguments (default -nowin -64)\"" + } + puts $op "\t@echo \" SCRIPTS : Script directory (default FF)\"" + puts $op "\t@echo \" LOG : Logfile directory (default LOG)\"" + puts $op "\t@echo \"===================================================\"" + puts $op "assemble: top.signoff" + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_assemble.tcl -log \$(LOG)/assemble.log -overwrite" + puts $op "\t/bin/touch \$(VPATH)/assemble" + puts $op "" + puts $op "top.signoff : blocks.signoff" + puts $op "\tcd PARTITION_PRECTS/\$(TOP); \$(MAKE) -f Makefile FF_STOP=signoff signoff" + puts $op " /bin/touch \$(VPATH)/\$@" + puts $op "" + puts $op "blocks.signoff : assemble_flexilm" + puts $op "\tcd PARTITION_PRECTS; VPATH=\$(VPATH); export VPATH; \$(MAKE) \$(PARALLEL) blocks FF_STOP=signoff TARGET=signoff" + puts $op " /bin/touch \$(VPATH)/\$@" + puts $op "" + puts $op "assemble_flexilm : top.prects" + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_assemble_flexilm.tcl -log \$(LOG)/assemble_flexilm.log -overwrite" + puts $op "\t/bin/touch \$(VPATH)/assemble_flexilm" + puts $op "" + puts $op "top.prects : blocks.prects" + if {$vars(place_opt_design)} { + puts $op "\tcd PARTITION/\$(TOP); \$(MAKE) -f Makefile FF_STOP=place place " + } else { + puts $op "\tcd PARTITION/\$(TOP); \$(MAKE) -f Makefile FF_STOP=prects prects " + } + puts $op "\t/bin/touch \$(VPATH)/\$@" + puts $op "\t/bin/cp -rf PARTITION_FLEXILM/* PARTITION_PRECTS" + puts $op "\t/bin/rm -rf PARTITION_FLEXILM" + puts $op "" + puts $op "blocks.prects : partition" + if {$vars(place_opt_design)} { + puts $op "\tcd PARTITION; VPATH=\$(VPATH); export VPATH; \$(MAKE) \$(PARALLEL) blocks FF_STOP=place TARGET=place" + } else { + puts $op "\tcd PARTITION; VPATH=\$(VPATH); export VPATH; \$(MAKE) \$(PARALLEL) blocks FF_STOP=prects TARGET=prects" + } + puts $op "\t/bin/touch \$(VPATH)/\$@" + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + if {[info exists vars(flexmodel_prototype)] && $vars(flexmodel_prototype)} { + puts $op "prototype : setup" + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_prototype.tcl -log \$(LOG)/prototype.log -overwrite" + puts $op "\t/bin/touch \$(VPATH)/prototype" + puts $op "" + puts $op "model_gen : prototype" + } else { + puts $op "model_gen : setup" + } + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_model_gen.tcl -log \$(LOG)/model_gen.log -overwrite" + puts $op "\t/bin/touch \$(VPATH)/model_gen" + puts $op "" + puts $op "partition_place : model_gen" + } else { + puts $op "partition_place : setup" + } + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_partition_place.tcl -log \$(LOG)/partition_place.log -overwrite" + puts $op "\t/bin/touch \$(VPATH)/partition_place" + puts $op "" + puts $op "assign_pin : partition_place" + puts $op " VPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_assign_pin.tcl -log \$(LOG)/assign_pin.log -overwrite" + puts $op " /bin/touch \$(VPATH)/assign_pin" + puts $op "" + puts $op "partition : assign_pin" + puts $op "\tVPATH=\$(VPATH); export VPATH; \$(TOOL) \$(ARGS) -init \$(SCRIPTS)/INNOVUS/run_partition.tcl -log \$(LOG)/partition.log -overwrite" + puts $op " /bin/touch \$(VPATH)/partition" + puts $op "" + puts $op "single:" + puts $op "\t@\$(MAKE) TARGET=single FF_STOP=signoff" + puts $op "" + puts $op "debug_%:" + puts $op "\texport STEP=\$* ; VPATH=\$(VPATH); export VPATH; \$(TOOL) -init \$(SCRIPTS)/INNOVUS/run_debug.tcl -log \$(LOG)/\$@.log -win \$(ARGS:-nowin=)" + puts $op "" + puts $op "reset:" + puts $op "\t@/bin/rm -f \$(VPATH)/* PARTITION/*/\$(VPATH)/* PARTITION/*/\$(VPATH)/.RUNNING" + puts $op "\t@/bin/rm -f \$(VPATH)/* PARTITION_PRECTS/*/\$(VPATH)/* PARTITION_PRECTS/*/\$(VPATH)/.RUNNING" + puts $op "" + puts $op "setup:" + puts $op "#\t/bin/rm -fr PARTITION \$(VPATH) LOG" + puts $op "\t/bin/mkdir -p \$(VPATH) LOG" + puts $op "\t/bin/touch \$(VPATH)/setup" + + if {$vars(generate_flow_steps) && [info exists vars(flow_steps)]} { + set fp [open run_flow.tcl w] + if {![info exists vars(run_flow)]} { +# puts $fp "source $vars(script_dir)/flow_steps.tcl" + puts $fp "source $vars(script_dir)/flow_config.tcl" + set vars(run_flow) DONE + } + set fp1 [open $vars(script_dir)/flow_config.tcl w] + set fp2 [open $vars(script_dir)/flow_steps.tcl w] + puts $fp1 "set_db flow_database_directory $vars(dbs_dir)" + puts $fp1 "set_db flow_report_directory $vars(rpt_dir)" + puts $fp1 "set_db flow_log_directory $vars(log_dir)" + puts $fp1 "\nset_db flow_mail_to [exec whoami]" + puts $fp1 "set_db flow_mail_on_error true\n" +# puts $fp $vars(flow_steps) + foreach p [concat $vars(partition_list) $vars(design)] { +# set vars(flow_name) $p + if {[file exists $vars(partition_dir)/$p/$vars(script_dir)/.hiersteps.tcl]} { +# puts $fp2 "#-------------------------- $p --------------------------" + set ip [open $vars(partition_dir)/$p/$vars(script_dir)/.hiersteps.tcl r] + if {$p != $vars(design)} { + while {[gets $ip line]>=0} { + puts $fp2 $line + } + } else { + while {[gets $ip line]>=0} { + if {[regexp "create_flow_step -name top_" $line]} { + puts $fp2 $line + while {[gets $ip line]>=0} { + if {[regexp "^\}" $line]} { + puts $fp2 $line + break + } else { + puts $fp2 $line + } + } + } + } + } + } + if {[file exists $vars(partition_dir)/$p/run_flow.tcl]} { + set ip [open $vars(partition_dir)/$p/run_flow.tcl r] + while {[gets $ip line]>=0} { + puts $fp $line + } + } + if {[info exists vars(partition_dir_pass2)] && [file exists $vars(partition_dir_pass2)/$p/run_flow.tcl]} { + set ip [open $vars(partition_dir_pass2)/$p/run_flow.tcl r] + while {[gets $ip line]>=0} { + puts $fp $line + } + } + } + puts $fp2 "#-------------------------- HIER STEPS --------------------------" + puts $fp2 $vars(flow_steps,hier) + set vars(flow_name) $vars(design) + set asteps [FF::adjust_steps] +# puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $asteps\]\n" + set psteps [list] + set bsteps [list] + foreach s $asteps { + if {([lsearch $vars(fsteps) $s] != -1) && ($s != "assemble")} { + lappend bsteps $s + } else { + if {![regexp "^assemble" $s]} { + lappend psteps $s + } + } + } + set vars(flow_name) intermediate_assembly + puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list assemble_flexilm\]\n" + set vars(flow_name) final_assembly + puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list assemble\]\n" + set vars(flow_name) partitioning + puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $psteps\]\n" +# puts $fp "run_flow -flow $vars(flow_name)" + unset vars(flow_steps) +# set vars(flow_name) $vars(design) +# puts $fp "create_flow \\\n -name $vars(flow_name)\\\n -tool $vars(make_tool)\\\n -tool_options {-log $vars(flow_name).log}\\\n \[list $bsteps\]\n" + if {[file exists $vars(cwd)/.plugins]} { + set ip [open $vars(cwd)/.plugins r] + while {[gets $ip line]>=0} { + puts $fp1 $line + } + close $ip + file delete $vars(cwd)/.plugins + } + close $fp + close $fp1 + close $fp2 + } + } + } + + close $op + + } + + proc set_steps {mode format} { + # + # Sets the vars() array based on the mode/format passed in + # + + global vars + global errors + + if {$mode == "hier" } { + set mode "top_down" + if {$vars(hier_flow_type) == "2pass"} { + set mode "2pass" + } + } + + switch $mode { + "user" { + if {![info exists vars(steps)]} { + puts " ERROR: For user mode, vars(steps) must be provided" + exit + } + } + "flat" { + set vars(steps) [list "init" "place" "prects" "cts" "postcts" \ + "postcts_hold" "route" "postroute" \ + "postroute_hold" "postroute_si_hold" \ + "postroute_si" "signoff"] + if {$vars(preroute_opt_design)} { + set vars(steps) [lreplace $vars(steps) [lsearch $vars(steps) "place"] [lsearch $vars(steps) "cts"] preroute] + } +# if {$vars(route_opt_design)} { +# set vars(steps) [lreplace $vars(steps) [lsearch $vars(steps) "route"] [lsearch $vars(steps) "postroute"] route_opt_design] +# } + if $vars(rc) { + if {$vars(enable_rcp)} { + set vars(steps) [concat "syn_map" "syn_incr" "syn_place" $vars(steps)] + } else { + set vars(steps) [concat "syn_map" "syn_incr" $vars(steps)] + } + } + } + + "top_down" { + set vars(steps) [list "partition_place" "assign_pin" "partition" "init" "place" "prects" \ + "cts" "postcts" "postcts_hold" "route" \ + "postroute" "postroute_hold" \ + "postroute_si_hold" "postroute_si" \ + "signoff" "assemble"] + set vars(hsteps) [list "assemble" "partition_place" "assign_pin" "partition"] + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + # Insert the model_gen step before partition_place + foreach varname {steps hsteps} { + set old $vars($varname) + set vars($varname) [linsert $old [lsearch $old "partition_place"] "model_gen"] + } + if {[info exists vars(flexmodel_prototype)] && $vars(flexmodel_prototype)} { + # Insert the prototype step before partition_place + foreach varname {steps hsteps} { + set old $vars($varname) + set vars($varname) [linsert $old [lsearch $old "partition_place"] "prototype"] + } + } + } + + set vars(fsteps) [list "init" "place" "prects" "cts" "postcts" \ + "postcts_hold" "route" "postroute" \ + "postroute_hold" "postroute_si_hold" \ + "postroute_si" "signoff"] + } + "1pass" { + set vars(steps) [list "partition_place" "assign_pin" "partition" "init" "place" "prects" \ + "cts" "postcts" "postcts_hold" "route" \ + "postroute" "postroute_hold" \ + "postroute_si_hold" "postroute_si" \ + "signoff" "assemble"] + set vars(hsteps) [list "assemble" "partition_place" "assign_pin" "partition"] + set vars(fsteps) [list "init" "place" "prects" "cts" "postcts" \ + "postcts_hold" "route" "postroute" \ + "postroute_hold" "postroute_si_hold" \ + "postroute_si" "signoff"] + } + "2pass" { + if {$vars(enable_flexilm)} { + set vars(steps) [list "partition_place" "assign_pin" "partition" "init" "place" "prects" "assemble_flexilm" \ + "cts" "postcts" "postcts_hold" "route" \ + "postroute" "postroute_hold" \ + "postroute_si_hold" "postroute_si" \ + "signoff" "assemble"] + set vars(hsteps) [list "assemble" "assemble_flexilm" "partition_place" "assign_pin" "partition"] + } else { + set vars(steps) [list "partition_place" "assign_pin" "partition" "init" "place" "prects" \ + "cts" "rebudget" "postcts" "postcts_hold" "route" \ + "postroute" "postroute_hold" \ + "postroute_si_hold" "postroute_si" \ + "signoff" "assemble"] + set vars(hsteps) [list "assemble" "rebudget" "partition_place" "assign_pin" "partition"] + } + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + # Insert the model_gen step before partition_place + foreach varname {steps hsteps} { + set old $vars($varname) + set vars($varname) [linsert $old [lsearch $old "partition_place"] "model_gen"] + } + if {[info exists vars(flexmodel_prototype)] && $vars(flexmodel_prototype)} { + # Insert the prototype step before partition_place + foreach varname {steps hsteps} { + set old $vars($varname) + set vars($varname) [linsert $old [lsearch $old "partition_place"] "prototype"] + } + } + } + set vars(fsteps) [list "init" "place" "prects" "cts" "postcts" \ + "postcts_hold" "route" "postroute" \ + "postroute_hold" "postroute_si_hold" \ + "postroute_si" "signoff"] + } + "bottom_up" { + set vars(steps) [list "init" "place" "prects" "cts" "postcts" \ + "postcts_hold" "route" "postroute" \ + "postroute_hold" "postroute_si_hold" \ + "postroute_si" "signoff" "assemble"] + set vars(hsteps) [list "assemble"] + set vars(fsteps) [list "init" "place" "prects" "cts" "postcts" \ + "postcts_hold" "route" "postroute" \ + "postroute_hold" "postroute_si_hold" \ + "postroute_si" "signoff"] + } + + "default" { + puts "Internal error: Unknown mode \"$vars(mode)\". Aborting." + exit -111 + } + } + + if {!$vars(enable_celtic_steps) } { + foreach step [list "postroute_si" "postroute_si_hold"] { + set index [lsearch $vars(steps) $step] + if {$index != -1} { + set vars(steps) [lreplace $vars(steps) $index $index] + } + } + } + } + + proc flatten_curlies_in_list list {string map {\{ "" \} ""} $list} + + # + # gen_incr_filename(scriptNameBase) + # Buda Leung, 11/2011 + # args: + # $scriptNameBase: /basename of dir + # @return: new base name + # + # Description: Generates a new output file name using the input + # argument as a basename. This proc looks for all files in the + # same directory as the argument with a matching basename. + # It then looks for a trailing integer suffix, and compares + # all matching files to find the largest integer. + # It returns a new file name of the form / + # + # Example Usage: input argument setup.tcl + # files in dir: setup.tcl setup.tcl1 + # @return: setup.tcl2 + # + + proc gen_incr_filename {scriptNameBase} { + set file_list [glob -nocomplain [set scriptNameBase]*] + if {[llength $file_list] > 0} { + set highNum 1 + foreach file $file_list { + set re "[set scriptNameBase](\[\[:digit:\]\]+)\$" + if {[regexp $re $file full num]} { + if {$num >= $highNum} { + set highNum [incr num] + } + } + } + set scriptName $scriptNameBase$highNum + } else { + set scriptName "[set scriptNameBase]" + } + return $scriptName + } + + # + # gen_new_rundir {args} + # Buda Leung, 11/2011 + # args: + # -dir : dir name to change + # -style [increment|date|custom]: naming style to use [increment|date|custom] + # -date_style (required when style=date): tcl commands to create a date string + # -custom (optional): a custom string to prepend or postpend to the dir + # -name_change_order [prefix|suffix] (required when customString is defined): [prefix|suffix] + # @return: new dir name + # + # Description: Generates a new directory name based on the basename + # and options provided. The options allowed are: + # + # style: + # * increment: add an integer to the rundir based on dirs found in [dirname $dir] + # * date: add a date string to the rundir name, using vars(date_style) to control the formatting + # * custom: add a custom string to the rundir name + # nameChangeOrder: + # * prefix: add the custom string to the beginning of the rundir + # * suffix: add the custom string to the end of the rundir + # + # NOTE: increment, date, and custom are mutually exclusive options + # + # Example Usage: + # gen_new_rundir work/run increment + # (dirs with matching basename : work/run1 work/run2) + # @return: work/run3 + # + # gen_new_rundir work/run date + # @return: work/run_2011-11-23_12_09_58 + # + # gen_new_rundir work/run custom rcp_high_eff prefix + # @return: work/rcp_high_eff_run + + proc gen_new_rundir {argv} { + + global vars + global dargs + global fargs + # + # Proc defaults + # Note that defaults live in the default_setup.tcl, but when gen_new_rundir is called, that setup.tcl has not yet been loaded + # These defaults must stay synchronized to the default_setup.tcl vars() equivalents + # + set def_date_style "\[clock format \[clock seconds\] -format \"%Y-%m-%d_%H_%M_%S\" \]" + # Use the following if you want a custom prefix/suffix added to the rundir + set def_custom_rundir_name_append "" + # vars(rundir_namechange_method) [prefix|suffix] + set def_rundir_namechange_method "suffix" + + # + # Arg processing + # + + while {[llength $argv] > 0} { + set option [lindex $argv 0] + set argv [lreplace $argv 0 0] + switch -regexp -- $option { + ^-(d|-dir)$ { + set dash_d_script_dir [lindex $argv 0] + set argv [lreplace $argv 0 0] + } + ^-(y|-style)$ { + set dash_y_style_type [lindex $argv 0] + set argv [lreplace $argv 0 0] + } + ^-(u|-rundir)$ { + set dash_u_rundir_base [lindex $argv 0] + set argv [lreplace $argv 0 0] + } + } + } ; # end while (processing args) + + set dbgMsg " gen_new_rundir(): " + + # + # Load vars. This will overwrite any FF defaults, but not the -u/-y options + # Only looking for the following: + # vars(rundir_base) (-u takes precedence) + # vars(rundir) - overrides vars(rundir_base) and -u/-y + # vars(auto_increment_rundir_style) (-y takes precedence) + # vars(date_style) (no gen_innovus_flow.tcl option) + # vars(custom_rundir_name_append) (no gen_innovus_flow.tcl option) + # vars(rundir_namechange_method) (no gen_innovus_flow.tcl option) + # + FF_NOVUS::execute_flow "source_only" true "" + + # NOTE: after the above executes, dargs and fargs have all been analyzed, and vars exist for all those entries + # in other words, we no longer care about dargs(rundir), only vars(rundir)... + + # In case the user defined these in their setup.tcl + if {![info exists vars(date_style)]} { + set date_style $def_date_style + } + if {![info exists vars(custom_rundir_name_append)]} { + set vars(custom_rundir_name_append) $def_custom_rundir_name_append + } + if {![info exists vars(rundir_namechange_method)]} { + set vars(rundir_namechange_method) $def_rundir_namechange_method + } + + # + # Set the rundir original name + # Priority: + # 1) vars(rundir) + # 2) dash_u_rundir_base + # 3) vars(rundir_base) + # 4) def_rundir + + # if vars(rundir) eq dargs(rundir), then basically the user has not specified a vars(rundir), or they set it to . + # use file normalize to handle "./" vs "." + if {[file normalize $vars(rundir)] eq [file normalize $dargs(rundir)]} { + if {![info exists dash_u_rundir_base]} { + if {![info exists vars(rundir_base)]} { + set rundir_origname $dargs(rundir) + } else { + set rundir_origname $vars(rundir_base) + } + } else { + if {[info exists vars(rundir_base)] && $vars(rundir_base) ne $dash_u_rundir_base} { + # Conflict between -u and setup.tcl. -u wins + puts " WARNING \"-u $dash_u_rundir_base\" overriding config variable vars(rundir_base) ($vars(rundir_base))" + puts " To prevent this behavior, do not use the \"-u\" option (FF will use vars(rundir_base) from your config file)." + } + set rundir_origname $dash_u_rundir_base + } + } else { + # The following handle conflicts between vars(rundir) and -u or vars(rundir_base) + if {[info exists dash_u_rundir_base]} { + if {$vars(rundir) ne $dargs(rundir) && $vars(rundir) ne $dash_u_rundir_base} { + puts " WARNING vars(rundir) \"$vars(rundir)\" overriding \"-u $dash_u_rundir_base\" option." + puts " To prevent this behavior, do not set vars(rundir) in your config file." + } elseif {[info exists vars(rundir_base)]} { + puts " WARNING vars(rundir) \"$vars(rundir)\" overriding config variable vars(rundir_base) \"$vars(rundir_base)\"" + puts " To prevent this behavior, do not set vars(rundir) in your config file." + } + } + set rundir_origname $vars(rundir) + } + # + # Set the rundir naming style + # Priority: + # 1) vars(auto_increment_rundir_style) + # 2) dash_y_style_type + # 3) def_auto_increment_rundir_style + + if {![info exists vars(auto_increment_rundir_style)]} { + if {![info exists dash_y_style_type]} { + set styleType $dargs(style) + } else { + set styleType $dash_y_style_type + } + } else { + # vars(auto_increment_rundir_style) was set in the setup.tcl + if {[info exists dash_y_style_type] && $dash_y_style_type ne $vars(auto_increment_rundir_style)} { + # Conflict between -y and setup.tcl. -y wins + puts " WARNING \"-y $dash_y_style_type\" overriding config variable vars(auto_increment_rundir_style) ($vars(auto_increment_rundir_style))" + puts " To prevent this behavior, do not use the \"-y\" option (FF will use vars(auto_increment_rundir_style) from your config file)." + set styleType $dash_y_style_type + } else { + set styleType $vars(auto_increment_rundir_style) + } + } + + # + # If increment is specified, -u / vars(rundir) is required ; otherwise error and exit: + # + if {$styleType eq "increment" && ([file tail $rundir_origname] eq "" || [file normalize $rundir_origname] eq [file normalize .])} { + puts " ERROR: Rundir naming style was set to \"increment\", but rundir evaluated to \".\" due to:" + if {[info exists vars(rundir)] && [file normalize $vars(rundir)] eq [file normalize .]} { + puts " setting vars(rundir) to \"$vars(rundir)\" in your configuration file." + } elseif {[info exists dash_u_rundir_base] && [file normalize $dash_u_rundir_base] eq [file normalize .]} { + puts " the \"-u\" $dash_u_rundir_base argument to gen_innovus_flow.tcl" + } elseif {[info exists vars(rundir_base)] && [file normalize $vars(rundir_base)] eq [file normalize .]} { + puts " setting vars(rundir_base) to \"$vars(rundir_base)\" in your configuration file." + } else { + puts " the default rundir setting which is \"$def_rundir\"" + } + puts " To prevent this error, use the -u argument to specify a rundir base, or specify a vars(rundir_base) in your setup.tcl" + exit 99 + } + + # + # Generate new rundir if valid style defined + # + + # -date_style (required when style=date): tcl commands to create a date string + # -custom (optional): a custom string to prepend or postpend to the dir + # -name_change_order [prefix|suffix] (required when customString is defined): [prefix|suffix] + + # Remove any "//" in the path + regsub -all {\/\/} $rundir_origname {/} rundir_origname + + set rundir_basename [file tail $rundir_origname] + set rundir_dirname [file dirname $rundir_origname] + + if {$styleType ne "none"} { + switch -exact -- $styleType { + date { + if {$vars(rundir_namechange_method) eq "prefix"} { + set new_basename [subst $date_style]_${rundir_basename} + } elseif {$vars(rundir_namechange_method) eq "suffix"} { + set new_basename ${rundir_basename}_[subst $date_style] + } + } + increment { + set new_basename [file tail [FF::gen_incr_filename $rundir_origname]] + } + custom { + if {$vars(custom_rundir_name_append) ne ""} { + if {$vars(rundir_namechange_method) eq "prefix"} { + set new_basename [subst $vars(custom_rundir_name_append)]_${rundir_basename} + } elseif {$vars(rundir_namechange_method) eq "suffix"} { + set new_basename ${rundir_basename}_[subst $vars(custom_rundir_name_append)] + } + } else { + puts " NOTE: vars(custom_rundir_name_append) set to \"\". No modification to rundir will occur." + set new_basename $rundir_basename + } + } + default { + # This should never happen! (indicates incorrect usage within gen_innovus_flow.tcl!) + puts "$dbgMsg WARNING: Unknown option for styleType. Using default (none)" + } + } + set vars(rundir) [file normalize [join "$rundir_dirname $new_basename" "/"]] + set vars(new_rundir_basename) $new_basename + } else { + set vars(rundir) [file normalize $rundir_origname] + } + return $vars(rundir) + };# end proc gen_new_rundir + + proc relPathTo {target current} { + #puts "calling relPathTo $target $current" + set cc [file split [file normalize $current]] + set tt [file split [file normalize $target]] + if {![string equal [lindex $cc 1] [lindex $tt 1]]} { + # not on *n*x then + #return -code error "FF::relPathTo(): ERROR $target not on same volume as $current" + return [file normalize $target] + } + set prefix "" + while {[string equal [lindex $cc 0] [lindex $tt 0]] && [llength $cc] > 0} { + # discard matching components from the front (but don't + # do the last component in case the two files are the same) + set cc [lreplace $cc 0 0] + set tt [lreplace $tt 0 0] + } + + #if {[llength $cc] == 1} { + # # just the file name, so target is lower down (or in same place) + # set prefix "." + #} + # step up the tree (start from 1 to avoid counting file itself + for {set i 1} {$i <= [llength $cc]} {incr i} { + append prefix " .." + } + # stick it all together (the eval is to flatten the target list) + if {$cc eq $tt} { + return "." + } else { + return [eval file join $prefix $tt] + } + } + + proc flatten_list list {string map {\{ "" \} ""} $list} + proc remove_outer_braces {args} { + if {[regsub {^\{} $args "" tmp]} {set args $tmp} + if {[regsub {\}$} $args "" tmp]} {set args $tmp} + return $args + } + + proc relativizeFileOrDir {args} { + #puts "relativizeFileOrDir $args" + set NewDirName "" + set arrName "vars" + set VarDirName "" + set skipVariableUsageInReference 0 + set mustExist 0 + set skipList {} + set exactVar "" + set exactSubDirMatch "" + set varToSub "" + set skipDirList "" + + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -exact -- $option { + -arr { + set arrName [lindex $args 0] + set args [lreplace $args 0 0] + } + -vardir { + set VarDirName [lindex $args 0] + set args [lreplace $args 0 0] + } + -newdir { + set NewDirName [lindex $args 0] + set args [lreplace $args 0 0] + } + -skipVariableUsageInReference { + set skipVariableUsageInReference 1 + } + -mustExist { + set mustExist 1 + } + -skipVar { + lappend skipList [lindex $args 0] + set args [lreplace $args 0 0] + } + -skipDir { + lappend skipDirList [lindex $args 0] + set args [lreplace $args 0 0] + } + -var { + set varToSub [lindex $args 0] + set args [lreplace $args 0 0] + } + -exactSubDirMatch { + set exactSubDirMatch [lindex $args 0] + set args [lreplace $args 0 0] + } + } + };# end while (processing args) + + # Always skip the VarDirName when analyzing variables in the array + lappend skipList $VarDirName + + # Need to convert a list of files to relative paths (TBD) + global $arrName + # Check if the vardir (key) exists in the array. If not, exit + if {$VarDirName eq ""} { + return -code error "relativizeFileOrDir() called w/out -vardir argument. Exiting ..." + } + if {$NewDirName eq ""} { + set NewDirName $VarDirName + } + + set relativizeConvMesgList {} + if {[info exists ${arrName}($VarDirName)]} { + foreach arg [lsort -dictionary [array names $arrName]] { + if {$varToSub eq "" || $varToSub eq $arg} { + # foreach key (entry) in the array, look for files/folders + set re "" + #puts "lsearch $skipList $arg" + # First check black list + if {[lsearch $skipList $arg] == -1} { + if {![regexp {\[} [set ${arrName}($arg)]]} { + # only continue if the variable is not the vardir (key) itself, and the value of the variable doesn't have a $ in it + #puts "relativizeFileOrDir() checking ${arrName}($arg) (current: ->[set ${arrName}($arg)]<-)" + set tmpValue "" + # + # Process all members of the $arrName(arg) (could be a list), and subst each one + # + set fileFound 0 + set re "[file normalize [set ${arrName}($VarDirName)]]\/(.*)" + foreach possibleFile [set ${arrName}($arg)] { + if {$mustExist} { + # The file or dir must exist after normalization + #puts "Checking for existence of [file normalize [subst $possibleFile]]" + if {![catch {file exists [file normalize [subst $possibleFile]]}]} { + if {[file exists [file normalize [subst $possibleFile]]]} { + #puts "Exists: [file normalize [subst $possibleFile]]" + set file [file normalize [subst $possibleFile]] + set size [file size $file] + set mtime [file mtime $file] + set type [file type $file] + #puts "file $file size: $size, mtime: $mtime type: $type" + set fileFound 1 + #puts "Checking for path to file: ->[file normalize [subst $possibleFile]]<- from ->[file normalize [set ${arrName}($VarDirName)]]<-" + set relPathValue [relPathTo [file normalize [subst $possibleFile]] [file normalize [subst [set ${arrName}($VarDirName)]]]] + #puts "relPathValue: $relPathValue" + set skipDueToSkipDir 0 + if {$skipDirList ne ""} { + foreach dir $skipDirList { + set re3 "[file normalize [subst $dir]]/(.*)" + if {[regexp $re3 [file normalize [subst $possibleFile]] full relativePortion]} { + set skipDueToSkipDir 1 + } + } + } + if {!$skipDueToSkipDir} { + if {$exactSubDirMatch ne ""} { + set re2 "$exactSubDirMatch/(.*)" + # the normalized path of the possible file has to match the normalized path of the subdir... + if {[regexp $re2 [file normalize [subst $possibleFile]] full relativePortion]} { + if {$relPathValue ne [file normalize $possibleFile]} { + if {$skipVariableUsageInReference} { + lappend tmpValue $relPathValue + } else { + lappend tmpValue "\$${arrName}($VarDirName)/$relPathValue" + } + } else { + lappend tmpValue $possibleFile + } + } else { + lappend tmpValue $possibleFile + } + } else { + #puts "skipVariableUsageInReference: $skipVariableUsageInReference" + if {$relPathValue ne [file normalize $possibleFile]} { + if {$skipVariableUsageInReference} { + lappend tmpValue $relPathValue + } else { + lappend tmpValue "\$${arrName}($VarDirName)/$relPathValue" + } + } else { + lappend tmpValue $possibleFile + } + #puts "final value: ->$tmpValue<-" + } + } else { + lappend tmpValue $possibleFile + } + } else { + # could not be tested as a file, so just lappend the entire string + lappend tmpValue $possibleFile + } + } else { + # could not be tested as a file, so just lappend the entire string + lappend tmpValue $possibleFile + } + } else { + # The file or dir need not exist, but the vardir must be a subdir (i.e., there must be a subdir that does exist) + #puts "Checking possible file: ->[subst $possibleFile]<- against regular expression ->$re<-" + if {[regexp $re [subst $possibleFile] full relativizedPortion]} { + if {$relativizedPortion eq ""} { set relativizedPortion "."} + set fileFound 1 + if {$skipVariableUsageInReference} { + lappend tmpValue $relativizedPortion + } else { + lappend tmpValue "\$${arrName}($VarDirName)/$relativizedPortion" + } + if {[flatten_list $possibleFile] ne [flatten_list $tmpValue]} { + #puts " INFO Converted file $possibleFile to use a relative path to determine it's location: $tmpValue" + } + } else { + lappend tmpValue $possibleFile + } + } + } + # If the above for loop didn't find any files, simply reset the arrName(arg) statement + if {$fileFound} { + # Clean up original arrName(arg) and subb'ed value to prepare for comparison + set testArg [flatten_list [set ${arrName}($arg)]] + regsub -all {[ \r\t\n\\]+} $testArg " " testArg + regsub {^\s+(.*)} $testArg {\1} testArg + regsub {(.*)\s+$} $testArg {\1} testArg + + set tmpValue [flatten_list $tmpValue] + regsub -all {[ \r\t\n]+} $tmpValue " " tmpValue + regsub {^\s+(.*)} $tmpValue {\1} tmpValue + regsub {(.*)\s+$} $tmpValue {\1} tmpValue + if {$tmpValue ne "" && $tmpValue ne $testArg} { + #puts " INFO Original value for arrName($arg): ->$testArg<-" + if {$relativizeConvMesgList eq ""} { + lappend relativizeConvMesgList "# Variable conversion for paths relative to \$${arrName}($VarDirName) ([set ${arrName}($VarDirName)])" + } + lappend relativizeConvMesgList " INFO Converted file variable [subst $arrName]($arg) from [set ${arrName}($arg)] to $tmpValue" + set ${arrName}($arg) $tmpValue + #puts " INFO Final value for arrName($arg): ->$tmpValue<-" + } + } + } + } + } + } + } + if {[llength $relativizeConvMesgList] > 1} { + lappend relativizeConvMesgList "# Total converted for variable [set ${arrName}($VarDirName)]:[expr {[llength $relativizeConvMesgList]-1}]" + } + return $relativizeConvMesgList + } + proc denormalize_rundir {} { + + global vars + + #set op [open $vars(rundir)/.ff.tcl w] + ## BCL: added Foundation Flow execution dir + #puts $op "# Foundation Flow Codegen Record." + #puts $op "# Executed on [exec date] by user: [exec whoami]" + #puts $op "# Copyright 2011, Cadence Design Systems, Inc." + #puts $op "# All Rights Reserved" + #puts $op "" + #puts $op "# Inputs to code generation:" + #puts $op "# ----------------------------------------------" + #puts $op "set vars(ff_exe_dir) \"[exec pwd]\"" + ##puts $op "set vars(ff_dir) [file dirname $vars(script_path)]" + ## BCL: removed ff_dir, changed to script_path (ff_dir was really redundant) + #puts $op "set vars(script_path) \"[file normalize $vars(script_path)]\"" + ## BCL: added variable referencing of config_files + #set cwd "" + #catch {set cwd [exec pwd]} + #foreach configFile [subst $vars(config_files)] { + # #puts "Processing $configFile" + # if {[file dirname [file normalize $configFile]] eq $cwd} { + # lappend configFileList "\[subst \$vars(ff_exe_dir)\]/[file tail $configFile]" + # } elseif {[FF::relPathTo [file normalize $configFile] $cwd] eq [file normalize [subst $configFile]]} { + # lappend configFileList [file normalize $configFile] + # } else { + # # Use the relative path name from ff_exe_dir + # lappend configFileList "\[subst \$vars(ff_exe_dir)\]/[FF::relPathTo [file normalize [subst $configFile]] $cwd]" + # } + #} + #puts $op "set vars(config_files) \"[FF::flatten_list $configFileList]\"" + ## BCL: added variable referencing of plug dirs + #if {[file dirname [file normalize $vars(plug_dir)]] eq $cwd} { + # # plug_dir is located in ff_exe_dir + # puts $op "set vars(plug_dir) \"\$vars(ff_exe_dir)/$vars(plug_dir)\"" + #} elseif {[FF::relPathTo [file normalize $vars(plug_dir)] $cwd] eq [file normalize $vars(plug_dir)]} { + # # plug_dir cannot be referenced using a relative path + # puts $op "set vars(plug_dir) \"[file normalize $vars(plug_dir)]\"" + #} else { + # # Use the relative path name from ff_exe_dir + # puts $op "set vars(plug_dir) \"\$vars(ff_exe_dir)/[FF::relPathTo [file normalize $vars(plug_dir)] $cwd]\"" + #} + #if {[info exists vars(rc_plug_dir)]} { + # if {[file dirname [file normalize $vars(rc_plug_dir)]] eq $cwd} { + # # rc_plug_dir is located in ff_exe_dir + # puts $op "set vars(rc_plug_dir) \"\$vars(ff_exe_dir)/$vars(rc_plug_dir)\"" + # } elseif {[FF::relPathTo [file normalize $vars(rc_plug_dir)] $cwd] eq [file normalize $vars(rc_plug_dir)]} { + # # rc_plug_dir cannot be referenced using a relative path + # puts $op "set vars(rc_plug_dir) \"[file normalize $vars(rc_plug_dir)]\"" + # } else { + # # Use the relative path name from ff_exe_dir + # puts $op "set vars(rc_plug_dir) \"\$vars(ff_exe_dir)/[FF::relPathTo [file normalize $vars(rc_plug_dir)] $cwd]\"" + # } + #} + ## BCL: added vars(rundir) + #puts $op "" + #puts $op "# Outputs from code generation:" + #puts $op "# ----------------------------------------------" + #puts $op "set vars(rundir) \"\[file normalize \[file dirname \[info script\]\]\]\"" + #puts $op "set vars(codegen_dir) \"[FF::relPathTo [file normalize $vars(script_dir)] [file normalize $vars(rundir)]]\"" + #puts $op "set vars(script_dir) \"[FF::relPathTo [file normalize $vars(script_dir)] [file normalize $vars(rundir)]]\"" + #close $op + + if {$vars(user_mode) == "hier"} { + #foreach block [concat $vars(design) $vars(partition_list)] { + # file copy -force .ff.tcl $vars(partition_dir)/$block + #} +# if {($vars(hier_flow_type) == "2pass") && !$vars(enable_flexilm)} { +# foreach block [concat $vars(design) $vars(partition_list)] { +# file copy -force $vars(partition_dir)/$block/Makefile.pass2 $vars(partition_dir_pass2)/$block/Makefile +# file copy -force $vars(partition_dir)/$block/Makefile.pass2 $vars(script_dir)/$block.Makefile +# file delete $vars(partition_dir)/$block/Makefile.pass2 +# } +# } + } + } + + proc check_tcl_version {} { + set tcl_version [info tclversion] + set tversion [split $tcl_version "."] + set major [lindex $tversion 0] + set minor [lindex $tversion 1] + set valid_version 1 + if {$major != "8"} { + set valid_version 0 + } else { + if {[expr $minor] < 4} { + set valid_version 0 + } + } + if {!$valid_version} { + puts "-------------------------------------------------" + puts " ERROR: TCL VERSION MUST BE 8.4 OR GREATER." + puts " YOUR TCL VERSION IS $tcl_version." + # puts " PLEASE RUN THE FLOW GENERATOR USING" + # puts " INNOVUS (WITH -e OPTION)" + puts "-------------------------------------------------" + exit -1 + } else { +# puts "-------------------------------------------------" +# puts " TCL VERSION -> $tcl_version" +# puts "-------------------------------------------------" + } + } + + proc create_flow {argv} { + + global vars + global infos + global warnings + global errors + global check + global dargs + global fargs + global argv0 + global env + + set orig_argv $argv + + interp alias {} Puts {} puts + + ############################################################################## + # Parse the arguments passed in to the script. These set up the environment # + # for the rest of the system # + ############################################################################## + + set vars(arg_list) [list \ + codegen \ + edi \ + flat \ + makefile \ + mode \ + rc \ + novus \ + synth_flow \ + rundir \ + script_dir \ + style \ + user_mode \ + verbose \ + version \ + ] + + set vars(check_setup) 1 + + if {![info exists vars(script_path)]} { + set vars(script_path) "" + } + set normalized [file normalize $argv0] + if {[file isdirectory $normalized]} { + set default_script_path $normalized + } elseif {[file isdirectory [file dirname $normalized]]} { + set default_script_path [file dirname $normalized] + } + + if {[info exists env(FF_SETUP_PATH)] && [file exists $env(FF_SETUP_PATH)]} { + set setup_path $env(FF_SETUP_PATH) + } else { + set setup_path "." + } + + if {![info exists argv] || ![llength $argv]} { + set argv "-h" + } + + set vars(format_lines) true + + while {[string match "-*" [lindex $argv 0]]} { + if {![llength $argv]} { + break + } + set option [lindex $argv 0] + set argv [lreplace $argv 0 0] + + switch -regexp -- $option { + ^-(h|-help)$ { + puts $FFMM::usage + exit 0 + } + + ^-(m|-mode)$ { + # + # Specify the runtime mode. + # + + if {[llength $argv]} { + set newMode [lindex $argv 0] + set argv [lreplace $argv 0 0] + } else { + puts $FFMM::noMode + puts $FFMM::usage + exit -1 + } + + # + # The mode needs to be one of the recognized modes + # + + if {[lsearch [concat "user" "hier" $FFMM::validModes] $newMode] == -1} { + puts [format $FFMM::unknownMode $newMode] + puts $FFMM::usage + exit -111 + } + set mode $newMode + puts " FLOW MODE == $mode" + } + ^-(n|-nomake)$ { + # + # Skip Makefile generation + # + + set makefile false + puts " GENERATE MAKEFILE == $makefile" + } + ^-(r|-rtl)$ { + # + # Enable Genus Codegen + # + + set rc true + puts " RTl SCRIPTS == $rc" + } + ^-(N|-Novus)$ { + # + # Enable Novus Syntax + # + + set novus true + puts " NOVUS SCRIPTS == $novus" + } +# ^-(l|-flow)$ { +# if {[llength $argv]} { +# set synth_flow [lindex $argv 0] +# set argv [lreplace $argv 0 0] +# } else { +# puts $FFMM::nosynth_flow +# } +# } +# ^-(a|applets)$ { +# # +# # Define the applets directory path +# # +# +# if {[llength $argv]} { +# set appletsDir [lindex $argv 0] +# set argv [lreplace $argv 0 0] +# } else { +# puts $FFMM::noAppletPath +# exit -1 +# } +# +# puts " APPLETS DIRECTORY == $appletsDir" +# set vars(applets_dir) $appletsDir +# } + ^-(v|-version)$ { + # + # Set the target Innovus version + # + + + if {[llength $argv]} { + set version [lindex $argv 0] + set argv [lreplace $argv 0 0] + } else { + puts $FFMM::noVersion + exit -1 + } + if {([lsearch $FF::valid_versions $version] < 0)} { + puts $FFMM::noVersion + exit -1 + } +# puts " VERSION == $version" + } + ^-(f|-flat)$ { + # + # Get the path to the scripts. + # + + if {[llength $argv]} { + set newFlat [lindex $argv 0] + set argv [lreplace $argv 0 0] + } else { + puts $FFMM::noFlat + exit -1 + } + if {($newFlat != "full") && ($newFlat != "partial") && ($newFlat != "none")} { + puts $FFMM::noFlat + exit -1 + } + puts " FLAT == $newFlat" + set flat $newFlat + } + ^-(e|-edi)$ { + # + # Enable Innovus mode + # + + if {[llength $argv]} { + set edi true +# set argv [lreplace $argv 0 0] + } + puts " INNOVUS == $vars(edi)" + } + ^-(d|-dir)$ { + # + # Define output directory path + # + + if {[llength $argv]} { + set scriptDir [lindex $argv 0] + set argv [lreplace $argv 0 0] + } else { + puts $FFMM::noPath + exit -1 + } + + puts " OUTPUT DIRECTORY == $scriptDir" + + } + ^-(y|-style)$ { + # + # Define rundir directory naming style + # -d must be provided, since this will redefine vars(script_dir) + # + + if {[llength $argv]} { + set styleType [lindex $argv 0] + switch -regexp -- $styleType { + (increment|date|none) { + set argv [lreplace $argv 0 0] + } + default { + puts [format $FFMM::unknownOption "-y $styleType"] + puts $FFMM::usage + exit -1 + } + } + } else { + puts $FFMM::noStyle + exit -1 + } + puts " DIRECTORY NAMING STYLE == $styleType" + } + ^-(u|-rundir)$ { + # + # Define execution (run) dir + # This option superceeds -d ($vars(script_dir) is overridden to $vars(rundir)/FF) + # + + if {[llength $argv]} { + set runDir [lindex $argv 0] + set argv [lreplace $argv 0 0] + } else { + puts $FFMM::noRundir + exit -1 + } + + puts " RUNDIR BASE == $runDir" + } + ^-(s|-setup)$ { + # + # Get the path to the directory containing the setup.tcl control + # file + # + + if {[llength $argv]} { + set newPath [lindex $argv 0] + set argv [lreplace $argv 0 0] + } else { + puts $FFMM::noSetupPath + puts $FFMM::usage + exit -1 + } + + # + # Does the path exist? If not, error out. Make sure that the path + # exists and contains the source files + # + + if {![file exists $newPath]} { + puts [format $FFMM::noSuchPath $newPath] + puts $FFMM::usage + exit -1 + } + set setup_path $newPath + puts " SETUP PATH == $setup_path" + } + ^-(V|-Verbose)$ { + # + # Enable Verbose mode + # + + if {[llength $argv]} { + set vars(verbose) true + } + puts " VERBOSE == $vars(verbose)" + } + ^-(H|-Help)$ { + # + # Print step help + # + + if {[llength $argv]} { + set vars(help) true + } +# puts " HELP == $vars(help)" + } + default { + puts [format $FFMM::unknownOption $option] + puts $FFMM::usage + exit -1 + } + } + } + + if {![file exists $setup_path/setup.tcl]} { + puts [format $FFMM::missingSetupFile $setup_path] + exit -1 + } else { + set vars(setup_path) $setup_path + } + + # + # Source the other Tcl files to execute the flow. Then do so + # + + source "$vars(script_path)/ETC/utils.tcl" + + # + # Get new rundir (using -u/-y and possibly user variables) + # + # NOTE: dargs: default args + # fargs: flow args specified on command line + + if {![info exists first]} { + # BCL: Moved this code before gen_new_rundir since dargs(mode) must be set before executing execute_flow + if {![info exists mode]} { + set mode flat + set dargs(user_mode) flat + set dargs(mode) flat + } else { + if {$mode == "flat" || $mode == "user"} { + set fargs(user_mode) flat + } else { + set fargs(user_mode) hier + } +# set fargs(user_mode) flat + } + if {![info exists makefile]} { + set dargs(makefile) true + } else { + set fargs(makefile) $makefile + } + if {![info exists rc]} { + set dargs(rc) false + set rc false + } else { + set fargs(rc) $rc + } + if {![info exists novus]} { + set dargs(novus) false + set novus false + } else { + set fargs(novus) $novus + } + if {![info exists synth_flow]} { + set dargs(synth_flow) default_synthesis_flow_3step + } else { + set fargs(synth_flow) $synth_flow + } + if {![info exists version]} { + set dargs(version) 17.1.0 + } else { + set fargs(version) $version + } + if {![info exists edi]} { + set dargs(edi) false + } else { + set fargs(edi) $edi + } + if {![info exists flat]} { + set dargs(flat) off + } else { + set fargs(flat) $flat + } + if {![info exists verbose]} { + set dargs(verbose) false + } else { + set fargs(verbose) $verbose + } + if {![info exists scriptDir]} { + set dargs(script_dir) FF + } else { + set fargs(script_dir) $scriptDir + } + set dargs(rundir) [file normalize .] + if {[info exists runDir]} { + # BCL: if runDir is set, it's a flow arg + set fargs(rundir) $runDir + } + if {![info exists styleType]} { + set dargs(style) none + } else { + set fargs(style) $styleType + } + + # BCL: We are running codegen, so set fargs(codegen) to true + set fargs(codegen) true + set fargs(mode) $mode + set vars(cwd) [pwd] + + set first 0 + + # BCL: (potentially) generate a new rundir + set fargs(rundir) [file normalize [FF::gen_new_rundir $orig_argv]] + +# # If the user passed a -y and -u, move the -y (codegen dir output) to underneith the -u (rundir) +# # and message user +# if {[info exists fargs(rundir)] && $vars(rundir) ne "" && [file normalize $fargs(rundir)] ne [file normalize .]} { +# if {[info exists scriptDir]} { +# puts " NOTE: codegen output dir (-y $scriptDir) used with rundir specification of: $fargs(rundir)." +# puts " FF will move the codegen dir under the rundir: $vars(rundir)/[file tail $vars(script_dir)]" +# set fargs(script_dir) [file normalize $vars(rundir)/[file tail $vars(script_dir)]] +# set vars(script_dir) $fargs(script_dir) +# } elseif {[info exists vars(script_dir)] && $vars(script_dir) eq "FF"} { +# # vars(script_dir) is the default, so just move it +# set fargs(script_dir) [file normalize $vars(rundir)/FF] +# set vars(script_dir) $fargs(script_dir) +# } +# } else { +# # rundir is ./, so set +# if {![info exists scriptDir]} { +# set dargs(script_dir) "FF" +# set vars(script_dir) $dargs(script_dir) +# } else { +# set vars(script_dir) $scriptDir +# } +# } + # BCL: Added subst to resolve vars(rundir) +# GDG - this is done multiple times + #catch {file mkdir [subst $vars(script_dir)]} + } + + # + # Determine the steps that can be executed based upon the mode passed in + # + FF::set_steps $mode $vars(format_lines) + set user_steps [list] + if {![llength $argv]} { + # + # If there is no argument, print out the list of valid steps for the mode + # + # set step all + # puts "Valid steps are: source check all $vars(steps)" + # exit + + puts $FFMM::usage + puts " Step argument missing ... valid steps are:\n" + foreach s "$vars(steps) all" { + puts " $s" + } + exit + + } else { + + # + # Create a list of the user-specified steps. They can be in the form of + # ... + # - ... + # - + # There are, of course, additional variants. The thing is, if there is a + # dash between two steps, we want to expand the dash into the set of all + # steps between the two listed. + # + + set vars(step_arg) $argv + foreach step $argv { + set dash [string first "-" $step] + if {$dash == -1} { + lappend user_steps $step + } else { + set first_step [string range $step 0 [expr $dash - 1]] + set last_step [string range $step [expr $dash + 1] end] + if {$last_step == ""} { + set last_step [lindex $vars(steps) end] + } + + set first_index [lsearch $vars(steps) $first_step] + set last_index [lsearch $vars(steps) $last_step] + if {$first_index == -1} { + puts "Error: Unknown step $first_step for mode $mode" + exit -111 + } + if {$last_index == -1} { + puts "Error: Unknown step $last_step for mode $mode" + exit -111 + } + + set steps [lrange $vars(steps) $first_index $last_index] + set user_steps [concat $user_steps $steps] + } + } + } + + if {[info exists vars(help)] && $vars(help)} { + foreach step $user_steps { + FF::help $step + } + exit + } + + set vars(make) $user_steps + set vars(argv) $argv + + #set user_steps [FF::setup_flow $argv ] + + # + # Execute the flow for every step that the user specified. + # + if {[info exists vars(rundir)]} { + set cwd [exec pwd] + file mkdir $vars(rundir) + foreach file [list setup.tcl innovus_config.tcl lp_config.tcl rc_config.tcl] { + if {[file isfile $file]} { + file copy -force $file $vars(rundir) + } + } + cd $vars(rundir) + } + + set mode $vars(mode) + foreach step $user_steps { + if {$mode == "hier"} { set mode top_down } + switch $mode { + "user" { + if {$vars(novus)} { + FF_NOVUS::execute_flow $step $vars(format_lines) + } else { + FF_EDI::execute_flow $step $vars(format_lines) + } + } + "flat" { + if {$vars(novus)} { + FF_NOVUS::execute_flow $step $vars(format_lines) + } else { + FF_EDI::execute_flow $step $vars(format_lines) + } + } + "top_down" { + if {$vars(novus)} { + FF_NOVUS::execute_flow $step $vars(format_lines) + } else { + FF_EDI::execute_flow $step $vars(format_lines) + } + } + "bottom_up" { + if {$vars(novus)} { + FF_NOVUS::execute_flow $step $vars(format_lines) + } else { + FF_EDI::execute_flow $step $vars(format_lines) + } + } + "default" { + puts [format $FFMM::unknownMode mode] + puts $FFMM::usage + exit -111 + } + } + } + if {[info exists vars(flow_steps)]} { + unset vars(flow_steps) + } + if {[file isfile $vars(script_dir)/INNOVUS/.head]} { + if {$vars(step_arg) == "all"} { + set op [open $vars(script_dir)/INNOVUS/run_simple.tcl w] + } else { + set op [open $vars(script_dir)/INNOVUS/run_simple.$vars(step_arg).tcl w] + } + puts $op "#####################################################################" + puts $op "# SINGLE SCRIPT FLOW" + puts $op "#####################################################################" + puts $op "\nsource $vars(script_dir)/vars.tcl" + puts $op "source $vars(script_dir)/procs.tcl\n" + set ip [open $vars(script_dir)/INNOVUS/.head] + while {[gets $ip line]>=0} { + puts $op $line + } + close $ip + set ip [open $vars(script_dir)/INNOVUS/.load_[lindex $vars(bsteps) 0]] + while {[gets $ip line]>=0} { + puts $op $line + } + close $ip + foreach step $vars(bsteps) { + if {($step == "lec") || ($step == "debug")} { + continue + } + set ip [open $vars(script_dir)/INNOVUS/.$step] + while {[gets $ip line]>=0} { + puts $op $line + } + close $ip + file delete $vars(script_dir)/INNOVUS/.$step + file delete $vars(script_dir)/INNOVUS/.load_$step + } + puts $op "exit" + close $op +# file mkdir $vars(script_dir)/INNOVUS/SIMPLE +# foreach step $vars(bsteps) { +# if {($step == "lec") || ($step == "debug")} { +# continue +# } +# set op [open $vars(script_dir)/INNOVUS/SIMPLE/run_$step.tcl w] +# puts $op "#####################################################################" +# puts $op "# SIMPLE STEP SCRIPT" +# puts $op "#####################################################################" +# puts $op "\nsource $vars(script_dir)/vars.tcl" +# puts $op "source $vars(script_dir)/procs.tcl\n" +# set ip [open $vars(script_dir)/INNOVUS/.head] +# while {[gets $ip line]>=0} { +# puts $op $line +# } +# close $ip +## file delete $vars(script_dir)/INNOVUS/.head +# set ip [open $vars(script_dir)/INNOVUS/.load_$step] +# while {[gets $ip line]>=0} { +# puts $op $line +# } +# close $ip +# set ip [open $vars(script_dir)/INNOVUS/.$step] +# while {[gets $ip line]>=0} { +# puts $op $line +# } +# close $ip +# puts $op "exit" +# close $op +# file delete $vars(script_dir)/INNOVUS/.$step +# file delete $vars(script_dir)/INNOVUS/.load_$step +# } + file delete $vars(script_dir)/INNOVUS/.head + } + + # ----------- + +# if {[info exists vars(script_dir)]} { +# file delete $vars(script_dir)/INNOVUS/gen_html.tcl +# file copy [subst $vars(script_path)/INNOVUS/gen_html.tcl] [subst $vars(script_dir)/INNOVUS/gen_html.tcl] +# } + puts "-------------------------------------------------" + if {[info exists vars(plug_files)] && ($vars(plug_files) != "")} { + puts "\n Plug-ins Imported" + puts " ------------------" + foreach file $vars(plug_files) { + puts " > $file" + } + } + if {[info exists vars(plugins_defined)] && ($vars(plugins_defined) != "")} { + set plugins_defined [llength $vars(plugins_defined)] + if {$vars(verbose)} { + puts "\n Plug-ins Defined" + puts " ------------------" + foreach file [join $vars(plugins_defined)] { + puts " > $file" + } + } + } else { + set plugins_defined 0 + } + if {[info exists vars(plugins_found)] && ($vars(plugins_found) != "")} { + set plugins_found [llength $vars(plugins_found)] + if {$vars(verbose)} { + puts "\n Plug-ins Found" + puts " ------------------" + foreach file [join $vars(plugins_found)] { + puts " > $file" + } + } + } else { + set plugins_found 0 + } + if {[info exists vars(missing_plugins)] && ($vars(missing_plugins) != "")} { + set missing_plugins [llength $vars(missing_plugins)] + puts "\n Missing Plug-ins" + puts " ------------------" + foreach file [join $vars(missing_plugins)] { + puts " > $file" + } + } else { + set missing_plugins 0 + } + # puts "-------------------------------------------------" + if {[info exists vars(tagged)] && ($vars(tagged) != "")} { + puts "\n Tagged Commands" + puts " ------------------" + foreach file $vars(tagged) { + puts " > $file" + } + + set vars(missing_tags) [list] + foreach var [array names vars] { + if {[llength [split $var ","]] == 3} { + set suffix [lindex [split $var ","] 2] + if {($suffix == "pre_tcl") || ($suffix == "post_tcl") || ($suffix == "replace_tcl")} { + if {[lsearch $vars(tagged) $var] == -1} { + lappend vars(missing_tags) $var + } + } + } + } + if {[llength $vars(missing_tags)] > 0} { + puts "\n Unrecognized Tags" + puts " ------------------" + foreach tag $vars(missing_tags) { + puts " > $tag" + } + } + } + if {[info exists vars(info_count)] && ($vars(info_count) > 0)} { + puts "\n Info Summary" + puts " ---------------" + for {set i 0} {$i<$vars(info_count)} {incr i} { + puts " ([expr $i + 1]) $infos($i)" + } + } + if {[info exists vars(warning_count)] && ($vars(warning_count) > 0)} { + puts "\n Warning Summary" + puts " ---------------" + for {set i 0} {$i<$vars(warning_count)} {incr i} { + puts " ([expr $i + 1]) $warnings($i)" + } + } + if {[info exists vars(error_count)] && ($vars(error_count) > 0)} { + puts "\n Error Summary" + puts " ---------------" + for {set i 0} {$i<$vars(error_count)} {incr i} { + puts " ([expr $i + 1]) $errors($i)" + } + if {$vars(abort)} { + puts "\n" + puts "-------------------------------------------------" + puts " CODE GENERATION FAILED" + puts "-------------------------------------------------" + exit 1 + } + } + if {$vars(make) != "all"} { + if {[info exists vars(custom_steps)]} { + FF::gen_makefile $vars(custom_steps) $vars(mode) + } else { + FF::gen_makefile $vars(make) $vars(mode) + } + } + + +# if {($vars(user_mode) == "hier") && $vars(enable_flexilm)} { +# foreach part $vars(partition_list) { +# file copy $vars(partition_dir_pass2)/$part/Makefile $vars(partition_dir_pass2)/$part.Makefile +# } +# } + + puts "\n" + puts "-------------------------------------------------" + puts " CODE GENERATION COMPLETE" + puts " ... VERSION -> $vars(version)" + if {[info exists vars(rundir)]} { + puts " ... RUN DIRECTORY -> $vars(rundir)" + } + puts " ... SCRIPTS -> $vars(script_dir)" + puts " ... PLUGINS -> $plugins_defined defined, $plugins_found found" + if {[info exists vars(check_vars)] && $vars(check_vars)} { + puts " ... REPORTS -> $vars(script_dir)/check.rpt" + puts " ... -> $vars(script_dir)/check_vars.rpt" + } else { + puts " ... REPORT -> $vars(script_dir)/check.rpt" + } + if {[info exists vars(makefile_name)] && [file isfile [subst $vars(makefile_name)]]} { + puts " ... MAKEFILE -> [relPathTo [subst $vars(makefile_name)] [subst $vars(rundir)]]" + } + + puts "-------------------------------------------------" + + FF::dump_vars + + if {[info exists vars(rundir)]} { + cd $cwd + } + } + + proc dump_vars {} { + + global vars + global env + + # + # Create a procs.tcl file with ff utilities that are need by the flow + # + + if {![info exists vars(proc_file)]} { + + puts " Creating $vars(script_dir)/procs.tcl" + set save $vars(required_procs) + set of [open $vars(script_dir)/procs.tcl w] + set ff_procs "\nnamespace eval ff_procs:: {\n" + append ff_procs [get_required_procs $vars(script_path)/ETC/INNOVUS/utils.tcl] + append ff_procs [get_required_procs $vars(script_path)/ETC/utils.tcl] + set vars(required_procs) "source_plug" + append ff_procs [get_required_procs $vars(script_path)/ETC/INNOVUS/utils.tcl] +# append ff_procs " namespace export load_applet\n" + append ff_procs "}\n" + puts $of $ff_procs + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + puts $of { + # Flexmodel defaults + catch { + setPlaceDesignMode_ff -clonePlace noPostPlace ;#REMOVE after fixing CCR 974103 + set mib::FE_major_version [string range [getVersion] 0 1] + set mib::FE_minor_version [string range [getVersion] 3 4] + + #################### Default private var settings for proto flow ######################### + set trialRoutePrivate::honorPtnPinSpec 1 ;#so TR adds blockages straddling ptn boundary before routing + set trialRoutePrivate::enableFlexCell 1 ;#enable flexfiller_route_blockage for better congestion/placement correlation to full netlist. + set trialRoutePrivate::useColorMap 1 ;#enable much faster handlePartitionComplex algorithm + set trialRoutePrivate::overflowLimit 4 ;#Giving up phase 1 trialRoute prematurely when the overflow is more than 10% + + + ################### Hide setting variables in the prototyping script ####################### + setVar timing_library_support_mismatched_arcs 0 + + + ########################################################################################## + # Procedure to check for using correct prototyping kit + ######################################################################################### + proc mib::check_protokit_version {{current_kit_version ""}} { + if {[lsearch $mib::protokit_version $current_kit_version] == -1} { + Puts "*WARN* Correct prototyping kit should be used to avoid un-expected problems" + Puts " This Innovus build requires prototyping kit version [lrange $mib::protokit_version 0 4]" + } + } + + mib::check_protokit_version "EDI13.20-0" + } + } + } + set vars(required_procs) $save + + if {[info exists vars(cpf_file)]} { + puts $of "#----------------------------------------------" + puts $of "# Backwards compatibility ..." + puts $of "#----------------------------------------------" + puts $of "catch {alias ff_modify_power_domains ff_procs::modify_power_domains}" + puts $of "catch {alias ff_add_power_switches ff_procs::add_power_switches}" + puts $of "catch {alias ff_route_secondary_pg_nets ff_procs::route_secondary_pg_nets}" + puts $of "catch {alias ff_get_power_domains ff_procs::get_power_domains}" + puts $of "catch {alias ff_buffer_always_on_nets ff_procs::buffer_always_on_nets}" + puts $of "catch {alias ff_insert_welltaps_endcaps ff_procs::insert_welltaps_endcaps}" + if {$vars(novus)} { + puts $of "catch {alias FF_NOVUS::modify_power_domains ff_procs::modify_power_domains}" + puts $of "catch {alias FF_NOVUS::add_power_switches ff_procs::add_power_switches}" + puts $of "catch {alias FF_NOVUS::route_secondary_pg_nets ff_procs::route_secondary_pg_nets}" + puts $of "catch {alias FF_NOVUS::get_power_domains ff_procs::get_power_domains}" + puts $of "catch {alias FF_NOVUS::buffer_always_on_nets ff_procs::buffer_always_on_nets}" + puts $of "catch {alias FF_NOVUS::insert_welltaps_endcaps ff_procs::insert_welltaps_endcaps}" + } else { + puts $of "catch {alias FF_EDI::modify_power_domains ff_procs::modify_power_domains}" + puts $of "catch {alias FF_EDI::add_power_switches ff_procs::add_power_switches}" + puts $of "catch {alias FF_EDI::route_secondary_pg_nets ff_procs::route_secondary_pg_nets}" + puts $of "catch {alias FF_EDI::get_power_domains ff_procs::get_power_domains}" + puts $of "catch {alias FF_EDI::buffer_always_on_nets ff_procs::buffer_always_on_nets}" + puts $of "catch {alias FF_EDI::insert_welltaps_endcaps ff_procs::insert_welltaps_endcaps}" + } + } + + close $of + set vars(proc_file) 1 + } +# if {[file tail [file dirname [pwd]]] == "$vars(partition_dir)"} { +# set op [open $vars(script_dir)/vars.tcl a] +# if {$vars(user_mode) == "hier"} { +# if {[file tail [file dirname [exec pwd]]] == $vars(partition_dir)} { +# puts $op "source $vars(norm_script_path)/ETC/applet.tcl" +# #puts $op "source ../../$vars(script_path)/ETC/compatibility.tcl" +# puts $op "set_attribute applet_search_path $vars(norm_script_path)/ETC/applets /" +# } else { +# puts $op "source $vars(script_path)/ETC/applet.tcl" +# #puts $op "source ../../$vars(script_path)/ETC/compatibility.tcl" +# puts $op "set_attribute applet_search_path $vars(script_path)/ETC/applets /" +# } +# } +# puts $op "applet load measure" +# puts $op "applet load time_info" +# close $op +# return +# } + if {[file normalize $vars(rundir)] ne [file normalize .]} { + set relativizeVar 1 + } else { + set relativizeVar 0 + } +# if {$relativizeVar} { +# puts " Finalizing Foundation Flow Variables for final rundir: [relPathTo [file normalize $vars(rundir)] [file normalize .]]" +# } + + # BCL: substitute plugdirs and codegen dir with variable referencing (i.e., replace actual dir with [subst $vars(

)]) before writing vars.tcl + if {![info exists vars(ff_exe_dir)]} { + set vars(ff_exe_dir) [exec pwd] + } + + # BCL: The following are set using variables in the generated .ff.tcl, and are therefore pulled out of the generated vars.tcl + set skipVarList {ff_exe_dir rundir plug_dir rc_plug_dir lec_plug_dir script_dir flow_steps flow_steps,flat flow_steps,hier} + + # BCL: Changed to tcl file mkdir + file mkdir $vars(script_dir) +#GG + if {[info exists vars(stylus_convert)] && $vars(stylus_convert)} { + set anchor(place) "before run_place_opt" + set anchor(prects) "before run_place_opt" + set anchor(cts) "before add_clock_spec" + set anchor(postcts) "before add_clock_spec" + set anchor(postcts_hold) "before add_clock_spec" + set anchor(route) "before run_route" + set anchor(postroute) "before run_opt_postroute" + set anchor(postroute_hold) "before run_opt_postroute" + + set op [open $vars(script_dir)/flow_steps.tcl w] + foreach step [FF::adjust_steps] { + if {![info exists anchor($step)]} { + if {[info exists vars($step,commands)]} { + unset vars($step,commands) + continue + } + } + if {[info exists vars($step,commands)]} { + puts $op "create_flow_step -name pre_$step -owner cadence \{" + puts $op $vars($step,commands) + puts $op "\}" + unset vars($step,commands) + puts $of "edit_flow -append flow_step:pre_$step -[lindex $anchor($step) 0] flow_step:[lindex $anchor($step) 1]" + } + } + +# set op [open scripts/flow_config.tcl a] +# puts $op "source $vars(script_dir)/flow_steps.tcl" + close $op + + FF::create_codegen_file + set op [open codegen_create.txt a] + puts $op "codegen::template ./scripts/flow_config.template \{" + puts $op " placeholder \{<< PLACEHOLDER: PARASITIC LOAD OPTIONS >>\} \{ -all_rc_corner -rcdb rcdb/$vars(design).rcdb.d \}" + puts $op " append \{" + puts $op "create_flow_step -name write_parasitics -owner cadence \{" + puts $op " file mkdir rcdb" + puts $op " write_rc rcdb/$vars(design).rcdb.d" + puts $op "\}" + puts $op "edit_flow -after flow_step:run_opt_postroute -append flow_step:write_parasitics" + foreach file "$vars(script_dir)/flow_steps.tcl $vars(script_dir)/plug_steps.tcl" { + if {[file exists $file]} { + set ip [open $file r] + while {[gets $ip line]>=0} { + puts $op "$line" + } + close $ip + } + } + + puts $op " \}" + puts $op "\}" + close $op + } + foreach var [array names vars] { + if {[regexp ",commands$" $var]} { + unset vars($var) + } + } +# foreach step $vars(steps) { +# if {[info exists vars($step,commands)]} { +# unset vars($step,commands) +# } +# } + set op [open $vars(script_dir)/vars.tcl w] + + puts $op "# ############################################################################ #" + puts $op "# Foundation Flow Codegen Vars Record" + puts $op "# Executed on [clock format [clock seconds] -format "%I:%M:%S %p(%b%d)"] by user: [exec whoami]" + puts $op "# Copyright 2008-2012, Cadence Design Systems, Inc." + puts $op "# All Rights Reserved" + puts $op "# ############################################################################ #" + puts $op "" + puts $op "# This file contains all default (seeded) variables and user-defined variables that were resolved during code generation." + + puts $op "if {!\[info exists vars\]} {" + puts $op " global vars" + puts $op "}" + puts $op "global env" +# if {[info exists vars(user_arrays)]} { +# foreach array $vars(user_arrays) { +# puts $op "global $array" +# } +# } + + # Print variables which may be referenced by other variables + # Note: General methodology is to not use more than one variable reference (i.e., don't allow multiple variable dereferencing) + puts $op "set env(VPATH) $env(VPATH)" + puts $op "set vars(ff_exe_dir) \"$vars(ff_exe_dir)\"" + puts $op "set vars(rundir) \"$vars(rundir)\"" + puts $op "set vars(script_dir) \"$vars(script_dir)\"" + puts $op "" + +# GDG ... +# if {$relativizeVar} { +# set relativizeMesgLog "" +# # First relativize ff_exe_dir. Ignore plug variables for now (maybe this can be relaxed?) +# # All files in this first relativization task must exist. Skip anything that is located in vars(rundir). +# set relativizeMesgLog "$relativizeMesgLog [FF::remove_outer_braces \ +# [FF::relativizeFileOrDir -vardir ff_exe_dir -mustExist -skipVar script_dir -skipVar ff_exe_dir \ +# -skipVar rc_plug_dir -skipVar lec_plug_dir -skipVar plug_dir -skipVar rundir -skipDir [file normalize $vars(rundir)]]]" +# # Relativize all files in rundir. Skip variable referencing, meaning do not include $vars(rundir) in the final variable value +# set relativizeMesgLog "$relativizeMesgLog [FF::remove_outer_braces [FF::relativizeFileOrDir -vardir rundir -skipVariableUsageInReference -skipVar script_dir]]" +# # Swap out the invidiual plug dir variables +# foreach dir "rc_plug_dir lec_plug_dir plug_dir" { +# if {[info exists vars($dir)]} { +# # Relativize the plugin (syn_load_rtl goes from ./plug/GENUS/syn_load_rtl.tcl to $vars(rc_plug_dir)/syn_load_rtl.tcl) +# set relativizeMesgLog "$relativizeMesgLog [FF::remove_outer_braces \ +# [FF::relativizeFileOrDir -vardir $dir -mustExist \ +# -exactSubDirMatch [file normalize $vars($dir)]]]" +# # normalize the plug dirs +# set vars($dir) [file normalize [subst $vars($dir)]] +# } +# } +# } + # Print plugin variables + if {[info exists vars(plug_dir)]} {puts $op "set vars(plug_dir) \"$vars(plug_dir)\""} + if {[info exists vars(rc_plug_dir)]} {puts $op "set vars(rc_plug_dir) \"$vars(rc_plug_dir)\""} + if {[info exists vars(lec_plug_dir)]} {puts $op "set vars(lec_plug_dir) \"$vars(lec_plug_dir)\""} + puts $op "\n" + + # Actually print out all the other variables + if {[info exists vars(init_commands)]} {unset vars(init_commands)} + foreach var [lsort [array names vars]] { + # BCL: Only write out variable values in curlies if not using [subst ...] + if {[lsearch $skipVarList $var] == -1} { + if {[regexp {\$} $vars($var)]} { + puts $op "set vars($var) \"$vars($var)\"" + } else { + puts $op "set vars($var) \{$vars($var)\}" + } + } + } + + # Print aliases + puts $op "set vars(restore_design) {true}" + + # Load applets +# puts $op "source $vars(script_path)/ETC/applet.tcl" +# puts $op "source ../../$vars(script_path)/ETC/compatibility.tcl" +# puts $op "set_attribute applet_search_path $vars(script_path)/ETC/applets /" +# puts $op "applet load generate_report" +# puts $op "applet load measure" +# puts $op "applet load time_info" + + close $op + +# if {$relativizeVar} { +# # Write out messaging related to relativizeFileOrDir output +# set op [open $vars(script_dir)/relativize_vars.rpt w] +# puts $op "# ############################################################################ #" +# puts $op "# Foundation Flow Variable Relativization Report" +# puts $op "# Executed on [clock format [clock seconds] -format "%I:%M:%S %p(%b%d)"] by user: [exec whoami]" +# puts $op "# Copyright 2008-2012, Cadence Design Systems, Inc." +# puts $op "# All Rights Reserved" +# puts $op "# ############################################################################ #" +# foreach line $relativizeMesgLog { +# puts $op $line +# } +# close $op +# } + + } + + proc cleanup_dotfiles {} { + + global vars + + if {$vars(user_mode) != "hier"} { + return + } + + if {[info exists vars(rundir)]} { + cd $vars(rundir) + } + + foreach file [glob $vars(script_dir)/INNOVUS/.*] { + if {[file isfile $file] && (![regexp ".nfs" $file])} { + file delete $file + if {$vars(debug)} { + puts " Deleting $file ..." + } + } + } + if {[info exists vars(partition_dir)] && [info exists vars(partition_list)]} { + if {[file isdirectory $vars(partition_dir)]} { + foreach part [concat $vars(design) $vars(partition_list)] { + foreach file [glob $vars(partition_dir)/$part/$vars(script_dir)/INNOVUS/.*] { + if {[file isfile $file] && (![regexp ".nfs" $file])} { + file delete $file + if {$vars(debug)} { + puts " Deleting $file ..." + } + } + } + if {($vars(hier_flow_type) == "2pass")} { + if {[file isdirectory $vars(partition_dir_pass2)]} { + catch {set dotfiles [glob $vars(partition_dir_pass2)/$part/$vars(script_dir)/INNOVUS/.*]} + if {[info exists dotfiles]} { + foreach file [glob $vars(partition_dir_pass2)/$part/$vars(script_dir)/INNOVUS/.*] { + if {[file isfile $file] && (![regexp ".nfs" $file])} { + file delete $file + if {$vars(debug)} { + puts " Deleting $file ..." + } + } + } + } + } + } + } + } + } + } + + proc gen_flow {args} { + + global vars + + if {![info exists vars(execute_string)]} { + set vars(execute_string) "FF::gen_flow $args" + } + + # Allow re-entrance + + set var_list [list sourced bsteps warnings errors infos warning_count error_count info_count \ + plugins_defined plugins_found missing_plugins tagged missing_tags] + + if {[info exists vars(arg_list)]} { + set reset_list [concat $vars(arg_list) $var_list] + } else { + set reset_list $var_list + } + + foreach var $reset_list { + if {[info exists vars($var)]} { + unset vars($var) + } + if {[info exists dargs($var)]} { + unset vars($var) + } + if {[info exists dargs($var)]} { + unset vars($var) + } + } + + if {[info exists vars(flat)]} { + set save $vars(flat) + } + + puts "=================================================" + puts " Foundation Flow Code Generator" + puts " Version : 17.10-p003_1" + puts "=================================================" + + # Check TCL version + + FF::check_tcl_version + + # Create flow scripts + + FF::create_flow $args + + # Adjust variables so the run dir can be relocated + + FF::denormalize_rundir + + if {[info exists save]} { + set vars(flat) $save + } else { + unset vars(flat) + } + + FF::cleanup_dotfiles + + if {([info command FF::get_tool] ne "") && ([FF::get_tool] eq "edi")} { + puts " Loading $vars(script_dir)/procs.tcl ..." + uplevel #0 source $vars(script_dir)/procs.tcl + } + + if {$vars(generate_flow_steps)} { + file delete -force $vars(script_dir)/INNOVUS + if {[info exists vars(partition_dir)] && [info exists vars(partition_list)]} { + if {[file isdirectory $vars(partition_dir)]} { + foreach part [concat $vars(design) $vars(partition_list)] { + if [file isdirectory $vars(partition_dir)/$part/$vars(script_dir)/INNOVUS] { + file delete -force $vars(partition_dir)/$part/$vars(script_dir)/INNOVUS + } + } + } + } + } + + } + + proc seed_all_vars {} { + # defaults + set script_path "" + set script_dir "" + set setup_path "" + set synth_flow "" + set format_lines "" + set step "" + + # arg processing + while {[llength $args] > 0} { + set option [lindex $args 0] + set args [lreplace $args 0 0] + switch -exact -- $option { + -script_path { + set script_path [lindex $args 0] + set args [lreplace $args 0 0] + } + -script_dir { + set script_dir [lindex $args 0] + set args [lreplace $args 0 0] + } + -setup_path { + set setup_path [lindex $args 0] + set args [lreplace $args 0 0] + } + -synth_flow { + set synth_flow [lindex $args 0] + set args [lreplace $args 0 0] + } + -format_lines { + set synth_flow [lindex $args 0] + set args [lreplace $args 0 0] + } + -step { + set step [lindex $args 0] + set args [lreplace $args 0 0] + } + } + };# end while (processing args) + } + + namespace export load_applet + proc load_applet {args} { + set defAppletNS "::applet" + set defSeverity "error" + set defaultLocalInstall $::ns(applet)::localInstall + set defaultLocalServer $::ns(applet)::localServer + set reqAppletVersion "" + + switch -- [parse_options [calling_proc] {} $args \ + "-version sos required version of applet (equal or greater)" reqAppletVersion \ + "-severity sos severity (error|warning|info)" severity \ + "-namespace sos namespace to search for applet" appletNS \ + "srs name of applet" appletName] { + -2 { return } + 0 { return -code error } + } + + if {$appletNS eq ""} { + set appletNS $defAppletNS + } + + if {$severity eq ""} { + set severity $defSeverity + } + + # Check to see if the applet happened to already be loaded. If so, check + # whether there is a minimum version requirement met. If yes, skip the rest of the applet + # If the applet already does not meet the minimum version requirement, unload it (using package forget) + if {![catch {set providedVersion [package present ${appletNS}::$appletName]} errorMessage]} { + if {$reqAppletVersion ne ""} { + if {[package vcompare $providedVersion $reqAppletVersion] == -1} { + puts "load_applet INFO: applet $appletName was already loaded, but it's version ($providedVersion) did not meet the minimum required version ($reqAppletVersion)" + puts "load_applet INFO: This version of the $appletName applet will be removed and the load_applet will search for a newer version of $appletName..." + package forget ${appletNS}::$appletName + } else { + puts "load_applet INFO: Found $appletName already loaded and it's version ($providedVersion) already meets the minimum required version ($reqAppletVersion). Skipping load..." + return + } + } else { + puts "load_applet INFO: Found $appletName already loaded with version ($providedVersion). Skipping applet load..." + return + } + } + + # There is no previously loaded applet. Continue with this proc... + set FoundMinVersionPath 0 + set finalSearchPath "" + set failedPaths "" + # Because Innovus has it's own get_attribute command now, we need to set this depending on what tool we are in + if {[get_tool] eq "rc"} { + set searchPathList [get_attribute applet_search_path /] + } else { + set searchPathList [$::ns(compat)::get_attribute applet_search_path /] + } + set appletSearchPathCount [llength $searchPathList] + + set origappletSearchPathCount $appletSearchPathCount + set origSearchPath "" + # First pass: determine which applet installations meet min required version, if any + # This for loop does not load the applets, it only determines a final search path to use + # If none of the search paths contain the minimum version, and severity code is error, this proc + # will return inside this foreach loop with code error + if {$appletSearchPathCount > 1} { + puts "load_applet INFO: Checking all applet search paths for versions of $appletName" + } + foreach pathComponent $searchPathList { + incr appletSearchPathCount -1 + if {$origappletSearchPathCount > 1} { + puts -nonewline " $pathComponent ..." + } else { + puts -nonewline "load_applet INFO: Checking applet_search_path: $pathComponent ..." + } + # If the path component is replace with the applet designated search path value using "UpdateSeachPath" + if {[string match "" $pathComponent]} { + set pathComponent [$::ns(applet)::UpdateSearchPath $pathComponent] + } + lappend origSearchPath $pathComponent + if {[file isdirectory $pathComponent]} { + if {[file isfile $pathComponent/.servInfo]} { + if {[get_tool] eq "rc"} { + set sourceCommand tcl_source + } else { + set sourceCommand source + } + set errorMsg "" + array unset appInfo + if {[catch {$sourceCommand $pathComponent/.servInfo} errorMsg] || ![info exists appInfo(${appletNS}::${appletName},version)]} { + if {$errorMsg ne ""} { + puts " $errorMsg" + } else { + puts " BAD APPLET SERVER (corrupted .servInfo file)" + } + } else { + if {$reqAppletVersion eq "" } { + lappend minVersionSearchPath $pathComponent + set FoundMinVersionPath 1 + } elseif {[package vcompare $appInfo(${appletNS}::${appletName},version) $reqAppletVersion] != -1} { + lappend minVersionSearchPath $pathComponent + set FoundMinVersionPath 1 + } else { + lappend failedPaths $pathComponent + set failedPathver($pathComponent) $appInfo(${appletNS}::${appletName},version) + } + puts " Found $appInfo(${appletNS}::${appletName},version)" + } + } else { + puts " BAD APPLET INSTALL" + } + } else { + puts " NONEXISTENT APPLET SERVER" + } + };# end first foreach loop (distilling final minimum version applet_search_path + + # Second pass: attempt to load applet in each valid search_path until a successful applet load occurs + # This for loop must lead to a successful outcome (loaded applet) or an error will be issued + if {$FoundMinVersionPath} { + foreach searchPath $minVersionSearchPath { + set_attribute -quiet applet_search_path $searchPath / + if {[catch {applet load $appletName} errorMsg]} { + puts "load_applet INFO: Version check passed on applet install $appletName but applet load failed." + if {$appletSearchPathCount > 0} { + puts "load_applet: Trying next applet_search_path..." + } else { + puts "load_applet: ERROR: Failed to load applet $appletName. Please check your applet_search_path and applet installation(s)." + set_attribute -quiet applet_search_path $origSearchPath / + return -code error + } + } else { + if {[catch {set providedVersion [package present ${appletNS}::$appletName]} errorMessage]} { + puts "load_applet: ERROR: applet $appletName loaded correctly, but the applet did not correctly provide a package version. Trying next search path..." + } else { + puts "load_applet: INFO: Applet $appletName $providedVersion successfully loaded from applet installation at $pathComponent, meeting min version requirement ($reqAppletVersion)" + set_attribute -quiet applet_search_path $origSearchPath / + return + } + } + } + } else { + # Didn't find any searchy paths with minimum applet installed. + switch -exact -- $severity { + error { + puts "load_applet ERROR: Minimum applet version for applet $appletName is $reqAppletVersion, but no applet was found meeting this requirement." + } + warning { + puts "load_applet WARNING: Minimum applet version for applet $appletName is $reqAppletVersion, but no applet was found meeting this requirement." + } + info { + puts "load_applet INFO: Minimum applet version for applet $appletName is $reqAppletVersion, but no applet was found meeting this requirement." + } + } + puts "load_applet INFO: Search results:" + foreach searchPath $failedPaths { + puts " applet_search_path: $searchPath, $appletName version found: $failedPathver($searchPath)" + } + puts "load_applet INFO: Note applet search path that was set:" + puts " $origSearchPath" + switch -exact -- $severity { + error { + set_attribute -quiet applet_search_path $origSearchPath / + return -code 99 + } + } + } + set_attribute -quiet applet_search_path $origSearchPath / + } + proc generate_reports {args} { + eval [format "%s %s" generate_report $args] + } + proc runtime_info {args} { + eval [format "%s %s" time_info $args] + } + proc capture_metrics {} { + global vars + + set commands "" + append commands "measure qor -name $vars(step) $vars(html_summary)\n" + append commands "time_info -table ff_ext -stamp $vars(step)\n" + append commands "time_info -table ff_ext -report\n" + append commands "redirect $vars(time_info_rpt) {time_info -table ff_ext -report}\n" + append commands "time_info -quiet -table ff_ext -save $vars(time_info_db)\n" + + return $commands + } + + proc help {step} { + + global vars + + source $vars(script_path)/ETC/INNOVUS/mapped_vars.tcl + + if {![info exists help($step,categories)]} { + puts " ERROR: Invalid step/category ... valid options are:" + foreach cat $help(categories) { + puts " $cat" + } + return + } + + set length [string length $step] + puts " [string repeat = 110]" + puts [format " %+55s : %-42s" "variable (command)" values] +# puts " Variables affecting '$step' => variable (command) : values" +# puts " [string repeat = 110]" +# puts " [string repeat - [expr 53-($length/2)]] $step [string repeat - [expr 47-($length/2)]]" + + foreach cat $help($step,categories) { + set length [string length $cat] + puts " [string repeat - [expr 53-($length/2)]] $cat [string repeat - [expr 47-($length/2)]]" + foreach var [lsort [array names help]] { + if {[regexp $cat, $var]} { + if {$cat ne [lindex [split $var ","] 0]} { continue } + set command [lindex [split $var ","] 1] + if {[llength [split $var ","]] > 3} { + set variable [format "%s,%s" [lindex [split $var ","] 2] [lindex [split $var ","] 3]] + } else { + set variable [lindex [split $var ","] 2] + } + set values $help($var) + + if {$command != "categories"} { + puts [format " %+55s : %-42s" "$variable ($command)" $values] + } + } + } + } + puts " [string repeat = 110]" + } + + # A procedure to determine if the current flow is low power (i.e., CPF or IEEE 1801 based) + proc is_lp_flow {} { + global vars + return [expr {[info exists vars(cpf_file)] && $vars(cpf_file) != ""} || \ + {[info exists vars(ieee1801_file)] && $vars(ieee1801_file) != ""}] + } + proc adjust_steps {} { + + global vars + + set new_steps [list] + + set first 1 + + foreach step $vars(steps) { + + if {[regexp _hold $step]} { + if {([lsearch $vars(fix_hold) [regsub _hold $step ""]]<0)} { + continue + } else { + if {($vars(step) == "postcts_hold") && $vars(skip_cts)} { + continue + } + } + } + + if {($step == "prects") && $vars(place_opt_design)} { + if {!(($vars(user_mode) == "hier") && ([file tail [pwd]] == $vars(top_cell)) && $vars(enable_flexilm))} { + continue + } + } + if {($step == "cts") && $vars(skip_cts)} { + continue + } + if {($step == "postcts")} { + if {$vars(skip_cts)} { + continue + } + if {[regexp "^ccopt" [string tolower $vars(cts_engine)]]} { + if {$vars(cts_engine) != "ccopt_cts"} { + continue + } + } + } + if {($step == "postcts_hold") && $vars(postcts_setup_hold) && ($vars(cts_engine) != "ccopt_cts")} { + continue + } + if {($step == "postroute_hold") && $vars(postroute_setup_hold)} { + continue + } + lappend new_steps $step + } + + return $new_steps + } + proc create_codegen_file {} { + + global vars + + if {[info exists vars(stylus_convert)] && $vars(stylus_convert) && [info exists vars(plugins_defined)]} { + FF_NOVUS::convert_plugins + set op [open codegen_create.txt w] + puts $op "#!/grid/common/pkgs/tcltk/v8.5b3/bin/tclsh" + puts $op "source /vols/dsg_tracker/innovus/fe/src/flowkit/tests/codegen_flowkit_template_modifier.lib.tcl" + + set timing_libs $vars($vars($vars($vars(default_setup_view),delay_corner),library_set),timing) + set qrc_tech $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),qx_tech_file) + if {[info exists vars($vars($vars(default_setup_view),constraint_mode),synth_sdc)]} { + set sdc_files $vars($vars($vars(default_setup_view),constraint_mode),synth_sdc) + } else { + set sdc_files $vars($vars($vars(default_setup_view),constraint_mode),pre_cts_sdc) + } + puts $op "codegen::template ./scripts/design_config.template \{" + puts $op " placeholder \{<< PLACEHOLDER: PATH TO TIMING LIBS >>\} \{ \. \}" + puts $op " placeholder \{<< PLACEHOLDER: PATH TO LEF FILES >>\} \{ \. \}" + puts $op " placeholder \{<< PLACEHOLDER: PATH TO TECH FILES >>\} \{ \. \}" + puts $op " placeholder \{<< PLACEHOLDER: LIST OF TIMING LIBRARIES >>\} \{\{$timing_libs\}\}" + puts $op " placeholder \{<< PLACEHOLDER: LIST OF LEF FILES >>\} \{\{$vars(lef_files)\}\}" + puts $op " placeholder \{<< PLACEHOLDER: PROCESS NODE >>\} \{$vars(process)\}" + puts $op " placeholder \{<< PLACEHOLDER: QRC TECH FILE >>\} \{$qrc_tech\}" + puts $op " delete_placeholder \{<< PLACEHOLDER: pattern >>\}" + puts $op " delete \{operating_condition\}" + if {[info exists vars(syn_load_rtl_tcl)] && [file isfile $vars(syn_load_rtl_tcl)]} { +# puts $op " append_after \{- Read hdl design, Flow Step Name: read_hdl\} \{" + puts $op " append_after \{<< PLACEHOLDER: DESIGN HDL LOAD OPTIONS >>\} \{" + set ip [open $vars(syn_load_rtl_tcl) r] + while {[gets $ip line]>=0} { + puts $op " $line" + } + close $ip + puts $op " \}" + puts $op " delete_placeholder \{<< PLACEHOLDER: DESIGN HDL LOAD OPTIONS >>\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: DESIGN HDL LOAD OPTIONS >>\}" + } + puts $op " placeholder \{<< PLACEHOLDER: ELABORATION OPTIONS >>\} \{$vars(design)\}" + puts $op " placeholder \{<< PLACEHOLDER: SDC FILES >>\} \{$sdc_files\}" + puts $op " placeholder \{<< PLACEHOLDER: PHYSICAL DATA LOAD OPTIONS >>\} \{-lef \{ $vars(lef_files) \}\}" + puts $op " placeholder \{<< PLACEHOLDER: DESIGN DATA LOAD OPTIONS >>\} \{$vars(netlist)\}" + if {[info exists vars(def_files)]} { + puts $op " placeholder \{<< PLACEHOLDER: DEF LOAD OPTIONS >>\} \{$vars(def_files)\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: DEF LOAD OPTIONS >>\}" + } + if {[info exists vars(fp_file)]} { + puts $op " placeholder \{<< PLACEHOLDER: FPLAN LOAD OPTIONS >>\} \{$vars(fp_file)\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: FPLAN LOAD OPTIONS >>\}" + } + if {[info exists vars(cpf_file)]} { + puts $op " placeholder \{<< PLACEHOLDER: POWER INTENT LOAD OPTIONS >>\} \{$vars(cpf_file)\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: POWER INTENT LOAD OPTIONS >>\}" + } + puts $op " delete_placeholder \{<< PLACEHOLDER: CLOCK LEAF ROUTE RULE >>\}" + puts $op " delete_placeholder \{<< PLACEHOLDER: CLOCK TRUNK ROUTE RULE >>\}" + puts $op " delete_placeholder \{<< PLACEHOLDER: CLOCK TOP ROUTE RULE >>\}" + puts $op "\}" + puts $op "codegen::template ./scripts/genus_config.template \{" + puts $op "\}" + puts $op "codegen::template ./scripts/innovus_config.template \{" + if {[info exists vars(process)]} { + puts $op " placeholder \{<< PLACEHOLDER: PROCESS NODE >>\} \{$vars(process)\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: PROCESS NODE >>\}" + } + if {[info exists vars(flow_effort)]} { + puts $op " placeholder \{<< PLACEHOLDER: FLOW EFFORT LEVEL >>\} \{$vars(flow_effort)\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: FLOW EFFORT LEVEL >>\}" + } + if {[info exists vars(tie_cells)]} { + puts $op " placeholder \{<< PLACEHOLDER: TIEOFF BASE_CELL NAMES >>\} \{\{$vars(tie_cells)\}\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: TIEOFF BASE_CELL NAMES >>\}" + } + if {[info exists vars(cts_target_slew)]} { + puts $op " placeholder \{<< PLACEHOLDER: CLOCK TRANSITION TIME TARGET >>\} \{$vars(cts_target_slew)\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: CLOCK TRANSITION TIME TARGET >>\}" + } + if {[info exists vars(cts_target_skew)]} { + puts $op " placeholder \{<< PLACEHOLDER: CLOCK SKEW TARGET >>\} \{$vars(cts_target_skew)\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: CLOCK SKEW TARGET >>\}" + } + if {[info exists vars(cts_buffer_cells)]} { + puts $op " placeholder \{<< PLACEHOLDER: CLOCK BUFFER BASE_CELLS NAMES >>\} \{\{$vars(cts_buffer_cells)\}\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: CLOCK BUFFER BASE_CELLS NAMES >>\}" + } + if {[info exists vars(cts_inverter_cells)]} { + puts $op " placeholder \{<< PLACEHOLDER: CLOCK INVERTER BASE_CELLS NAMES >>\} \{\{$vars(cts_inverter_cells)\}\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: CLOCK INVERTER BASE_CELLS NAMES >>\}" + } + if {[info exists vars(cts_clock_gating_cells)]} { + puts $op " placeholder \{<< PLACEHOLDER: CLOCK GATING BASE_CELLS NAMES >>\} \{\{$vars(cts_clock_gating_cells)\}\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: CLOCK GATING BASE_CELLS NAMES >>\}" + } + puts $op " delete_placeholder \{<< PLACEHOLDER: ROUTE TYPE NAME FOR CLOCK LEAF NETS >>\}" + puts $op " delete_placeholder \{<< PLACEHOLDER: ROUTE TYPE NAME FOR CLOCK TRUNK NETS >>\}" + puts $op " delete_placeholder \{<< PLACEHOLDER: ROUTE TYPE NAME FOR CLOCK TOP NETS >>\}" + if {[info exists vars(filler_cells)]} { + puts $op " placeholder \{<< PLACEHOLDER: FILLER BASE_CELL NAMES >>\} \{\{$vars(filler_cells)\}\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: FILLER BASE_CELL NAMES >>\}" + } + puts $op "\}" + puts $op "codegen::template ./scripts/tempus_config.template \{" + if {[info exists vars(process)]} { + puts $op " placeholder \{<< PLACEHOLDER: PROCESS NODE >>\} \{$vars(process)\}" + } else { + puts $op " delete_placeholder \{<< PLACEHOLDER: PROCESS NODE >>\}" + } + puts $op "\}" + close $op + } + } +};# end namespace FF diff --git a/sky130_cds/pnr/SCRIPTS/GIF/blank.png b/sky130_cds/pnr/SCRIPTS/GIF/blank.png new file mode 100755 index 000000000..0e357d560 Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/blank.png differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/calc.gif b/sky130_cds/pnr/SCRIPTS/GIF/calc.gif new file mode 100755 index 000000000..0d1c6ee98 Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/calc.gif differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/calc.png b/sky130_cds/pnr/SCRIPTS/GIF/calc.png new file mode 100755 index 000000000..9f32a1fb1 Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/calc.png differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/clocks.png b/sky130_cds/pnr/SCRIPTS/GIF/clocks.png new file mode 100755 index 000000000..6e8639608 Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/clocks.png differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/density.png b/sky130_cds/pnr/SCRIPTS/GIF/density.png new file mode 100755 index 000000000..abc5b0da1 Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/density.png differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/header.png b/sky130_cds/pnr/SCRIPTS/GIF/header.png new file mode 100755 index 000000000..47434ebdc Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/header.png differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/log.gif b/sky130_cds/pnr/SCRIPTS/GIF/log.gif new file mode 100755 index 000000000..568a0997e Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/log.gif differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/log.png b/sky130_cds/pnr/SCRIPTS/GIF/log.png new file mode 100755 index 000000000..da570231c Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/log.png differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/logo.gif b/sky130_cds/pnr/SCRIPTS/GIF/logo.gif new file mode 100755 index 000000000..185baf620 Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/logo.gif differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/power.gif b/sky130_cds/pnr/SCRIPTS/GIF/power.gif new file mode 100755 index 000000000..e8f232220 Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/power.gif differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/power.png b/sky130_cds/pnr/SCRIPTS/GIF/power.png new file mode 100755 index 000000000..15f7753d3 Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/power.png differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/speed.gif b/sky130_cds/pnr/SCRIPTS/GIF/speed.gif new file mode 100755 index 000000000..c4541b9e1 Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/speed.gif differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/speed.png b/sky130_cds/pnr/SCRIPTS/GIF/speed.png new file mode 100755 index 000000000..f66311594 Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/speed.png differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/step.png b/sky130_cds/pnr/SCRIPTS/GIF/step.png new file mode 100755 index 000000000..b8d87a9b0 Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/step.png differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/summary.png b/sky130_cds/pnr/SCRIPTS/GIF/summary.png new file mode 100755 index 000000000..08717f07d Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/summary.png differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/time.gif b/sky130_cds/pnr/SCRIPTS/GIF/time.gif new file mode 100755 index 000000000..d86929d7a Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/time.gif differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/time.png b/sky130_cds/pnr/SCRIPTS/GIF/time.png new file mode 100755 index 000000000..4f8129974 Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/time.png differ diff --git a/sky130_cds/pnr/SCRIPTS/GIF/viol.gif b/sky130_cds/pnr/SCRIPTS/GIF/viol.gif new file mode 100755 index 000000000..9cab84dd3 Binary files /dev/null and b/sky130_cds/pnr/SCRIPTS/GIF/viol.gif differ diff --git a/sky130_cds/pnr/SCRIPTS/INNOVUS/procs.tcl b/sky130_cds/pnr/SCRIPTS/INNOVUS/procs.tcl new file mode 100755 index 000000000..19dd6a418 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/INNOVUS/procs.tcl @@ -0,0 +1,27843 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +package provide foundation_flow 1.0 + +namespace eval FF_NOVUS:: { + + ############################################################################### + # Procedure to seed certain flow variables to a known default value as well + # as data variables required to seed the generic configuration file + ############################################################################### + + + proc seed_variables {{force 0}} { + + global vars + global rda_defaults + global udm + global env + global infos + global warnings + global errors + global fargs + global dargs + + if {$force} { + if {[info exists vars(seed)]} { + unset vars(seed) + } + } + + if {![info exists vars(seed)]} { + + puts " Seeding variables ..." + + if {![info exists vars(warning_count)]} { + set vars(warning_count) 0 + } + if {![info exists vars(error_count)]} { + set vars(error_count) 0 + } + if {![info exists vars(info_count)]} { + set vars(info_count) 0 + } + + ############################################################################### + # Set vars(version) to "17.1.0" if not defined + ############################################################################### + if {![info exists vars(version)]} { + if {[info exists fargs(version)]} { +# puts " INFO: Variable vars(version) not defined - setting to '$fargs(version)'" + set vars(version) $fargs(version) + } else { + set vars(version) $dargs(version) + } + set vars(flow) mmmc + } else { + if {([lsearch $FF::valid_versions $vars(version)] < 0)} { + set msg "Version '$vars(version)' not supported - setting to '17.1.0'" + puts " WARNING: $msg" + append commands "# $msg\n" + set warnings($vars(warning_count)) $msg + incr vars(warning_count) + set vars(flow) mmmc + set vars(version) "17.1.0" + } else { + if {[lindex [split $vars(version) "."] 0] > 10} { + set vars(flow) mmmc + } + } + } + + if {[regexp "9.1" $vars(version)]} { + set vars(enable_ldb) FALSE + } + +# if {[lindex [split $vars(version) "."] 0] > 14} { +# set vars(novus) true +# } else { +# set vars(novus) false +# } + + if {[info exists fargs(novus)]} { + set vars(novus) $fargs(novus) + } else { + set vars(novus) $dargs(novus) + } + +# Tool should always be innovus for 15.x as encounter is going away + if {![info exists vars(make_tool)]} { + if {[lindex [split $vars(version) "."] 0] > 14} { + set vars(make_tool) innovus + } else { + set vars(make_tool) encounter + } + } + + if {[info exists vars(enable_ldb)] && $vars(enable_ldb)} { + if {[info exists vars(ran_compile)]} { + append commands [FF_NOVUS::run_compile] + } + } + + ############################################################################### + # Set vars(flow) to "mmmc" if not defined + ############################################################################### + if {![info exists vars(flow)]} { + puts " INFO: Variable vars(flow) not defined - setting to 'mmmc'" + set vars(flow) mmmc + } else { + if {([lsearch [list "default" "pr_mmmc" "mmmc"] $vars(flow)] < 0)} { + puts " WARNING: Flow type '$vars(flow)' not supported - setting to 'mmmc'" + append commands "# WARNING: Flow type '$vars(flow)' not supported - setting to 'mmmc'\n" + set warnings($vars(warning_count)) "Flow type '$vars(flow)' not supported - setting to 'mmmc'" + incr vars(warning_count) + set vars(flow) mmmc + } + } + + ############################################################################### + # Make sure all scaling factors are either set or are 1.0 ... also + # support backwards compatibility of old names + ############################################################################### + set map(pre_route_res_factor) def_res_factor + set map(pre_route_clk_res_factor) def_clk_res_factor + set map(pre_route_cap_factor) def_cap_factor + set map(pre_route_clk_cap_factor) def_clk_cap_factor + set map(post_route_res_factor) det_res_factor + set map(post_route_clk_res_factor) det_clk_res_factor + set map(post_route_cap_factor) det_cap_factor + set map(post_route_clk_cap_factor) det_clk_cap_factor + set map(post_route_xcap_factor) xcap_factor + + if {[info exists vars(view_definition_tcl)] && ![info exists vars(parsed_view_definition_tcl)]} { + if {![file exists $vars(view_definition_tcl)]} { + puts " ERROR: View definition file $vars(view_definition_tcl) does not exist ... cannot continue" + exit + } + source $vars(script_path)/ETC/INNOVUS/overlay.tcl + puts " Parsing user view definition file ..." + set rc [catch {source $vars(view_definition_tcl)}] +# puts "-------------------------------------------------" + if {$vars(novus)} { + foreach var "library_sets rc_corners delay_corners timing_conditions setup_analysis_views hold_analysis_views power_domains" { + if {[info exists vars($var)]} { + set infos($vars(info_count)) "Variable vars($var) has been set to \"$vars($var)\"" + incr vars(info_count) + } + } + } else { + foreach var "library_sets rc_corners delay_corners setup_analysis_views hold_analysis_views power_domains" { + if {[info exists vars($var)]} { + set infos($vars(info_count)) "Variable vars($var) has been set to \"$vars($var)\"" + incr vars(info_count) + } + } + } +# puts $rc +# puts "-------------------------------------------------" + set vars(parsed_view_definition_tcl) true + } + +# if {![info exists vars(view_definition_tcl)]} { + + foreach rc_corner $vars(rc_corners) { + foreach option "pre_route_res_factor pre_route_clk_res_factor \ + post_route_res_factor post_route_clk_res_factor \ + pre_route_cap_factor pre_route_clk_cap_factor \ + post_route_cap_factor post_route_clk_cap_factor \ + post_route_xcap_factor" { + if {![info exists vars($rc_corner,$option)] && [info exists vars($rc_corner,$map($option))]} { + append commands "# INFO: Variable $map($option) has been changed to $option ... please update\n" + set infos($vars(info_count)) "Variable $map($option) has been changed to $option ... please update" + incr vars(info_count) + set vars($rc_corner,$option) $vars($rc_corner,$map($option)) + } + } + } + + ############################################################################### + # The following will be used to seed the config file + ############################################################################### + + if {![FF::is_lp_flow]} { + + set max_libs [list] + set min_libs [list] + + set count 0 + + if {[info exists vars($vars($vars(default_setup_view),delay_corner),library_set)]} { + foreach lib $vars($vars($vars($vars(default_setup_view),delay_corner),library_set),timing) { + if {[lsearch $max_libs $lib] == -1} { + lappend max_libs $lib + incr count + } + } + } else { + if {[info exists vars($vars($vars(default_setup_view),delay_corner),late_library_set)]} { + foreach lib $vars($vars($vars($vars(default_setup_view),delay_corner),late_library_set),timing) { + if {[lsearch $max_libs $lib] == -1} { + lappend max_libs $lib + incr count + } + } + } + } + + if {![info exists vars(timelib,max)]} { + set vars(timelib,max) $max_libs + } + + if {[info exists vars($vars($vars(default_hold_view),delay_corner),library_set)]} { + foreach lib $vars($vars($vars($vars(default_hold_view),delay_corner),library_set),timing) { + if {[lsearch $min_libs $lib] == -1} { + lappend min_libs $lib + incr count + } + } + } else { + if {[info exists vars($vars($vars(default_hold_view),delay_corner),early_library_set)]} { + foreach lib $vars($vars($vars($vars(default_hold_view),delay_corner),early_library_set),timing) { + if {[lsearch $min_libs $lib] == -1} { + lappend min_libs $lib + incr count + } + } + } + } + + if {![info exists vars(timelib,min)]} { + set vars(timelib,min) $min_libs + } + + if {![info exists vars(timelib)]} { + set vars(timelib) "" + } + + set vars(cdb_file) "" + set vars(cdb_file,min) "" + set vars(cdb_file,max) "" + + if {[info exists vars($vars($vars(default_setup_view),delay_corner),library_set)]} { + if {[info exists vars($vars($vars($vars(default_setup_view),delay_corner),library_set),si)]} { + set vars(cdb_file,max) $vars($vars($vars($vars(default_setup_view),delay_corner),library_set),si) + } + } elseif {[info exists vars($vars($vars(default_setup_view),delay_corner),late_library_set)]} { + if {[info exists ars($vars($vars($vars(default_setup_view),delay_corner),late_library_set),si)]} { + set vars(cdb_file,max) $vars($vars($vars($vars(default_setup_view),delay_corner),late_library_set),si) + } + } else { + set vars(cdb_file,max) "" + } + if {[info exists vars($vars($vars(default_hold_view),delay_corner),library_set)]} { + if {[info exists vars($vars($vars($vars(default_hold_view),delay_corner),library_set),si)]} { + set vars(cdb_file,min) $vars($vars($vars($vars(default_hold_view),delay_corner),library_set),si) + } + } elseif {[info exists vars($vars($vars(default_hold_view),delay_corner),early_library_set)]} { + if {[info exists vars($vars($vars($vars(default_hold_view),delay_corner),early_library_set),si)]} { + set vars(cdb_file,min) $vars($vars($vars($vars(default_hold_view),delay_corner),early_library_set),si) + } + } else { + set vars(cdb_file,min) "" + } + if {[info exists vars($vars($vars(default_setup_view),constraint_mode),pre_cts_sdc)]} { + if {$vars(flow) != "mmmc"} { + set vars(timingcon_file) $vars($vars($vars(default_setup_view),constraint_mode),pre_cts_sdc) + } + set vars(pre_cts_sdc) $vars($vars($vars(default_setup_view),constraint_mode),pre_cts_sdc) + } + if {[info exists vars($vars($vars(default_setup_view),constraint_mode),pre_cts_ilm_sdc)]} { + if {$vars(flow) != "mmmc"} { + set vars(timingcon_file,full) $vars($vars($vars(default_setup_view),constraint_mode),pre_cts_ilm_sdc) + } + } + if {[info exists vars($vars($vars(default_setup_view),constraint_mode),incr_cts_sdc)]} { + set vars(incr_cts_sdc) $vars($vars($vars(default_setup_view),constraint_mode),incr_cts_sdc) + } + if {[info exists vars($vars($vars(default_setup_view),constraint_mode),post_cts_sdc)]} { + set vars(post_cts_sdc) $vars($vars($vars(default_setup_view),constraint_mode),post_cts_sdc) + } + + if {[info exists vars($vars($vars($vars(default_hold_view),delay_corner),rc_corner),cap_table)] &&\ + [info exists vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table)]} { + set vars(captbl_file) [concat \ + "-best" $vars($vars($vars($vars(default_hold_view),delay_corner),rc_corner),cap_table) \ + "-worst" $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table) \ + ] + set vars(wc_cap_table) $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table) + } else { + if {[info exists vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table)]} { + set vars(captbl_file) [concat \ + "-best" $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table) \ + "-worst" $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table) \ + ] + set vars(wc_cap_table) $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table) + } else { + set vars(captbl_file) "" + } + } + } else { + set vars(timelib) "" + set vars(cdb_file) "" + set vars(timelib,max) "" + set vars(cdb_file,max) "" + set vars(timelib,min) "" + set vars(cdb_file,min) "" + set found_max 0 + set found_min 0 + + if {[info exists vars(setup_analysis_views)] && [info exists vars(hold_analysis_views)]} { + foreach view $vars(setup_analysis_views) { + if {[info exists vars($vars($view,delay_corner),library_set)]} { + if {[info exists vars($vars($vars($view,delay_corner),library_set),timing)]} { + foreach file $vars($vars($vars($view,delay_corner),library_set),timing) { + if {[lsearch $vars(timelib,max) $file] == -1} { + lappend vars(timelib,max) $file + } + set found_max 1 + } + } else { + puts " WARNING: Variable vars($vars($vars($view,delay_corner),library_set),timing) not defined" + set warnings($vars(warning_count)) "Variable vars($vars($vars($view,delay_corner),library_set),timing) not defined" + incr vars(warning_count) + } + } else { + if {![info exists vars($vars($view,delay_corner),early_library_set)]} { + puts " WARNING: Variable vars($vars($view,delay_corner),library_set) not defined" + set warnings($vars(warning_count)) "Variable vars($vars($view,delay_corner),library_set) not defined" + incr vars(warning_count) + } + } + } + foreach view $vars(hold_analysis_views) { + if {[info exists vars($vars($view,delay_corner),library_set)]} { + if {[info exists vars($vars($vars($view,delay_corner),library_set),timing)]} { + foreach file $vars($vars($vars($view,delay_corner),library_set),timing) { + if {[lsearch $vars(timelib,min) $file] == -1} { + lappend vars(timelib,min) $file + } + set found_min 1 + } + } else { + puts " WARNING: vars($vars($vars($view,delay_corner),library_set),timing) not defined" + set warnings($vars(warning_count)) "Variable vars($vars($vars($view,delay_corner),library_set),timing) not defined" + incr vars(warning_count) + } + } else { + if {![info exists vars($vars($view,delay_corner),early_library_set)]} { + puts " WARNING: vars($vars($view,delay_corner),early_library_set) not defined" + set warnings($vars(warning_count)) "Variable vars($vars($view,delay_corner),early_library_set) not defined" + incr vars(warning_count) + } + } + } + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + set view $vars(power_analysis_view) + if {[info exists vars($vars($view,delay_corner),library_set)]} { + if {![info exists vars($vars($vars($view,delay_corner),library_set),timing)]} { + puts " WARNING: vars($vars($vars($view,delay_corner),library_set),timing) not defined" + set warnings($vars(warning_count)) "Variable vars($vars($vars($view,delay_corner),library_set),timing) not defined" + incr vars(warning_count) + } + } else { + if {![info exists vars($vars($view,delay_corner),early_library_set)]} { + puts " WARNING: vars($vars($view,delay_corner),early_library_set) not defined" + set warnings($vars(warning_count)) "Variable vars($vars($view,delay_corner),early_library_set) not defined" + incr vars(warning_count) + } + } + } + } + + if {!$found_min || !$found_max} { + append commands "# WARNING: Either setup or hold analysis views inadequately defined" + set warnings($vars(warning_count)) "Either setup or hold analysis views inadequately defined" + incr vars(warning_count) + set vars(timelib,min) "" + set vars(timelib,max) "" + foreach library_set $vars(library_sets) { + if {[info exists vars($library_set,timing)]} { + set vars(timelib) [concat $vars(timelib) $vars($library_set,timing)] + } + if {[info exists vars($library_set,si)]} { + set vars(cdb_file) [concat $vars(cdb_file) $vars($library_set,si)] + } + } + } + set vars(captbl_file) "" + set vars(timingcon_file) "" + # set vars(pre_route_res_factor) 1.0 + # set vars(post_route_res_factor) 1.0 + # set vars(pre_route_cap_factor) 1.0 + # set vars(post_route_cap_factor) 1.0 + # set vars(pre_route_clk_res_factor) 1.0 + # set vars(post_route_clk_res_factor) 1.0 + # set vars(pre_route_clk_cap_factor) 1.0 + # set vars(post_route_clk_cap_factor) 1.0 + # set vars(post_route_xcap_factor) 1.0 + # set vars(qxtech_file) "" + # set vars(qxconf_file) "" + # set vars(qxlib_file) "" + # set vars(qxlayermap_file) "" + } + + set map(qx_tech_file) qxtech_file + set map(qx_conf_file) qxconf_file + set map(qx_lib_file) qxlib_file + + foreach option "qx_tech_file qx_conf_file qx_lib_file" { + if {[info exists vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),$option)]} { + set vars($map($option)) $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),$option) + } else { + set vars($map($option)) "" + } + } + if {![info exists vars(qx_layermap_file)]} { + if {[info exists vars(qrc_layer_map)]} { + set vars(qxlayermap_file) $vars(qrc_layer_map) + } else { + set vars(qxlayermap_file) "" + } + } else { + set vars(qxlayermap_file) $vars(qx_layermap_file) + set vars(qrc_layer_map) $vars(qx_layermap_file) + } +# } + + ############################################################################### + # Backwards compatibility + ############################################################################### + if {[info exists vars(leakage_effort)] && ![info exists vars(leakage_power_effort)]} { + set vars(leakage_power_effort) $vars(leakage_effort) + } + if {[info exists vars(enable_cppr)] && (($vars(enable_cppr) == 0) || ($vars(enable_cppr) == false))} { + set vars(enable_cppr) none + } + if {[info exists vars(enable_cppr)] && (($vars(enable_cppr) == 1) || ($vars(enable_cppr) == true))} { + set vars(enable_cppr) both + } + if {[info exists vars(def_file)]} { + append commands "# WARNING: Variable def_file has been changed to def_files ... please update\n" + set warnings($vars(warning_count)) "Variable def_file has been changed to def_files ... please update" + incr vars(warning_count) + set vars(def_files) $vars(def_file) + } + + ############################################################################### + # Seed the rest of the config variables allowing user overrides ... + # Default values for all variables are in defaults.tcl + ############################################################################### + + if {![info exists vars(script_path)]} { + if {[info exists vars(script_root)]} { + set vars(script_path) $vars(script_root) + } else { + puts " ERROR: Variable vars(script_root) not defined" + exit 1 + } + } else { + if {![info exists vars(script_root)]} { + set vars(script_root) $vars(script_path) + } + } + if {![info exists vars(setup_path)]} { + set vars(setup_path) "." + } + if {[info command FFF::get_tool] ne "" && [FFF::get_tool] eq "rc"} { + tcl_source $vars(script_path)/ETC/INNOVUS/rda_defaults.tcl + } else { + source $vars(script_path)/ETC/common_defaults.tcl + source $vars(script_path)/ETC/INNOVUS/defaults.tcl + source $vars(script_path)/ETC/INNOVUS/rda_defaults.tcl + } + + if {$vars(novus)} { + FF_NOVUS::dump_novus_attributes + } + + foreach option [array names rda_defaults] { + if {![info exists vars($option)]} { + set vars($option) $rda_defaults($option) + } else { + if {$vars($option) != $rda_defaults($option)} { +# puts "# INFO: User override of $option to $vars($option)" + } + } + } + + if {![info exists vars(cpus_per_remote_host)] && [info exists vars(cpu_per_remote_host)]} { + puts " INFO: Setting 'vars(cpus_per_remote_host)' to 'vars(cpu_per_remote_host)'" + puts " INFO: ^" + puts " INFO: Please update your setup to cpus_per_remote ..." + set vars(cpus_per_remote_host) $vars(cpu_per_remote_host) + } + + if {![info exists vars(flexmodel_art_based)]} { + if {[info exists vars(flexmodel_as_ptn)] && $vars(flexmodel_as_ptn)} { + set flow_defaults(flexmodel_art_based) 1 + } + } + if {![info exists vars(high_timing_effort)]} { + set vars(high_timing_effort) $flow_defaults(high_timing_effort) + } + if {[info exists vars(clock_eco)] && ($vars(clock_eco) == "postcts")} { + set vars(clock_eco) "post_cts" + } + if {[info exists vars(clock_eco)] && ($vars(clock_eco) == "postroute")} { + set vars(clock_eco) "post_route" + } + if {[regexp "9.1" $vars(version)]} { + if {$vars(high_timing_effort)} { + if {[info exists vars(critical_range)] && ($vars(critical_range) != 1.0)} { + puts " High timing effort enabled but critical_range overridden by user settings" + } + if {[info exists vars(clock_eco)] && ($vars(clock_eco) != "post_cts")} { + puts " High timing effort enabled but clock_eco overridden by user settings" + } + if {[info exists vars(in_place_opt)] && !$vars(in_place_opt)} { + puts " High timing effort enabled but in_place_opt overridden by user settings" + } + } + } + if {[info exists vars(cts_engine)] && ([string tolower $vars(cts_engine)] == "cts")} { + set flow_defaults(update_io_latency) false +# set vars(cts,update_timing,skip) true + } + + foreach option [array names flow_defaults] { + if {![info exists vars($option)]} { + set vars($option) $flow_defaults($option) + if {$vars(high_timing_effort) && [regexp "9.1" $vars(version)]} { + set vars(in_place_opt) true + set vars(critical_range) 1.0 +# set vars(useful_skew) true + set vars(clock_eco) post_cts + } + } else { + set user($option) $vars($option) + } + } + +# if {![info exists user(ccopt_effort)] && ($vars(cts_engine) == "ccopt")} { +# set vars(ccopt_effort) low +# } + + if {![info exists flow_defaults(time_info_db)]} { + set flow_defaults(time_info_db) $flow_defaults(rpt_dir)/time_info.db + } + if {![info exists flow_defaults(time_info_full_rpt)]} { + set flow_defaults(time_info_full_rpt) $flow_defaults(rpt_dir)/time_info_full.rpt + } + if {![info exists flow_defaults(html_summary)]} { + set flow_defaults(html_summary) $flow_defaults(rpt_dir)/summary.html + } + + if {![info exists vars(enable_si_aware)]} { +# if {[regsub "nm" $vars(process) ""] <= 65} { +# set vars(enable_si_aware) true +# } else { + set vars(enable_si_aware) false +# } + } + + + if {![info exists vars(dbs_format)]} { + if {[string compare -nocase $vars(netlist_type) "verilog"]>=0} { + set vars(dbs_format) fe + } else { + set vars(dbs_format) oa + } + } + if {![info exists vars(partition_dir)]} { + set vars(partition_dir) PARTITION + } + if {![info exists vars(partition_dir_pass2)]} { + if {$vars(enable_flexilm)} { + set vars(partition_dir_pass2) $vars(partition_dir)_PRECTS + } else { + set vars(partition_dir_pass2) $vars(partition_dir)_CTS + } + } + if {$vars(user_mode) == "hier"} { + FF_NOVUS::normalize_files + if {$vars(enable_flexilm)} { +# set vars(cts,starting_dbs) "\[glob *_post_eco.enc\]" +# # DLM is a two pass flow but user doesn't need to specify it + set vars(hier_flow_type) "2pass" +# set vars(place_opt_design) false + } else { + if {$vars(hier_flow_type) == "2pass"} { + set vars(postcts,starting_dbs) . + } +# } + } + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {![info exists vars(oa_abstract_name)]} { set vars(oa_abstract_name) abstract} + if {![info exists vars(oa_layout_name)]} { set vars(oa_layout_name) layout} + if {![info exists vars(oa_design_cell)]} { set vars(oa_design_cell) $vars(design)} + if {![info exists vars(oa_design_view)]} { set vars(oa_design_view) ""} + if {![info exists vars(oa_partition_lib)]} { set vars(oa_partition_lib) OA_PTN_LIB} + } else { + if {![info exists vars(oa_abstract_name)]} { set vars(oa_abstract_name) ""} + if {![info exists vars(oa_layout_name)]} { set vars(oa_layout_name) ""} + if {![info exists vars(oa_design_cell)]} { set vars(oa_design_cell) ""} + if {![info exists vars(oa_design_view)]} { set vars(oa_design_view) ""} + if {![info exists vars(oa_design_lib)]} { set vars(oa_design_lib) ""} + } + + if {([string tolower $vars(fix_hold)] == "true") || ($vars(fix_hold) == 1)} { + set infos($vars(info_count)) "Changing vars(fix_hold) from $vars(fix_hold) to \"$flow_defaults(fix_hold)\"" + incr vars(info_count) + set vars(fix_hold) $flow_defaults(fix_hold) + } + if {([string tolower $vars(enable_ocv)] == "true") || ($vars(enable_ocv) == 1)} { + set infos($vars(info_count)) "Changing vars(enable_ocv) from \"$vars(enable_ocv)\" to \"pre_place\"" + incr vars(info_count) + set vars(enable_ocv) pre_place + } elseif {($vars(enable_ocv) == "none") || ($vars(enable_ocv) == 0)} { + set infos($vars(info_count)) "Changing vars(enable_ocv) from \"$vars(enable_ocv)\" to \"false\"" + incr vars(info_count) + set vars(enable_ocv) false + } + if {[lindex [split $vars(version) "."] 0] > 11} { + if {[string tolower $vars(enable_ocv)] == "false"} { + if {[lindex [split $vars(version) "."] 0] < 15} { + set infos($vars(info_count)) "Changing vars(enable_ocv) from \"$vars(enable_ocv)\" to \"pre_postroute\"" + incr vars(info_count) + set vars(enable_ocv) "pre_postroute" + } else { + set infos($vars(info_count)) "Changing vars(enable_ocv) from \"$vars(enable_ocv)\" to \"pre_cts\"" + incr vars(info_count) + set vars(enable_ocv) "pre_place" + } + } + } + if {([string tolower $vars(enable_ss)] == "true") || ($vars(enable_ss) == 1)} { + set infos($vars(info_count)) "Changing vars(enable_ss) from $vars(enable_ss) to \"pre_postroute\"" + incr vars(info_count) + set vars(enable_ss) pre_postroute + } elseif {($vars(enable_ss) == "none") || ($vars(enable_ss) == 0)} { + set infos($vars(info_count)) "Changing vars(enable_ss) from $vars(enable_ss) to \"false\"" + incr vars(info_count) + set vars(enable_ss) false + } + if {([string tolower $vars(metalfill)] == "none") || ([string tolower $vars(metalfill)] == "false" && $vars(metalfill) != "false") || ($vars(metalfill) == 0)} { + set infos($vars(info_count)) "Changing vars(metalfill) from $vars(metalfill) to \"false\"" + incr vars(info_count) + set vars(metalfill) false + } + if {[info exists vars(clock_eco)]} { + if {($vars(clock_eco) == "true") || ($vars(clock_eco) == 1)} { + set infos($vars(info_count)) "Changing vars(clock_eco) from $vars(clock_eco) to \"post_cts\"" + incr vars(info_count) + set vars(clock_eco) post_cts + } elseif {($vars(clock_eco) == "false") || ($vars(clock_eco) == 0)} { + set infos($vars(info_count)) "Changing vars(clock_eco) from $vars(clock_eco) to \"none\"" + incr vars(info_count) + set vars(clock_eco) none + } elseif {($vars(clock_eco) == "preroute") || ($vars(clock_eco) == "pre_route")} { + set infos($vars(info_count)) "Changing vars(clock_eco) from $vars(clock_eco) to \"post_cts\"" + incr vars(info_count) + set vars(clock_eco) post_cts + } elseif {$vars(clock_eco) == "postroute"} { + set infos($vars(info_count)) "Changing vars(clock_eco) from $vars(clock_eco) to \"post_route\"" + incr vars(info_count) + set vars(clock_eco) post_route + } + } + if {([string tolower $vars(flow_effort)] == "none") || ([string tolower $vars(flow_effort)] == "default")} { + append warnings($vars(warning_count)) "Changing vars(flow_effort) from '$vars(flow_effort)' to 'standard'" + incr vars(warning_count) + set vars(flow_effort) standard + } + if {([string tolower $vars(use_flexmodels)] == "true") || ($vars(use_flexmodels) == 1)} { + set vars(use_flexmodels) 1 + } else { + set vars(use_flexmodels) 0 + } +# if {$vars(use_flexmodels) && $vars(place_opt_design)} { +# set warnings($vars(warning_count)) "Setting vars(place_opt_design) to 'false' as vars(use_flexmodels) is true" +# incr vars(warning_count) +# set vars(place_opt_design) false +# } + if {([string tolower $vars(flexmodel_as_ptn)] == "true") || ($vars(flexmodel_as_ptn) == 1)} { + set vars(flexmodel_as_ptn) 1 + } else { + set vars(flexmodel_as_ptn) 0 + } + if {([string tolower $vars(placement_based_ptn)] == "true") || ($vars(placement_based_ptn) == 1)} { + set vars(placement_based_ptn) 1 + } else { + set vars(placement_based_ptn) 0 + } + if {([string tolower $vars(abutted_design)] == "true") || ($vars(abutted_design) == 1)} { + set vars(abutted_design) 1 + } else { + set vars(abutted_design) 0 + } + if {([string tolower $vars(insert_feedthrough)] == "true") || ($vars(insert_feedthrough) == 1)} { + set vars(insert_feedthrough) 1 + } else { + set vars(insert_feedthrough) 0 + } + if {![info exists vars(resize_shifter_and_iso_insts)] || $vars(resize_shifter_and_iso_insts) == ""} { + set vars(resize_shifter_and_iso_insts) true + } + if {![info exists vars(activity_file_format)] || $vars(activity_file_format) == ""} { + set vars(activity_file_format) TCF + } + if {![info exists vars(power_nets)]} { + if {[info exists vars(pwrnet)]} { + append commands "# INFO: Variable pwrnet has been changed to power_nets ... please update\n" + set infos($vars(info_count)) "Variable pwrnet has been changed to power_nets ... please update" + incr vars(info_count) + set vars(power_nets) $vars(pwrnet) + } else { + set vars(power_nets) "" + } + } + if {![info exists vars(ground_nets)]} { + if {[info exists vars(gndnet)]} { + append commands "# INFO: Variable gndnet has been changed to ground_nets ... please update\n" + set infos($vars(info_count)) "Variable gndnet has been changed to ground_nets ... please update" + incr vars(info_count) + set vars(ground_nets) $vars(gndnet) + } else { + set vars(ground_nets) "" + } + } + if {![info exists vars(superhosts)]} { + set vars(superhosts) 0 + } + + if {![info exists vars(superthreads)]} { + set vars(superthreads) 1 + } else { + if {($vars(threads) > 1) && ($vars(superthreads) == 1)} { + set vars(superthreads) $vars(threads) + } + } + if {![info exists vars(makefile)]} { + set vars(makefile) 1 + } + if {![info exists vars(flat)]} { + set vars(flat) none + } + if {![info exists vars(abort)]} { + set vars(abort) 0 + } + if {![info exists vars(catch_errors)]} { + set vars(catch_errors) 1 + } + if {![info exists vars(restore_design)]} { + set vars(restore_design) 1 + } + if {$vars(catch_errors)} { + if {![info exists vars(save_on_catch)]} { + set vars(save_on_catch) 1 + } + if {![info exists vars(exit_on_error)]} { + set vars(exit_on_error) 1 + } + } + if {![info exists env(VPATH)]} { + set env(VPATH) $flow_defaults(vpath) + puts " INFO: Setting env(VPATH) to $flow_defaults(vpath)" + } + if {[info exists vars(cpf_file)]} { + if {![info exists vars(cpf_timing)]} { + set vars(cpf_timing) true +# set vars(flat) true + } + } else { + set vars(cpf_timing) false + } + + if {!$vars(codegen)} { + if {[FF::is_lp_flow]} { + catch {alias ff_modify_power_domains FF_NOVUS::modify_power_domains} + catch {alias ff_add_power_switches FF_NOVUS::add_power_switches} + catch {alias ff_route_secondary_pg_nets FF_NOVUS::route_secondary_pg_nets} + catch {alias ff_get_power_domains FF_NOVUS::get_power_domains} + catch {alias ff_buffer_always_on_nets FF_NOVUS::buffer_always_on_nets} + catch {alias ff_insert_welltaps_endcaps FF_NOVUS::insert_welltaps_endcaps} + } + set flow_defaults(script_dir) "." + } + +# Remember these for step based reporting ... + set vars(orig_rpt_dir) $vars(rpt_dir) + set vars(orig_log_dir) $vars(log_dir) + set vars(orig_dbs_dir) $vars(dbs_dir) + +# Add these for get metric + if {![info exists vars(html_summary)]} { + set vars(html_summary) $vars(rpt_dir)/summary.html + } + if {![info exists vars(time_info_db)]} { + set vars(time_info_db) $vars(rpt_dir)/time_info.db + } + if {![info exists vars(time_info_rpt)]} { + set vars(time_info_rpt) $vars(rpt_dir)/time_info.rpt + } + + if {[info command FFF::get_tool] ne "" && [FFF::get_tool] eq "rc"} { + tcl_source $vars(script_path)/ETC/INNOVUS/udm.tcl + } else { + source $vars(script_path)/ETC/INNOVUS/udm.tcl + } + if {!$vars(rc) || ($vars(rc) && ![info exists vars(rc_steps)])} { + set vars(seed) 1 + } + } + +# if {![info exists vars(view_definition_tcl)]} { + FF_NOVUS::normalize_constraints +# } + + if {$vars(generate_flow_steps)} { +# set vars(skip_signoff_checks) true + FF_NOVUS::normalize_files + } + +# if {[info exists vars(view_definition_tcl)]} { +# set vars(skip_signoff_checks) false +# } + # RC Stuff ... + # ------------------------------------------------------------------------------ + if {$vars(rc)} { + if {![info exists vars(ovf_dir)]} { set vars(ovf_dir) OVF } + if {![info exists vars(lec_dir)]} { set vars(lec_dir) LEC } + if {![info exists vars(enable_rcp)]} { set vars(enable_rcp) 0 } + if {![info exists vars(enable_pam)]} { set vars(enable_pam) 0 } + set vars(syn_map,set_lib_attributes,skip) true + set vars(syn_map,set_misc_attributes,skip) true + set vars(syn_map,set_hdl_attributes,skip) true + set vars(syn_map,set_icg_attributes,skip) true + set vars(syn_map,set_dft_attributes,skip) true + set vars(syn_incr,set_opt_attributes,skip) true + + ############################################################################### + # Set netlist and def variables when RC / RCP enabled + ############################################################################### + if {$vars(enable_rcp)} { + set vars(netlist) $vars(dbs_dir)/syn_place/syn_place.v.gz +# set vars(def_files) $vars(dbs_dir)/syn_place.def.gz + } else { + set vars(netlist) $vars(dbs_dir)/syn_incr/syn_incr.v.gz +# set vars(def_files) $vars(dbs_dir)/syn_incr/syn_incr.def.gz + } + } + + if {$vars(novus)} { + #set vars(make_tool_args) "-nowin -64" + set vars(make_syn_tool_args) "-64" + set vars(generate_flow_steps) true + } else { + #set vars(make_tool_args) "-nowin -64" + set vars(make_syn_tool_args) "-64 -legacy_ui" + set vars(generate_flow_steps) true + } + + } + + ############################################################################### + # Procedure to check the flow variables defined in the setup.tcl + ############################################################################### + + proc check_setup {} { + + global vars + global tvars + global errors + global warnings + global infos + global check + + if {[info exists vars(check_setup)] && !$vars(check_setup)} { + return + } + + if {[info exists vars(warning_count)]} { + set warning_count $vars(warning_count) + } else { + set warning_count 0 + } + if {[info exists vars(error_count)]} { + set error_count $vars(error_count) + } else { + set error_count 0 + } + if {[info exists vars(info_count)]} { + set info_count $vars(info_count) + } else { + set info_count 0 + } + + if {$vars(place_opt_design) && $vars(enable_flexilm)} { + set warnings($warning_count) "Feature vars(place_opt_design) not support for top level implementation when vars(enable_flexilm) is true" + incr warning_count + } + + if {[info exists vars(power_analysis_view)]} { + if {[lsearch [concat $vars(setup_analysis_views) $vars(hold_analysis_views)] $vars(power_analysis_view)] == -1} { + append commands "# ERROR: Power analysis view $vars(power_analysis_view) is not a defined view\n" + set errors($error_count) "Power analysis view $vars(power_analysis_view) is not a defined view" + incr error_count + } + } + + set valid [list trial_ipo giga_opt proto_net_delay_model] + if {[lsearch $valid [string tolower $vars(budget_mode)]] == -1} { + append commands "# ERROR: Variable vars(budget_mode) has illegal value $vars(budget_mode)\n" + set errors($error_count) "Variable vars(budget_mode) has illegal value $vars(budget_mode)" + incr error_count + append commands "# Must be one of '$valid'\n" + } + if {[info exists vars(cts_engine)]} { + if {[string tolower $vars(cts_engine)] == "ccoptdesign"} { + set vars(cts_engine) ccopt + } + if {[string tolower $vars(cts_engine)] == "clockdesign"} { + set vars(cts_engine) cts + } + set valid [list ccopt ccopt_cts] + if {[lsearch $valid [string tolower $vars(cts_engine)]] == -1} { + append commands "# ERROR: Variable vars(cts_engine) has illegal value $vars(cts_engine)\n" + set errors($error_count) "Variable vars(cts_engine) has illegal value $vars(cts_engine)" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } + + if {[info exists vars(ccopt_integration)]} { + set valid {scripted native} + if {[lsearch $valid $vars(ccopt_integration)] == -1} { + append commands "# ERROR: Variable vars(cts_engine) has illegal value $vars(cts_engine)\n" + set errors($error_count) "Variable vars(cts_engine) has illegal value $vars(cts_engine)" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } else { + # Default to native integration + set vars(ccopt_integration) "native" + } + + if {[lindex [split $vars(version) "."] 0] > 10} { + foreach var [array names vars] { + set save_vars($var) $vars($var) + if {[info exists tvars($var)]} { + set vars($var) $tvars($var) + } + } + } + + set commands "" + + set check(files) [list] + set check(integers) [list] + + + if {![info exists vars(abort)]} { + set vars(abort) 0 + } + + if {[info exists vars(check_vars)] && $vars(check_vars)} { + source $vars(script_root)/ETC/INNOVUS/check_vars.tcl + } + + append commands "# ==============================================\n" + append commands "# Required Variables\n" + append commands "# ==============================================\n" + set count 0 + foreach required "fp_tcl_file fp_file def_files" { + # BCL: Note - This code removed as the RC Foundation Flow will set vars(def_files) when it + # isn't defined in the user's setup.tcl + #if {$vars(rc) && ![info exists vars(def_files)]} { + # set vars(def_files) $vars(dbs_dir)/$vars(design).syn_placed.def.gz + #} + if {!$vars(rc)} { + # BCL: Only check for vars(def_files) if not in RC mode + if {[info exists vars($required)] && ($vars($required) != "")} { + if {$required == "def_files"} { + set first 1 + # BCL: Added subst around vars(def_files) to resolve vars(rundir) + foreach file [subst $vars(def_files)] { + if {$first == 1} { + append commands "# INFO: $required = $file\n" + set first 0 + } else { + append commands "# INFO: $file" + } + if {!$vars(rc)} { + lappend check(files) $file + } + } + } else { + lappend check(files) $vars($required) + append commands "# INFO: $required = $vars($required)\n" + } + incr count + } + } + } + if {[info exists vars(fp_tcl_proc)]} { + append commands "# INFO: fp_tcl_proc = $vars(fp_tcl_proc)\n" + incr count + } + + if {[info exists vars(oa_fp)]} { + if {[llength $vars(oa_fp)] == 3} { + append commands "# INFO: oa_fp = $vars(oa_fp)\n" + incr count + } else { + append commands "# ERROR: OA floorplan variable (oa_fp) should be 'lib cell view'" + set errors($error_count) "OA floorplan variable (oa_fp) should be 'lib cell view'" + incr error_count + } + } else { + if {$count == 0} { + append commands "# WARNING: Neither fp_file, def_files, fp_tcl_file, fp_tcl_proc are defined\n" + set warnings($warning_count) "Either fp_file, def_files, fp_tcl_file, fp_tcl_proc should be defined" + incr warning_count + } + } + + if {[string compare -nocase $vars(netlist_type) "verilog"]>=0} { + # BCL: Note - This code removed as the RC Foundation Flow will set vars(def_netlist) when it + # isn't defined in the user's setup.tcl + #if {$vars(rc) && ![info exists vars(netlist)]} { + # set vars(netlist) $vars(dbs_dir)/$vars(design).syn_placed.v.gz + #} + if {!$vars(rc)} { + # BCL: Only check for vars(netlist) if not in RC mode + if {[info exists vars(netlist)]} { + # BCL: Added subst around vars(netlist) + foreach file [subst $vars(netlist)] { + if {!$vars(rc)} { + lappend check(files) $file + } + } + append commands "# INFO: netlist = $vars(netlist)\n" + } else { + if {($vars(netlist_type) == "Verilog")} { + append commands "# ERROR: A verilog netlist file must be defined\n" + set errors($error_count) "A verilog netlist file must be defined" + incr error_count + } + } + } + } elseif {[string compare -nocase $vars(netlist_type) "oa"]==0} { + append commands "# INFO: netlist_type = $vars(netlist_type)\n" + foreach required "oa_ref_lib oa_design_lib oa_design_cell oa_design_view" { + if {[info exists vars($required)] && ($vars($required) != "")} { + append commands "# INFO: $required = $vars($required)\n" + } else { + append commands "# ERROR: Variable $required must be defined when netlist_type is open access" + set errors($error_count) "Variable $required must be defined when netlist_type is open access" + incr error_count + } + } + } + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append commands "# INFO: dbs_format = $vars(dbs_format)\n" + foreach required "oa_ref_lib oa_design_lib oa_abstract_name oa_layout_name" { + if {[info exists vars($required)] && ($vars($required) != "")} { + append commands "# INFO: $required = $vars($required)\n" + } else { + append commands "# ERROR: Variable $required must be defined when dbs_format is open access" + set errors($error_count) "Variable $required must be defined when dbs_format is open access" + incr error_count + } + } + } + if {[info exists vars(enable_lvs)] && $vars(enable_lvs)} { + if {[string compare -nocase $vars(dbs_format) "oa"]!=0} { + append commands "# WARNING: Variable enable_lvs is only allowed when dbs_format is open access" + set warnings($warning_count) "Variable enable_lvs is only allowed when dbs_format is open access" + incr warning_count + set vars(enable_lvs) false + } + } + +# if {[info exists vars(netlist)]} { +# foreach file $vars(netlist) { +# lappend check(files) $file +# } +# } else { +# if {$vars(netlist_type) == "Verilog"} { +# append commands "# ERROR: A verilog netlist file must be defined\n" +# set errors($error_count) "A verilog netlist file must be defined" +# incr error_count +# +# } +# } + + if {[info exists vars(cts_spec)] && ($vars(cts_engine) == "ccopt")} { +# append commands "# ERROR: Variable cts_spec defined and cts_engine is set to ccopt\n" +# set errors($error_count) "Variable cts_spec defined and cts_engine is set to ccopt" +# incr error_count + append commands "# WARNING: Variable cts_spec defined and cts_engine is set to ccopt\n" + set warnings($warning_count) "Variable cts_spec defined and cts_engine is set to ccopt" + incr warning_count + foreach file $vars(cts_spec) { + lappend check(files) $file + } + } + +# if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { +# set required_list "flow process library_sets rc_corners delay_corners" +# } else { + set required_list "flow process library_sets rc_corners delay_corners setup_analysis_views \ + hold_analysis_views active_setup_views active_hold_views default_setup_view default_hold_view" +# } + + foreach required $required_list { + if {[info exists vars($required)] && ($vars($required) != "")} { + append commands "# INFO: $required = $vars($required)\n" + if {$required == "flow"} { + if {([info exists vars(partition_list)] || ($vars(ilm_list) != "")) && ($vars(flow) != "mmmc")} { + append commands "# ERROR: Flow variable vars(flow) must be \"mmmc\" when ILMs are defined\n" + set errors($error_count) "# ERROR: Flow variable vars(flow) must be \"mmmc\" when ILMs are defined" + incr error_count + } + } + } + } + +# if {![info exists vars(view_definition_tcl)]} { + append commands "# ==============================================\n" + append commands "# Library Sets\n" + append commands "# ==============================================\n" + foreach library_set $vars(library_sets) { + append commands "# INFO: $library_set:\n" + foreach required "timing" { + if {[info exists vars($library_set,$required)] && ($vars($library_set,$required) != "")} { + append commands "# INFO: $required = \n" + foreach lib $vars($library_set,$required) { + # lappend check(files) $lib + append commands "# INFO: $lib\n" + } + } else { + if {[FF::is_lp_flow]} { + append commands "# WARNING: Variable vars($library_set,$required) not defined\n" + set warnings($warning_count) "Variable vars($library_set,$required) not defined" + incr warning_count + } else { + append commands "# ERROR: Required variable vars($library_set,$required) not defined or empty\n" + set errors($error_count) "Required variable vars($library_set,$required) not defined or empty" + incr error_count + } + } + } + if {[info exists vars($library_set,aocv)]} { + foreach file $vars($library_set,aocv) { + if {![file exists $file]} { + append commands "# WARNING: AOCV table file does not exist ($file)\n" + set warnings($warning_count) "AOCV table file does not exist ($file)" + incr warning_count + } + } + } else { + if {$vars(enable_aocv)} { + append commands "# WARNING: AOCV enabled, but table not provided for $library_set\n" + set warnings($warning_count) "AOCV enabled, but table not provided for $library_set" + incr warning_count + + } + } + if {[info exists vars($library_set,socv)]} { + foreach file $vars($library_set,socv) { + if {![file exists $file]} { + append commands "# WARNING: SOCV table file does not exist ($file)\n" + set warnings($warning_count) "SOCV table file does not exist ($file)" + incr warning_count + } + } + } else { + if {$vars(enable_socv)} { + append commands "# WARNING: SOCV enabled, but table not provided for $library_set\n" + set warnings($warning_count) "SOCV enabled, but table not provided for $library_set" + incr warning_count + + } + } + if {[info exists vars($library_set,si)]} { + foreach file $vars($library_set,si) { + if {![file exists $file]} { + append commands "# WARNING: CDB file does not exist ($file)\n" + set warnings($warning_count) "CDB file does not exist ($file)" + incr warning_count + } + } + } + } +# } + + append commands "# ==============================================\n" + append commands "# LEF Files\n" + append commands "# ==============================================\n" + if {[info exists vars(lef_files)]} { + foreach file $vars(lef_files) { + # lappend check(files) $file + append commands "# INFO: $file\n" + } + } else { + if {([string tolower $vars(netlist_type)] == "verilog") && (![info exists vars(oa_ref_lib)])} { + append commands "# ERROR: Required variable vars(lef_files) not defined\n" + set errors($error_count) "Required variable vars(lef_files) not defined" + incr error_count + } + } + + if {[info exists vars(partition_list)]} { + append commands "# ==============================================\n" + append commands "# Hierarchical \n" + append commands "# ==============================================\n" + append commands "# INFO: partitions = $vars(partition_list)\n" + set cts_spec [FF::get_by_suffix vars ",cts_spec"] + if {$cts_spec != ""} { + append commands "# CTS Specs : \n" + foreach partition $cts_spec { + lappend check(files) $vars($partition,cts_spec) + append commands "# $partition -> $vars($partition,cts_spec)\n" + } + } + set latency_sdc [FF::get_by_suffix vars ",latency_sdc"] + if {$latency_sdc != ""} { + append commands "# Latency SDCs :\n" + foreach partition $latency_sdc { + lappend check(files) $vars($partition,latency_sdc) + if {[llength [split $partition ","]] == 1} { + append commands "# $partition -> $vars($partition,latency_sdc)\n" + } else { + append commands "# [lindex [split $partition ","] 0] ([lindex [split $partition ","] 1]) -> $vars($partition,latency_sdc)\n" + } + } + } + } + if {[info exists vars(enable_pac)] && $vars(enable_pac)} { + append commands "# WARNING: PAC is obsolete and will be removed in a future version. Consider using Sign-off ECO." + set warnings($warning_count) "PAC is obsolete and will be removed in a future version. Consider using Sign-off ECO." + incr warning_count + set pac_mode [FF::get_by_suffix vars ",pac_mode"] + if {$pac_mode != ""} { + set pac_list [list "read_only" "interface" "ilm" "all"] + foreach pac $pac_mode { + if {[lsearch $pac_list $vars($pac,pac_mode)] == -1} { + append commands "# ERROR: $pac pac_mode invalid value; must be one of \'$pac_list\'\n" + set errors($error_count) "$pac pac_mode invalid value; must be one of \'$pac_list\'" + incr error_count + + } + } + } + } + if {[FF::is_lp_flow]} { + append commands "# ==============================================\n" + append commands "# Low Power \n" + append commands "# ==============================================\n" + if {[info exists vars(ieee1801_file)]} { + set warnings($warning_count) "Using vars(ieee1801_file) requires the following limited access feature : mvsSupportIEEE1801" + incr warning_count + } + set num_power_intent_files 0 + foreach v {cpf_file ieee1801_file} { + if {[info exists vars($v)]} { + append commands "# INFO: $v = $vars($v)\n" + lappend check(files) $vars($v) + incr num_power_intent_files + } + } + if {$num_power_intent_files > 1} { + set errors($error_count) "vars(cpf_file) and vars(ieee1801_file) may not both be specified." + append commands "# ERROR: $errors($error_count)\n" + incr error_count + } + + if {[info exists vars(power_domains)] && ($vars(power_domains) != "")} { + append commands "# INFO: power_domains = $vars(power_domains)\n" + foreach domain $vars(power_domains) { + set print($domain) 1 + foreach optional "filler_cells tie_cells endcaps welltaps" { + if {[info exists vars($domain,$optional)] && ($vars($domain,$optional) != "")} { + if {$print($domain)} { + append commands "# INFO: $domain:\n" + set print($domain) 0 + } + append commands "# INFO: $optional = $vars($domain,$optional)\n" + } +# if {$optional == "filler_cells} { +# set process [regsub "nm" $vars(process) ""] +# if {[expr $process <= 28)] && [info exists vars(filler_cells,min_gap)]} { +# append commands "# ERROR: For process node < 28nm, variable vars(filler_cells,min_gap) is required\n" +# set errors($error_count) "For process node < 28nm, variable vars(filler_cells,min_gap) is required" +# incr error_count +# } +# } + } + } + } else { + append commands "# WARNING: Recommended variable vars(power_domains) not defined\n" + set warnings($warning_count) "Recommended variable vars(power_domains) not defined" + incr warning_count + } + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + append commands "# INFO: power_analysis_view = $vars(power_analysis_view)\n" + } else { + append commands "# WARNING: Recommended variable vars(power_analysis_view) not defined\n" + append commands "# Will default to the default setup analysis view\n" + set warnings($warning_count) "Recommended variable vars(power_analysis_view) not defined" + incr warning_count + } + } + +# if {![info exists vars(view_definition_tcl)]} { + append commands "# ==============================================\n" + append commands "# RC Corners\n" + append commands "# ==============================================\n" + set check(rc_corners) [list] + foreach rc_corner $vars(rc_corners) { + append commands "# INFO: $rc_corner:\n" + if {[info exists vars($rc_corner,cap_table)] && ($vars($rc_corner,cap_table) != "")} { + append commands "# INFO: cap_table = $vars($rc_corner,cap_table)\n" + lappend check(rc_corners) $vars($rc_corner,cap_table) + } else { + if {![info exists vars($rc_corner,qx_tech_file)]} { + append commands "# ERROR: Variable vars($rc_corner,cap_table) or vars($rc_corner,qx_tech_file) must be defined\n" + set errors($error_count) "Variable vars($rc_corner,cap_table) or vars($rc_corner,qx_tech_file) must be defined" + incr error_count + } else { + if {[lindex [split $vars(version) "."] 0] < 15} { + append commands "# INFO: Variable vars($rc_corner,cap_table) not defined\n" + set infos($info_count) "Variable vars($rc_corner,cap_table) not defined" + incr info_count + } + } + } +# if {$vars(cts_engine) != "cts"} { +# if {[info exists vars($rc_corner,atf_file)] && ($vars($rc_corner,atf_file) != "")} { +# append commands "# INFO: atf_file = $vars($rc_corner,atf_file)\n" +# lappend check(rc_corners) $vars($rc_corner,atf_file) +# } else { +# append commands "# WARNING: Recommended variable vars($rc_corner,atf_file) not defined\n" +# set warnings($warning_count) "Recommended variable vars($rc_corner,atf_file) not defined" +# incr warning_count +# } +# } + if {[info exists vars($rc_corner,T)] && ($vars($rc_corner,T) != "")} { + append commands "# INFO: temperature = $vars($rc_corner,T)\n" + set vars($rc_corner,temperature) $vars($rc_corner,T) + lappend check(integers) "$rc_corner,T" + } else { + append commands "# WARNING: Recommended variable vars($rc_corner,T) not defined\n" + set warnings($warning_count) "Recommended variable vars($rc_corner,T) not defined" + incr warning_count + } + if {[info exists vars($rc_corner,qx_tech_file)] && ($vars($rc_corner,qx_tech_file) != "")} { + append commands "# INFO: qx_tech_file = $vars($rc_corner,qx_tech_file)\n" + set vars($rc_corner,qrc_tech) $vars($rc_corner,qx_tech_file) + lappend check(rc_corners) $vars($rc_corner,qx_tech_file) + } else { + if {[info exists vars(postroute_extraction_effort)] && ($vars(postroute_extraction_effort) != "low")} { + append commands "# ERROR: qx_tech_file not defined for $rc_corner and postroute_extraction_effort is set to $vars(postroute_extraction_effort)\n" + set errors($error_count) "qx_tech_file not defined for $rc_corner and postroute_extraction_effort is set to $vars(postroute_extraction_effort)" + incr error_count + } + if {[info exists vars(signoff_extraction_effort)] && ($vars(signoff_extraction_effort) != "low")} { + append commands "# ERROR: qx_tech_file not defined for $rc_corner and signoff_extraction_effort is set to $vars(signoff_extraction_effort)\n" + set errors($error_count) "qx_tech_file not defined for $rc_corner and signoff_extraction_effort is set to $vars(signoff_extraction_effort)" + # set errors($error_count) "Required variable vars($rc_corner,cap_table) not defined" + incr error_count + } + } + } + + if {[info exists vars(opconds)]} { + append commands "# ==============================================\n" + append commands "# Operating Conditions\n" + append commands "# ==============================================\n" + foreach opcond $vars(opconds) { + append commands "# INFO: $opcond:\n" + foreach required "P V T" { + if {[info exists vars($opcond,$required)] && ($vars($opcond,$required) != "")} { + append commands "# INFO: $required = $vars($opcond,$required)\n" + } else { + append commands "# ERROR: Required variable vars($opcond,$required) not defined\n" + set errors($error_count) "Required variable vars($opcond,$required) not defined" + incr error_count + } + } + } + } + + append commands "# ==============================================\n" + append commands "# Timing Conditions\n" + append commands "# ==============================================\n" + if {[info exists vars(timing_conditions)]} { + foreach timing_condition $vars(timing_conditions) { + append commands "# INFO: $timing_condition:\n" + if {![FF::is_lp_flow]} { + if {[info exists vars($timing_condition,library_set)] && ($vars($timing_condition,library_set) != "")} { + append commands "# INFO: library_set = $vars($timing_condition,library_set)\n" + } else { + foreach additional "early_library_set late_library_set" { + if {[info exists vars($timing_condition,$additional)] && ($vars($timing_condition,$additional) != "")} { + append commands "# INFO: $additional = $vars($timing_condition,$additional)\n" + } else { + append commands "# ERROR: Required variable vars($timing_condition,library_set) and vars($timing_condition,$additional) not defined\n" + set errors($error_count) "Required variable vars($timing_condition,library_set) and vars($timing_condition,$additional) not defined\n" + incr error_count + } + } + } + } + foreach optional "opcond opcond_library early_opcond_library late_opcond_library" { + if {[info exists vars($timing_condition,$optional)] && ($vars($timing_condition,$optional) != "")} { + append commands "# INFO: $optional = $vars($timing_condition,$optional)\n" + } + } + } + } else { + foreach delay_corner $vars(delay_corners) { + append commands "# INFO: $delay_corner:\n" + if {![FF::is_lp_flow]} { + if {[info exists vars($delay_corner,library_set)] && ($vars($delay_corner,library_set) != "")} { + append commands "# INFO: library_set = $vars($delay_corner,library_set)\n" + } else { + foreach additional "early_library_set late_library_set" { + if {[info exists vars($delay_corner,$additional)] && ($vars($delay_corner,$additional) != "")} { + append commands "# INFO: $additional = $vars($delay_corner,$additional)\n" + } else { + append commands "# ERROR: Required variable vars($delay_corner,library_set) and vars($delay_corner,$additional) not defined\n" + set errors($error_count) "Required variable vars($delay_corner,library_set) and vars($delay_corner,$additional) not defined\n" + incr error_count + } + } + } + } + foreach optional "opcond opcond_library early_opcond_library late_opcond_library" { + if {[info exists vars($delay_corner,$optional)] && ($vars($delay_corner,$optional) != "")} { + append commands "# INFO: $optional = $vars($delay_corner,$optional)\n" + } + } + } + } + + append commands "# ==============================================\n" + append commands "# Delay Corners\n" + append commands "# ==============================================\n" + set good_corners [list] + foreach delay_corner $vars(delay_corners) { + set args 0 + append commands "# INFO: $delay_corner:\n" + if {[info exists vars($delay_corner,rc_corner)] && ($vars($delay_corner,rc_corner) != "")} { + append commands "# INFO: rc_corner = $vars($delay_corner,rc_corner)\n" + incr args + } else { + append commands "# ERROR: Required variable vars($delay_corner,rc_corner) not defined\n" + set errors($error_count) "Required variable vars($delay_corner,rc_corner) not defined" + incr error_count + } + + if {(![FF::is_lp_flow]) || ([FF::is_lp_flow] && !$vars(cpf_timing))} { + if {[info exists vars(timing_conditions)]} { ; # Don't require this as we can construct ... + if {[info exists vars($delay_corner,timing_condition)] && ($vars($delay_corner,timing_condition) != "")} { + append commands "# INFO: timing_condition = $vars($delay_corner,timing_condition)\n" + incr args + } else { + foreach additional "early_timing_condition late_timing_condition" { + if {[info exists vars($delay_corner,$additional)] && ($vars($delay_corner,$additional) != "")} { + append commands "# INFO: $additional = $vars($delay_corner,$additional)\n" + incr args + } else { + append commands "# ERROR: Required variable vars($delay_corner,timing_condition) and vars($delay_corner,$additional) not defined\n" + set errors($error_count) "Required variable vars($delay_corner,timing_condition) and vars($delay_corner,$additional) not defined\n" + incr error_count + } + } + } + } + } + foreach optional "power_domains" { + if {[info exists vars($delay_corner,$optional)] && ($vars($delay_corner,$optional) != "")} { + append commands "# INFO: $optional = $vars($delay_corner,$optional)\n" + } + } + if {!$vars(cpf_timing) && ($args > 1)} { + lappend good_corners $delay_corner + } else { + if {$args > 0} { + lappend good_corners $delay_corner + } + } + } + + set vars(good_corners) $good_corners + set check(constraint_modes) [list] + if {[FF::is_lp_flow]} { + append commands "# ==============================================\n" + append commands "# Constraint Modes\n" + append commands "# ==============================================\n" + if {[info exists vars(constraint_modes)]} { + foreach mode $vars(constraint_modes) { + append commands "# INFO: $mode:\n" + foreach other "pre_cts_sdc incr_cts_sdc post_cts_sdc" { + if {[info exists vars($mode,$other)] && ($vars($mode,$other) != "")} { + append commands "# INFO: $other = $vars($mode,$other)\n" + lappend check(constraint_modes) $vars($mode,$other) + } else { + if {!$vars(cpf_timing)} { + if {($other == "pre_cts_sdc") && $vars(rc)} { + set vars($mode,$other) $vars(dbs_dir)/$vars(design).syn_placed.$mode.sdc + } elseif {($other == "pre_cts_sdc") && !$vars(rc)} { + append commands "# ERROR: Variable vars($mode,$other) not defined\n" + set errors($error_count) "Variable vars($mode,$other) not defined" + incr error_count + } else { + if {($other == "pre_cts_sdc") || (($other == "post_cts_sdc") && ![info exists vars($mode,incr_cts_sdc)])} { + append commands "# INFO: Variable vars($mode,$other) not defined\n" + } + + } + } else { + append commands "# INFO: Variable vars($mode,$other) not defined\n" + } + } + } + } + } else { + append commands "# INFO: No constraint mode information defined\n" + append commands "# Post CTS latency adjustment must be\n" + append commands "# managed by the user via plug-ins\n" + } + } else { + append commands "# ==============================================\n" + append commands "# Constraint Modes\n" + append commands "# ==============================================\n" + if {$vars(rc)} { + set required_list "synth_sdc pre_cts_sdc" + } else { + set required_list "pre_cts_sdc" + } + foreach mode $vars(constraint_modes) { + set found 0 + append commands "# INFO: $mode:\n" + foreach required $required_list { + if {[info exists vars($mode,$required)] && ($vars($mode,$required) != "")} { + append commands "# INFO: $required = $vars($mode,$required)\n" + lappend check(constraint_modes) $vars($mode,$required) + incr found + } else { + if {[llength $required_list] == 1} { + append commands "# ERROR: Required variable vars($mode,$required) not defined\n" + set errors($error_count) "Required variable vars($mode,$required) not defined" + incr error_count + } + } + } + if {([llength $required_list] > 1) && ($found == 0)} { + append commands "# ERROR: One of the required variables ($required_list) not defined\n" + set errors($error_count) "One of the required variables ($required_list) not defined" + incr error_count + } + foreach other "post_cts_sdc incr_cts_sdc" { + if {$other == "post_cts_sdc" && ![info exists vars($other)]} { + if {![info exists vars($mode,$other)]} { + append commands "# INFO: Variable vars($mode,$other) not defined\n" + } else { + append commands "# INFO: $other = $vars($mode,$other)\n" + } + } else { + if {[info exists vars($mode,$other)] && ($vars($mode,$other) != "")} { + append commands "# INFO: $other = $vars($mode,$other)\n" + lappend check(constraint_modes) $vars($mode,$other) + } else { + append commands "# INFO: Variable vars($mode,$other) not defined\n" + } + } + } + } + } + + if {![info exists vars(hold_analysis_views)]} { + set vars(hold_analysis_views) "" + } + if {![info exists vars(power_analysis_view)]} { + set vars(power_analysis_view) "" + } + append commands "# ==============================================\n" + append commands "# Analysis Views\n" + append commands "# ==============================================\n" + if {[FF::is_lp_flow]} { + foreach analysis_view [concat $vars(setup_analysis_views) $vars(hold_analysis_views) $vars(power_analysis_view)] { + append commands "# INFO: $analysis_view:\n" + foreach other "delay_corner constraint_mode" { + if {[info exists vars($analysis_view,$other)] && ($vars($analysis_view,$other) != "")} { + append commands "# INFO: $other = $vars($analysis_view,$other)\n" + lappend check(analysis_view) $vars($analysis_view,$other) + } + } + } + } else { + set check(analysis_views) [list] + foreach analysis_view [concat $vars(setup_analysis_views) $vars(hold_analysis_views) $vars(power_analysis_view)] { + append commands "# INFO: $analysis_view:\n" + foreach required "delay_corner constraint_mode" { + if {[info exists vars($analysis_view,$required)] && ($vars($analysis_view,$required) != "")} { + append commands "# INFO: $required = $vars($analysis_view,$required)\n" + lappend check(analysis_view) $vars($analysis_view,$required) + } else { + append commands "# ERROR: Required variable vars($analysis_view,$required) not defined\n" + set errors($error_count) "Required variable vars($analysis_view,$required) not defined" + incr error_count + } + } + } + } +# } + + append commands "# ==============================================\n" + append commands "# Recommended Variables\n" + append commands "# ==============================================\n" + foreach recommended "scan_def gds_layer_map" { + if {[info exists vars($recommended)] && ($vars($recommended) != "")} { + lappend check(files) $vars($recommended) + append commands "# INFO: $recommended = $vars($recommended)\n" + } + } + if {[info exists vars(gds_files)] && ($vars(gds_files) != "")} { + append commands "# INFO: gds_files = $vars(gds_files)\n" + foreach file $vars(gds_files) { + lappend check(files) $file + } + } + + foreach recommended "max_route_layer filler_cells tie_cells dont_use_list antenna_diode" { + if {[info exists vars($recommended)] && ($vars($recommended) != "")} { + append commands "# INFO: $recommended = $vars($recommended)\n" + if {$recommended == "tie_cells"} { + if {[llength $vars(tie_cells)] > 2} { + append commands "# ERROR: Recommended variable vars($recommended) has more than two cells\n" + set errors($error_count) "Recommended variable vars($recommended) has more than two cells" + incr error_count + } + } + if {$recommended == "antenna_diode"} { + if {[llength $vars(antenna_diode)] > 1} { + append commands "# ERROR: Recommended variable vars($recommended) has more than one cells\n" + set errors($error_count) "Recommended variable vars($recommended) has more than one cells" + incr error_count + } + } + if {$recommended == "max_route_layer"} { + lappend check(integers) "$recommended" + } + } else { + if {($recommended == "dont_use_list")} { + if {![info exists vars(dont_use_file)]} { + append commands "# WARNING: Recommended variables dont_use_list and dont_use_file not defined\n" + set warnings($warning_count) "Recommended variables dont_use_list and dont_use_file not defined" + incr warning_count + } + } else { + append commands "# WARNING: Recommended variable vars($recommended) not defined\n" + set warnings($warning_count) "Recommended variable vars($recommended) not defined" + incr warning_count + } + } + } + foreach optional "size_only_file dont_use_file" { + if {[info exists vars($optional)]} { + lappend check(files) $vars($optional) + } + } + + append commands "# ==============================================\n" + append commands "# Other Variables\n" + append commands "# ==============================================\n" + foreach other "jtag_cells jtag_rows spare_cells" { + if {[info exists vars($other)] && ($vars($other) != "")} { + append commands "# INFO: $other = $vars($other)\n" + } else { + append commands "# INFO: Variable vars($other) not defined\n" + } + } + +# if {![info exists vars(view_definition_tcl)]} { + append commands "# ==============================================\n" + append commands "# Scale Factors\n" + append commands "# ==============================================\n" + foreach rc_corner $vars(rc_corners) { + set i 0 + append commands "# INFO: $rc_corner:\n" + if {[info exists vars($rc_corner,scale_tcl)]} { + if {[file exists $vars($rc_corner,scale_tcl)]} { + incr i + append commands "# INFO: scaling file = $vars($rc_corner,scale_tcl)\n" + } else { + puts " ERROR: Scaling file $vars($rc_corner,scale_tcl) for rc corner $rc_corner defined but does not exist" + set errors($error_count) "Scaling file $vars($rc_corner,scale_tcl) for rc corner $rc_corner defined but does not exist" + incr error_count + } + } else { + foreach other "pre_route_res_factor post_route_res_factor \ + pre_route_cap_factor post_route_cap_factor \ + pre_route_clk_res_factor post_route_clk_res_factor \ + pre_route_clk_cap_factor post_route_clk_cap_factor \ + post_route_xcap_factor" { + if {[info exists vars($rc_corner,$other)]} { + append commands "# INFO: $other = $vars($rc_corner,$other)\n" + incr i + } + } + } + if {$i == 0} { + append commands "# WARNING: No scale factors set for rc corner ($rc_corner)\n" + set warnings($warning_count) "No scale factors set for rc corner ($rc_corner)" + incr warning_count + } + } + + append commands "# ==============================================\n" + append commands "# Derating Factors\n" + append commands "# ==============================================\n" + set i 0 + if {[info exists vars(derate_tcl)]} { + append commands "# INFO: derate file = $vars(derate_tcl)\n" + lappend check(files) $vars(derate_tcl) + incr i + } else { + foreach delay_corner $vars(delay_corners) { + append commands "# INFO: $delay_corner:\n" + if {[info exists vars($delay_corner,derate_tcl)]} { + append commands "# INFO: derate file = $vars($delay_corner,derate_tcl)\n" + lappend check(files) $vars($delay_corner,derate_tcl) + incr i + } else { + if {[info exists vars(derate_tcl)]} { + append commands "# INFO: derate file = $vars(derate_tcl)\n" + lappend check(files) $vars(derate_tcl) + } else { + foreach other "early_data_cell early_clock_cell early_cell_check \ + late_data_cell late_clock_cell late_cell_check \ + data_cell_early clock_cell_early cell_check_early \ + data_cell_late clock_cell_late cell_check_late" { + if {[info exists vars($delay_corner,$other)]} { + append commands "# INFO: $other = $vars($delay_corner,$other)\n" + incr i + } + } + } + } + if {$i == 0} { + append commands "# WARNING: No derating factors set for delay corner ($delay_corner)\n" + set warnings($warning_count) "No derating factors set for delay corner ($delay_corner)" + incr warning_count + } + } + } +# } + if {![regexp "9.1" $vars(version)]} { + + set valid "TRUE FALSE true false auto" + + if {[info exists vars(enable_si_aware)]} { + if {[lsearch $valid $vars(enable_si_aware)] == -1} { + append commands "# ERROR: Variable vars(enable_si_aware) has illegal value\n" + set errors($error_count) "Variable vars(enable_si_aware) has illegal value" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } + } + + set valid [list true false] + foreach var "fix_hold_ignore_ios fix_hold_allow_tns_degradation" { + if {![info exists vars($var)]} { + continue + } + if {[lsearch $valid [string tolower $vars($var)]] == -1} { + append commands "# ERROR: Variable vars($var) has illegal value $vars($var)\n" + set errors($error_count) "Variable vars($var) has illegal value $vars($var)" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } + + set valid "pre_place pre_prects pre_cts pre_postcts pre_postroute pre_postroute_si pre_signoff true false" + foreach option "metalfill enable_ocv enable_ss" { + if {[info exists vars($option)]} { + if {[lsearch $valid $vars($option)] == -1} { + append commands "# ERROR: Variable vars($option) has illegal value ($vars($option))\n" + set errors($error_count) "Variable vars($option) has illegal value ($vars($option))" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } + } + + set pacs [FF::get_by_suffix vars ",pac_mode"] + set valid "read_only interface all" + + foreach pac $pacs { + if {[info exists vars(pac_mode)]} { + if {[lsearch $valid $vars(pac_mode)] == -1} { + append commands "# ERROR: Variable vars(pac_mode) has illegal value\n" + set errors($error_count) "Variable vars(pac_mode) has illegal value" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } + } + + set valid "default pessimistic" + + if {[info exists vars(si_analysis_type)]} { + if {[lsearch $valid $vars(si_analysis_type)] == -1} { + append commands "# ERROR: Variable vars(si_analysis_type) has illegal value\n" + set errors($error_count) "Variable vars(si_analysis_type) has illegal value" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } + + set valid "post_cts post_route both none" + + if {[info exists vars(clock_eco)]} { + if {[lsearch $valid $vars(clock_eco)] == -1} { + append commands "# ERROR: Variable vars(clock_eco) has illegal value\n" + set errors($error_count) "Variable vars(clock_eco) has illegal value" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } +# if {$vars(enable_flexilm)} { +# set warnings($warning_count) "Using vars(enable_flexilm) requires the following limited access feature : encFlexILM" +# incr warning_count +# if {$vars(place_opt_design)} { +# set warnings($warning_count) "Setting vars(place_opt_design) to 'false' as vars(enable_flexilm) is true" +# incr warning_count +# set vars(place_opt_design) false +# } +# } + ############################################################################### + # The rda_Input(ui_pg_connections) variable is a special case as depending + # on the value of this variable, other 'user defined' variables must be + # dynamically checked + ############################################################################### + #if {[info exists vars(pg_connections)]} { + # foreach option $vars(pg_connections) { + # if {![info exists vars($option)]} { + # append commands "# ERROR: The p/g connection definition is incomplete" + # append commands " Please add 'set vars($option) ' to your setup.tcl" + # set errors($error_count) "The p/g connection definition is incomplete; variable vars($option) is required" + # incr error_count + # } + # } + #} + + set check(plugins) [list] + if {[info exists vars(metalfill)] && ($vars(metalfill) != false)} { + set check(plugins) metalfill_tcl + } + append commands "# ==============================================\n" + append commands "# Plug-ins\n" + append commands "# ==============================================\n" + set rc_plugins "syn_init_tcl syn_load_rtl_tcl pre_syn_load_lib_tcl post_syn_load_lib_tcl \ + pre_syn_elab_tcl post_syn_elab_tcl syn_dft_setup_tcl pre_syn_gen_tcl \ + post_syn_gen_tcl pre_syn_map_tcl post_syn_map_tcl post_syn_dft_tcl \ + pre_syn_incr_tcl post_syn_incr_tcl pre_syn_place_tcl postload_syn_place_tcl \ + preexport_syn_place_tcl preannotation_syn_place_tcl post_syn_place_tcl pre_syn_exit_tcl" + set edi_plugins "always_source_tcl pre_init_tcl post_init_tcl \ + pre_place_tcl place_tcl post_place_tcl pre_cts_tcl cts_tcl post_cts_tcl \ + pre_prects_tcl post_prects_tcl pre_postcts_tcl post_postcts_tcl \ + pre_postcts_hold_tcl post_postcts_hold_tcl pre_route_tcl post_route_tcl \ + pre_postroute_tcl post_postroute_tcl pre_postroute_hold_tcl post_postroute_hold_tcl \ + pre_postroute_si_tcl post_postroute_si_tcl pre_postroute_si_hold_tcl + post_postroute_si_hold_tcl pre_signoff_tcl post_signoff_tcl \ + pre_rebudget_tcl post_rebudget_tcl pre_flexilm_tcl post_flexilm_tcl \ + pre_assemble_tcl post_assemble_tcl pre_model_gen_tcl post_model_gen_tcl \ + pre_partition_place_tcl post_partition_place_tcl pre_assemble_flex_ilm_tcl post_assemble_flexilm_tcl \ + pre_partition_tcl post_partition_tcl" + + set vars(rc_plugins) $rc_plugins + set vars(edi_plugins) $edi_plugins + + if {$vars(rc)} { + set plugin_list [join [concat $rc_plugins $edi_plugins]] + } else { + set plugin_list $edi_plugins + } + foreach plugin $plugin_list { + if {[info exists vars($plugin)] && ($vars($plugin) != "")} { + append commands "# INFO: Plug-in $plugin = $vars($plugin)\n" + lappend check(plugins) $plugin + lappend vars(plugins_defined) $plugin + } + } + if {$vars(novus) && [info exists vars(plugins_defined)]} { + FF_NOVUS::convert_plugins + } + + set dist(lsf) "queue resource args" + set dist(custom) "script" + set dist(rsh) "host_list" + set dist(local) "" + + if {[info exists vars(distribute)]} { + if {[info exists dist($vars(distribute))]} { + append commands "# ==============================================\n" + append commands "# Distribution Setup\n" + append commands "# ==============================================\n" + append commands "# INFO: Mode = $vars(distribute)\n" + foreach option $dist($vars(distribute)) { + if {![info exists vars($vars(distribute),$option)]} { + append commands "# ERROR: Required variable vars($vars(distribute),$option) not defined\n" + set errors($error_count) "Required variable vars($vars(distribute),$option) not defined" + incr error_count + } else { + append commands "# INFO: $option = $vars($vars(distribute),$option)\n" + } + } + } else { + append commands "# ERROR: Distribution mode $vars(distribute) not supported\n" + set errors($error_count) "Distribution mode $vars(distribute) not supported" + incr error_count + } + } else { + if {[info exists vars(hosts)] && ($vars(hosts) > 1)} { + append commands "#WARNING: Variable vars(hosts) > 1 but vars(distribute) not defined\n" + set warnings($warning_count) "Variable vars(hosts) > 1 but vars(distribute) not defined" + incr warning_count + } + } + + append commands "# ==============================================\n" + append commands "# Type Check\n" + append commands "# ==============================================\n" + foreach integer $check(integers) { + if {![string is integer -strict $vars($integer)]} { + append commands "# ERROR: Variables is not an integer ($integer) ...\n" + set errors($error_count) "Variables is not an integer ($integer) ..." + incr error_count + } + } + append commands "# ==============================================\n" + append commands "# File Check\n" + append commands "# ==============================================\n" + set files 0 + append commands "# INFO: Checking design files ...\n" + foreach file $check(files) { + # append commands "# INFO: $file ...\n" + if {![file exists $file]} { + append commands "# ERROR: File does not exist ($file) ...\n" + set errors($error_count) "File does not exist ($file)" + incr error_count + } else { + incr files + } + } + append commands "# INFO: ... found $files files\n" + set files 0 + append commands "# INFO: Checking LEF files ...\n" + if {[info exists vars(lef_files)]} { + foreach file $vars(lef_files) { + if {![file exists $file]} { + append commands "# ERROR: File does not exist ($file)\n" + set errors($error_count) "File does not exist ($file)" + incr error_count + } else { + incr files + } + } + append commands "# INFO: ... found ($files/[llength $vars(lef_files)]) lef files\n" + } + set files 0 + set total 0 +# if {![info exists vars(view_definition_tcl)]} { +# if {![info exists vars(cpf_file)]} { + append commands "# INFO: Checking library sets ...\n" + foreach library_set $vars(library_sets) { + if {[info exists vars(enable_ldb)] && $vars(enable_ldb)} { + set temp_list $vars($library_set,timing,orig) + } else { + set temp_list $vars($library_set,timing) + } + foreach file $temp_list { + incr total + if {![file exists $file]} { + append commands "# ERROR: File does not exist ($file)\n" +# set errors($error_count) "File does not exist ($file)" +# incr error_count + } else { + incr files + } + } + if {[info exists vars($library_set,si)]} { + foreach file $vars($library_set,si) { + incr total + if {![file exists $file]} { + append commands "# WARNING: CDB file does not exist ($file)\n" +# set warnings($warning_count) "CDB file does not exist ($file)" +# incr warning_count + } else { + incr files + } + } + } else { + if {!$vars(enable_si_aware)} { + append commands "# WARNING: CDB libraries not defined for $library_set library set\n" + set warnings($warning_count) "CDB libraries not defined for $library_set library set" + incr warning_count + } + } + } + append commands "# INFO: ... found ($files/$total) library files\n" + if {$total != $files} { + set errors($error_count) "[expr $total - $files] timing library files were not found " + incr error_count + } + set files 0 +# } + append commands "# INFO: Checking rc corners ...\n" + foreach file $check(rc_corners) { + if {![file exists $file]} { + append commands "# ERROR: File does not exist ($file)\n" + set errors($error_count) "File does not exist ($file)" + incr error_count + } else { + incr files + } + } + append commands "# INFO: ... found $files files\n" + set files 0 + append commands "# INFO: Checking constraint modes ...\n" + foreach file_list $check(constraint_modes) { + foreach file $file_list { + if {![file exists $file]} { + if {![info exists vars(cpf_file)] || ([info exists vars(cpf_file)] && !$vars(cpf_timing))} { + append commands "# ERROR: File does not exist ($file)\n" + set errors($error_count) "File does not exist ($file)" + incr error_count + } + } else { + incr files + } + } + } +# } + append commands "# INFO: ... found $files files\n" + set files 0 + append commands "# INFO: Checking plugin files ...\n" + foreach plug $check(plugins) { + set file $vars($plug) + if {![file exists $file] && ![file exists $vars(plug_dir)/$file]} { + append commands "# WARNING: File does not exist ($file) ... continuing\n" + lappend vars(missing_plugins) $plug + } else { + lappend vars(plugins_found) $plug + incr files + if {!$vars(enable_celtic_steps)} { + if {[regexp "postroute_si" $plug]} { + append warnings($warning_count) "Plug-in $plug will be skipped for siAware flow" + incr warning_count + append commands "# WARNING: Plug-in $plug will be skipped for siAware flow\n" + append commands "# To enable celtic based SI flow, use vars(enable_celtic_steps)\n" + } + } + } + } + append commands "# INFO: ... found $files files\n" + + append commands "# =====================================================\n" + append commands "# Flow Options\n" + append commands "# =====================================================\n" + if {[info exists vars(partition_list)]} { + set flow hierarchical + } else { + set flow flat + } + set valid [list none default standard express extreme] + if {[lsearch $valid [string tolower $vars(flow_effort)]] == -1} { + append commands "# ERROR: Variable vars(flow_effort) has illegal value $vars(flow_effort)\n" + set errors($error_count) "Variable vars(flow_effort) has illegal value $vars(flow_effort)" + incr error_count + append commands "# Must be one of '$valid'\n" + } + append commands "# Flow = $flow\n" + append commands "# Flavor = $vars(flow)\n" + append commands "# Effort = $vars(flow_effort)\n" + append commands "# -----------------------------------------------------\n" + append commands "# Placement Options\n" + append commands "# -----------------------------------------------------\n" + if {[info exists vars(place_opt_design)]} { + append commands "# Place Opt Design = $vars(place_opt_design)\n" + } + if {[info exists vars(in_place_opt)]} { + append commands "# In Place Opt = $vars(in_place_opt)\n" + } + if {[info exists vars(no_pre_place_opt)]} { + append commands "# No PrePlace Opt = $vars(no_pre_place_opt)\n" + } + if {[info exists vars(place_io_pins)]} { + append commands "# Place IO Pins = $vars(place_io_pins)\n" + } + if {[info exists vars(clock_gate_aware)]} { + append commands "# Clock Gate Aware = $vars(clock_gate_aware)\n" + } + if {[info exists vars(congestion_effort)]} { + if {$vars(congestion_effort) == "none"} { + unset vars(congestion_effort) + } else { + append commands "# Congestion Effort = $vars(congestion_effort)\n" + } + } + append commands "# -----------------------------------------------------\n" + append commands "# Clock Tree Options\n" + append commands "# -----------------------------------------------------\n" + append commands "# Route Clock Nets = $vars(route_clock_nets)\n" + if {[info exists vars(clock_eco)]} { + append commands "# Clock ECO = $vars(clock_eco)\n" + } + append commands "# -----------------------------------------------------\n" + append commands "# Optimization Options\n" + append commands "# -----------------------------------------------------\n" + if {[info exists vars(leakage_effort)]} { + append commands "# Leakage Effort = $vars(leakage_effort)\n" + } + if {[info exists vars(preserve_assertions)]} { + append commands "# Preserve Assertions = $vars(preserve_assertions)\n" + } + if {[info exists vars(useful_skew)]} { + append commands "# Useful Skew = $vars(useful_skew)\n" + } + if {[info exists vars(critical_range)]} { + append commands "# Critical Range = $vars(critical_range)\n" + } + if {[info exists vars(all_end_points)]} { + append commands "# All End Points = $vars(all_end_points)\n" + } + if {[info exists vars(size_only_file)]} { + append commands "# Size Only File = $vars(size_only_file)\n" + } + if {[info exists vars(dont_use_file)]} { + append commands "# Don't Use File = $vars(dont_use_file)\n" + } + if {[info exists vars(skew_buffers)]} { + append commands "# Skew Buffers = $vars(skew_buffers)\n" + } + if {[info exists vars(enable_pac)]} { + append commands "# Enable PAC = $vars(enable_pac)\n" + if {[info exists vars(partition_list)]} { + foreach pac $vars(partition_list) { + if {[info exists vars($pac,pac_mode)]} { + append commands "# $pac -> $vars($pac,pac_mode)\n" + } + } + } + } + append commands "# -----------------------------------------------------\n" + append commands "# Hold Fixing Options\n" + append commands "# -----------------------------------------------------\n" + append commands "# Fix Hold = $vars(fix_hold)\n" + if {[info exists vars(fix_hold_effort)]} { + append commands "# Fix Hold Effort = $vars(fix_hold_effort)\n" + } + if {[info exists vars(fix_hold_ignore_ios)]} { + append commands "# Ignore IOs = $vars(fix_hold_ignore_ios)\n" + } + if {[info exists vars(fix_hold_allow_tns_degradation)]} { + append commands "# Allow TNS Degradation = $vars(fix_hold_allow_tns_degradation)\n" + } + append commands "# -----------------------------------------------------\n" + append commands "# Timing Options\n" + append commands "# -----------------------------------------------------\n" + append commands "# Enable CPPR = $vars(enable_cppr)\n" + append commands "# Enable OCV = $vars(enable_ocv)\n" + append commands "# Enable AOCV = $vars(enable_aocv)\n" + append commands "# Enable SOCV = $vars(enable_socv)\n" + append commands "# Enable SS = $vars(enable_ss)\n" + append commands "# -----------------------------------------------------\n" + append commands "# Routing Options\n" + append commands "# -----------------------------------------------------\n" + if {[info exists vars(track_opt)]} { + append commands "# In Route Optimization = $vars(track_opt)\n" +# if {$vars(track_opt)} { +# set vars(enable_si_aware) true +# if {![info exists vars(tquantus_file)]} { +# set errors($error_count) "tQuantus file - vars(tquantus_file) - required when vars(track_opt) set to true" +# incr error_count +# } +# } + } + if {[info exists vars(multi_cut_effort)]} { + append commands "# Multi-Cut Effort = $vars(multi_cut_effort)\n" + } + if {[info exists vars(litho_driven_routing)]} { + append commands "# Litho Driven Routing = $vars(litho_driven_routing)\n" + } + if {[info exists vars(antenna_diode)] && ($vars(antenna_diode) != "")} { + append commands "# Antenna Diode = $vars(antenna_diode)\n" + } + if {[info exists vars(relative_c_thresh)] || \ + [info exists vars(total_c_thresh)] || \ + [info exists vars(coupling_c_thresh)] ||\ + [info exists vars(postroute_extraction_effort)] ||\ + [info exists vars(signoff_extraction_effort)]} { + append commands "# -----------------------------------------------------\n" + append commands "# Extraction Options\n" + append commands "# -----------------------------------------------------\n" + } + if {[info exists vars(relative_c_thresh)]} { + append commands "# Relative C Threshold = $vars(relative_c_thresh)\n" + } + if {[info exists vars(total_c_thresh)]} { + append commands "# Total C Threshold = $vars(total_c_thresh)\n" + } + if {[info exists vars(coupling_c_thresh)]} { + append commands "# Coupling C Threshold = $vars(coupling_c_thresh)\n" + } + if {[info exists vars(postroute_extraction_effort)]} { + append commands "# Postroute Effort Level = $vars(postroute_extraction_effort)\n" + } + if {[info exists vars(signoff_extraction_effort)]} { + append commands "# Signoff Effort Level = $vars(signoff_extraction_effort)\n" + } + + append commands "# -----------------------------------------------------\n" + append commands "# DFM Options\n" + append commands "# -----------------------------------------------------\n" + set check_lpa_tech 0 + set check_lpa_conf 0 + if {[info exists vars(fix_litho)] && $vars(fix_litho)} { + append commands "# Fix Litho = $vars(fix_litho)\n" + set check_lpa_conf 1 + set vars(verify_litho) true + } + if {[info exists vars(verify_litho)] && $vars(verify_litho)} { + append commands "# Verify Litho = $vars(verify_litho)\n" + set check_lpa_tech 1 + } + if {[info exists vars(lpa_tech_file)]} { + append commands "# LPA Tech File = $vars(lpa_tech_file)\n" + } + if {$check_lpa_tech} { + if {![info exists vars(lpa_tech_file)]} { + set errors($error_count) "LPA tech file not defined ..." + incr error_count + } + } + if {[info exists vars(lpa_conf_file)]} { + append commands "# LPA Conf File = $vars(lpa_conf_file)\n" + } + if {$check_lpa_conf} { + if {![info exists vars(lpa_conf_file)]} { + set errors($error_count) "LPA conf file not defined ..." + incr error_count + } + } + append commands "# -----------------------------------------------------\n" + append commands "# Signal Integrity Options\n" + append commands "# -----------------------------------------------------\n" + append commands "# Process = $vars(process)\n" + if {[info exists vars(delta_delay_threshold)]} { + append commands "# Delta Delay Threshold = $vars(delta_delay_threshold)\n" + } + if {[info exists vars(celtic_settings)]} { + append commands "# Celtic Settings = $vars(celtic_settings)\n" + } + if {[info exists vars(si_analysis_type)]} { + append commands "# Analysis Type = $vars(si_analysis_type)\n" + } + if {[info exists vars(acceptable_wns)]} { + append commands "# Analysis Type = $vars(acceptable_wns)\n" + } + + if {[info exists vars(distribute)]} { + if {[info exists dist($vars(distribute))]} { + append commands "# -----------------------------------------------------\n" + append commands "# Multiple CPUs\n" + append commands "# -----------------------------------------------------\n" + append commands "# Mode = $vars(distribute)\n" + if {[info exists vars(local_cpus)]} { + append commands "# CPUs On Local Host = $vars(local_cpus)\n" + } + if {[info exists vars(remote_hosts)]} { + append commands "# Number of Remote Hosts = $vars(remote_hosts)\n" + } + if {[info exists vars(cpus_per_remote_host)]} { + append commands "# CPUs Per Remote Host = $vars(cpus_per_remote_host)\n" + } + } + } else { + if {[info exists vars(local_cpus)]} { + append commands "# -----------------------------------------------------\n" + append commands "# Multiple CPUs\n" + append commands "# -----------------------------------------------------\n" + append commands "# CPUs On Local Host = $vars(local_cpus)\n" + } + } + if {$vars(high_timing_effort)} { + if {[lindex [split $vars(version) "."] 0] < 15} { + append commands "# -----------------------------------------------------\n" + append commands "# <<< HIGH EFFORT FLOW ENABLED >>>\n" + append commands "# -----------------------------------------------------\n" + } else { + append commands "# WARNING: Variable vars(high_timing_effort) not supported anymore. Please use vars(flow_effort).\n" + set warnings($warning_count) "Variable vars(high_timing_effort) not supported anymore. Please use vars(flow_effort)." + incr warning_count + } + } + + append commands "# =====================================================\n" + append commands "# Abort on Setup Error = $vars(abort)\n" + append commands "# =====================================================\n" + + if {[lindex [split $vars(version) "."] 0] > 10} { + foreach var [array names save_vars] { + set vars($var) $save_vars($var) + } + } + set command "" + set vars(info_count) $info_count + if {$info_count > 0} { + append command "# -----------------------------------------------------\n" + append command "# Info Summary\n" + append command "# -----------------------------------------------------\n" + + for {set i 0} {$i<$info_count} {incr i} { + append command "# ([expr $i + 1]) $infos($i)\n" + } + append command "# -----------------------------------------------------\n" + + append commands $command + } + set vars(warning_count) $warning_count + if {$warning_count > 0} { + append command "# -----------------------------------------------------\n" + append command "# Warning Summary\n" + append command "# -----------------------------------------------------\n" + + for {set i 0} {$i<$warning_count} {incr i} { + append command "# ([expr $i + 1]) $warnings($i)\n" + } + append command "# -----------------------------------------------------\n" + + append commands $command + } + set vars(error_count) $error_count + if {$error_count > 0} { + append command "# -----------------------------------------------------\n" + append command "# Error Summary\n" + append command "# -----------------------------------------------------\n" + + for {set i 0} {$i<$error_count} {incr i} { + append command "# ([expr $i + 1]) $errors($i)\n" + } + append command "# -----------------------------------------------------\n" + + append commands $command + + } else { + append commands "# SETUP CHECK PASSED\n" + append commands "# =====================================================\n" + } + + file mkdir $vars(script_dir) + set op [open $vars(script_dir)/check.rpt w] +# if {$vars(novus)} { +# FF_NOVUS::dump_novus_attributes +# } + + puts $op $commands + + close $op + + if {$vars(abort) && ($error_count > 0)} { + puts " Aborting due to previous errors ..." + puts " See $vars(script_dir)/check.rpt for details" + puts "" + puts " Error Summary" + puts " -------------" + + for {set i 0} {$i<$error_count} {incr i} { + puts " ([expr $i + 1]) $errors($i)" + } + puts "-------------------------------------------------" + exit -1 + } + + if {!$vars(codegen)} { + if {![FF::is_lp_flow]} { + return + } + set vars(required_procs) "get_clock_ports get_power_domains modify_power_domains add_power_switches \ + route_secondary_pg_nets buffer_always_on_nets insert_welltaps_endcaps" + } + + set vars(check_setup) 0 + + # Record errors for later processing + set vars(check_setup_errors) {} + for {set i 0} {$i<$error_count} {incr i} { + lappend vars(check_setup_errors) $errors($i) + } + } + + ############################################################################### + # Procedure to determine flow flavor, check for ilms, etc. + ############################################################################### + + proc check_flow {} { + + global vars + + set vars(ilm) 0 + set vars(top) 0 + + if {![info exists vars(partition_list)] || ([info exists vars(partition_list)] && \ + ([file tail [file dirname [pwd]]] != "$vars(partition_dir)"))} { + + if {![info exists vars(partition_list)]} { + set vars(flavor) flat + if {![info exists vars(mode)]} { + set vars(mode) "flat" + } + } else { + set vars(flavor) hier + if {![info exists vars(mode)]} { + set vars(mode) "top_down" + } + } + + if {[info exists vars(partition_list)] && ($vars(mode) == "bottom_up")} { + set vars(ilm) 1 + } + + if {[info exists vars(ilm_list)] && ($vars(ilm_list) != "")} { + set vars(ilm) 1 + } else { + set vars(ilm) 0 + } + + } else { + if {[info exists vars(partition_list)]} { + set ptn [file tail [pwd]] + set vars(ptn) $ptn + if {([file tail [file dirname [pwd]]] == "$vars(partition_dir)") && + ([lsearch $vars(partition_list) $ptn] == -1)} { + set vars(ilm) 1 + set vars(top) 1 +# FF_NOVUS::normalize_constraints + } + } + } + if {$vars(debug)} { + puts " Flow -> $vars(flavor) : Step -> $vars(step) : ILM -> $vars(ilm)" + } + } + + proc run_compile {} { + + global vars + + file mkdir $vars(script_dir)/INNOVUS + set op [open $vars(script_dir)/INNOVUS/run_compile.tcl w] + + set commands "" + + if {![info exists vars(ldb_dir)]} { + set vars(ldb_dir) LDB + } + file mkdir $vars(ldb_dir) + set done_list [list] + + foreach set $vars(library_sets) { + set file_list [list] + foreach file $vars($set,timing) { + if {[lsearch $done_list $file] == -1} { + append commands "write_ldb -library $file -outfile $vars(ldb_dir)/[file tail $file.ldb]\n" + lappend done_list $file + } + lappend file_list $vars(ldb_dir)/[file tail $file].ldb + } + set vars($set,timing,orig) $vars($set,timing) + set vars($set,timing) $file_list + } + + puts $op "$commands\nexit\n" + close $op + + set vars(ran_compile) 1 + } + + +# # Generate the command to verify geometry. This is verifyGeometry +# # for traditional processes, verify_drc for 20nm and below. +# proc verify_geometry_command {} { +# global vars +# set process [regsub "nm" $vars(process) ""] +# if {$process > 20} { +# return "verifyGeometry" +# } else { +# return "verify_drc" +# } +# } + + + ############################################################################### + # Procedure to initialize the foundation flow + ############################################################################### + + proc initialize_flow {} { + global vars + global env + + set commands "" + + FF_NOVUS::seed_variables 1 + FF_NOVUS::check_setup + + if {[info exist env(VPATH)]} { + file mkdir $env(VPATH) + } + + if {[info exists vars(capture_metrics)] && $vars(capture_metrics)} { + if {[lindex [split $vars(version) "."] 0] < 14} { + append commands "\n#-------------------------------------------------------------\n" + append commands "# Loading applets for metrics capture ...\n" + append commands "#-------------------------------------------------------------\n" + if {[file tail [file dirname [exec pwd]]] == $vars(partition_dir)} { + append commands "source $vars(norm_script_path)/ETC/applet.tcl\n" + append commands "source $vars(norm_script_path)/ETC/compatibility.tcl\n" + append commands "set_db applet_search_path $vars(norm_script_path)/ETC/applets\n" + } else { + append commands "source \$vars(script_path)/ETC/applet.tcl\n" + append commands "source \$vars(script_path)/ETC/compatibility.tcl\n" + append commands "set_db applet_search_path \$vars(script_path)/ETC/applets\n" + } + append commands "applet load measure\n" + append commands "applet load time_info\n" + append commands "#-------------------------------------------------------------\n\n" + append commands "if {\[file exists $vars(time_info_db)\]} {\n" + append commands " time_info -quiet -table ff_ext -load $vars(time_info_db)\n" + append commands "}\n" + append commands "#-------------------------------------------------------------\n\n" + } + } + +# append commands "#---------------------------------------------------------------------\n" +# append commands "# RUN SCRIPT FOR STEP '[string toupper $vars(step)]'\n" +# append commands "#---------------------------------------------------------------------\n" + if {$vars(report_system_info)} { + append commands "ff_procs::system_info\n" + } + append commands [FF_NOVUS::initialize_multicpu] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc load_design {step {current_step ""} {format 1}} { + + global env + global vars + global errors + global warnings + + if {[regexp syn_ $step]} { + if {[info exists vars($current_step,starting_dbs)]} { + if {[file isfile $vars($current_step,starting_dbs)]} { + set command "read_db $vars($current_step,starting_dbs) \n" + } else { + puts " Starting DBS ($vars($current_step,starting_dbs)) defined but does not exist" + set command "read_db $vars($current_step,starting_dbs) \n" + set warnings($vars(warning_count)) "Starting DBS ($vars($current_step,starting_dbs)) defined but does not exist" + incr vars(warning_count) + } + } else { + set command "read_db $vars(dbs_dir)/$step.db\n" + } + return "\n$command" + } + + if {[info exists vars(hier)]} { + set hier true + } else { + set hier false + } + + if {$current_step == ""} { + set current_step $step + } + +# if {$step ==""} { +# set step $vars(step) +# } +# if {![info exists vars(step)]} { +# set vars(step) $step +# } + if {!$vars(codegen)} { + set restore_design true + } + set design $vars(design) + + # Build restore_design command string + # ... check first for starting_dbs + # ... if not we need to know the design name as this may be a + # recursive call in a hierarhical flow + + if {[info exists vars($current_step,starting_dbs)]} { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + # Interpret the starting DBS as an OA triple + set restore_command "[list read_db -cellview $vars($current_step,starting_dbs)]\n" + } else { + if {[file isdirectory $vars($current_step,starting_dbs)]} { + set restore_command "read_db $vars($current_step,starting_dbs) \n" + } elseif {[file exists $vars($current_step,starting_dbs)]} { + set restore_command "read_db $vars($current_step,starting_dbs) \n" + } else { + puts " Starting DBS ($vars($current_step,starting_dbs)) defined but does not exist" + set restore_command "read_db $vars($current_step,starting_dbs) \n" + set warnings($vars(warning_count)) "Starting DBS ($vars($current_step,starting_dbs)) defined but does not exist" + incr vars(warning_count) + } + } + } else { + # BCL: Added subst around vars(dbs_dir) to resolve vars(rundir) + set dir [subst $vars(dbs_dir)] + # Adding this for PV ... + if {!$vars(codegen)} { + if {[file exists $dir/$step.enc]} { + # BCL: Changed "DBS" to $dir + if {![catch {set foo [glob $dir/$step.enc/*.conf]}]} { + # BCL: Changed "DBS" to $dir + regsub "\\\.conf" [glob $dir/$step.enc/*.conf] "" temp + } else { + # BCL: Changed "DBS" to $dir + if {![catch {set foo [glob $dir/$step.enc/*.globals]}]} { + # BCL: Changed "DBS" to $dir + regsub "\\\.globals" [glob $dir/$step.enc/*.globals] "" temp + } + } + if {$design != [file tail $temp]} { + set vars(design) [file tail $temp] + puts " Updating design name to $design" + if {[info exists vars(partition_list)]} { + if {[lsearch $vars(partition_list) [file tail [pwd]]] != -1} { + set design [file tail [pwd]] + } + } + } + } else { + puts " Starting DBS $dir/$step.enc defined but does not exist" + exit -1 + } + } + + # Of course, the command will depend on the database format ... and the version + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {$hier} { + set restore_command "read_db -cellview \[list $vars(oa_partition_lib) $design $step\]\n" + } else { + set restore_command "read_db -cellview \[list $vars(oa_design_lib) $design $step\]\n" + } + } else { + if {$vars(user_mode) == "hier" && ($vars(hier_flow_type) == "2pass")} { + if {$vars(step) == "cts" && $vars(enable_flexilm)} { + if {([lsearch $vars(partition_list) $vars(design)] != -1)} { + set restore_command "read_db ${design}_post_eco.enc \n" + } else { + set restore_command "read_db . \n" + } + } elseif {$vars(step) == "postcts" && !$vars(enable_flexilm)} { + set restore_command "read_db . \n" + } else { + set restore_command "read_db $dir/$step.enc \n" + } + } else { + if {$vars(step) != "partition_place"} { + set restore_command "read_db $dir/$step.enc\n" + } else { + if {$vars(use_flexmodels)} { + set restore_command "read_db $dir/$step.enc\n" + } else { + return "" + } + } + } + } + } + # Pass the command through the wrapper and then make it conditional so it can + # be disabled in a single process flow + set restore_command [FF::wrap_command $current_step,restore_design $restore_command] + set cond_restore_command "if {\$vars(restore_design)} {\n$restore_command\n}" + + if {!$format} { + if {$vars(codegen)} { +# return $cond_restore_command + return $restore_command + } else { +# eval $cond_restore_command + eval $restore_command + } + } else { + if {$vars(catch_errors)} { + append commands "\nif {\$vars(restore_design)} {\n" + append commands " if {\[catch {\n$restore_command}\]} {\n" + append commands " puts \" ERROR LOADING DATABASE FROM STEP $step ... EXITING\"\n" + append commands " exit -1\n" + append commands " }\n" + append commands "}\n" + } else { + append commands "$restore_command" + } + + if {$vars(capture_metrics)} { + if {[lindex [split $vars(version) "."] 0] > 13} { + if {$vars(step) != "debug"} { + append commands "\nenable_metrics -on\n" +# append commands "push_snapshot_stack\n" + } + } + } + + append commands [FF::source_plug always_source_tcl] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + } + + ############################################################################ + # Setup procedure for run* steps + ############################################################################ + + proc initialize_step {step} { + + global vars + global env + global errors + global warnings + + if {![info exists step]} { + set step $vars(step) + } + + if {[info exists vars($step,rpt_dir)]} { + set vars(rpt_dir) $vars($step,rpt_dir) + file mkdir $vars($step,rpt_dir) + } else { + set vars(rpt_dir) $vars(orig_rpt_dir) + } + + if {![info exists vars(warning_count)]} { + set vars(warning_count) 0 + } + if {![info exists vars(error_count)]} { + set vars(error_count) 0 + } + + set commands "" + if {$vars(verbose)} { + append commands "#\n" + append commands "# STEP $step\n" + append commands "#\n" + } + + if {![info exists vars(only_options)] || ([info exists vars(only_options)] && !$vars(only_options))} { + + set update_setup 0 + set update_hold 0 + + set command "" + if {[info exists vars($step,active_setup_views)] && ([llength $vars($step,active_setup_views)]>0)} { + append command "set setup_analysis_views \"$vars($step,active_setup_views)\"\n" + set update_setup 1 + } + if {[info exists vars($step,active_hold_views)] && ([llength $vars($step,active_hold_views)]>0)} { + append command "set hold_analysis_views \"$vars($step,active_hold_views)\"\n" + set update_hold 1 + } + + set comments "" + append comments "# The active analysis views are controlled by the following variables:\n" + append comments "#---------------------------------------------------------------------\n" + append comments "# - vars($step,active_setup_views)\n" + append comments "# - vars($step,active_hold_views)\n" + append comments "#\n" + append comments "######################################################################\n" + if {$update_setup || $update_hold} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# UPDATING ANALYSIS VIEWS ...\n" + append commands "#\n" + } + if {!$update_setup && $update_hold} { + # append command "set_analysis_view -setup \[all_setup_analysis_views\] -hold \[list \$hold_analysis_views\]\n" + append command "set_analysis_view -setup \[all_setup_analysis_views\] -hold \$hold_analysis_views\n" + } + if {$update_setup && !$update_hold} { + append command "set_analysis_view -setup \$setup_analysis_views -hold \[all_hold_analysis_views\]\n" + } + if {$update_setup && $update_hold} { + # append command "set_analysis_view -setup \[list \$setup_analysis_views\] -hold \[list \$hold_analysis_views\]\n" + append command "set_analysis_view -setup \$setup_analysis_views -hold \$hold_analysis_views\n" + } + append commands $comments + append commands "$command\n" + } else { + append comments "# set_analysis_view -setup \$vars($step,active_setup_views) -hold \$vars($step,active_hold_views)\n" + append comments "#\n" + append commands $comments + } + set process [regsub "nm" $vars(process) ""] + append comments "# - vars(process)\n" + append comments "# - vars(flow_effort)\n" + append commands "set_db design_process_node $process\n" + if {[string tolower $vars(flow_effort)] != "standard"} { + append commands "set_db design_flow_effort [string tolower $vars(flow_effort)]\n" + } + } + ######################################################################### + # Check if in top level partition (ilm) flow + ######################################################################### + + FF_NOVUS::check_flow + +# if {$vars(report_run_time)} { +# append commands "set vars($step,start_time) \[clock seconds\]\n" +# } + + ######################################################################### + # Load the recommended command mode settings for step + ######################################################################### + +# append commands "#\n" +# append commands "# DEFINING MODE SETTINGS\n" +# append commands "#\n" + + set comments "" + set ucomments "" + + switch $step { + + "place" { + ################################################################### + # Set placement options ... + # - Set optimization options if inPlaceOpt is enabled + # - Load the CTS spec for clock gate aware placement + # - Place JTAG cells if requested + ################################################################### + set args "" + if {($vars(enable_ocv) == "pre_place") || (($vars(enable_ocv) == "pre_prects") && ($vars(place_opt_design) || $vars(preroute_opt_design)))} { + append comments "# - vars(enable_ocv)\n" + append args "set_db timing_analysis_type ocv\n" + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "set_db timing_analysis_aocv true\n" + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "set_db timing_analysis_socv true\n" + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"$vars(enable_ocv)\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command prects,set_analysis_mode $command] + } + set args "" + if {![catch {set arg $vars(congestion_effort)}]} { + append args "set_db place_global_cong_effort $arg\n" + append comments "# - vars(congestion_effort)\n" + } else { + append ucomments "# - vars(congestion_effort) \"auto low medium high\"\n" + } +# if {[info exists vars(clock_gate_aware)] && $vars(clock_gate_aware)} { +# append comments "# - vars(clock_gate_aware)\n" +# append args " -place_global_clock_gate_aware true" +# } + if {![catch {set arg $vars(clock_gate_aware)}]} { + append comments "# - vars(clock_gate_aware)\n" + append args "set_db place_global_clock_gate_aware $arg\n" + } else { + append ucomments "# - vars(clock_gate_aware) \"true\"\n" + } + if {![catch {set arg $vars(place_global_place_io_pins)}]} { + append comments "# - vars(place_global_place_io_pins)\n" + append args "set_db place_global_place_io_pins $arg\n" + } else { + append ucomments "# - vars(place_global_place_io_pins) \"true\"\n" + } +# set process [regsub "nm" $vars(process) ""] +# if {[expr $process < 28] && [info exists vars(filler_cells,min_gap)]} { +# append comments "# - vars(filler_cells,min_gap)\n" +# append args " -fillerGapMinGap $vars(filler_cells,min_gap) -fillerGapEffort high\n" +# } else { +# append ucomments "# - vars(filler_cells,min_gap) \"\"\n" +# append ucomments "# - vars(filler_cells,gap_effort) \" \"\n" +# } + + if {$args != ""} { + append commands [FF::wrap_command place,set_place_mode $args] + } + set args "" + if {([info exists vars(in_place_opt)] && $vars(in_place_opt)) || $vars(place_opt_design)} { + append comments "# - vars(in_place_opt)\n" + if {[lindex [split $vars(version) "."] 0] < 16} { + if {![catch {set arg $vars(preserve_assertions)}]} { + append comments "# - vars(preserve_assertions)\n" + append args "set_db opt_preserve_pins_with_timing_constraints $arg\n" + } else { + append ucomments "# - vars(preserve_assertions) \"true\"\n" + } + } + if {![catch {set arg $vars(power_effort)}]} { + append comments "# - vars(power_effort)\n" + append args "set_db opt_power_effort $arg\n" + } else { + append ucomments "# - vars(power_effort) \"low or high\"\n" + } + if {![catch {set arg $vars(power_ratio)}]} { + append comments "# - vars(power_ratio)\n" + append args "set_db opt_leakage_to_dynamic_ratio $arg\n" + } else { + append ucomments "# - vars(power_ratio) \"0.0 to 1.0\"\n" + } +# if {![catch {set arg $vars(clock_gate_aware_opt)}]} { +# append comments "# - vars(clock_gate_aware_opt)\n" +# append args "set_db opt_clock_gate_aware $arg\n" +# } else { +# append ucomments "# - vars(clock_gate_aware_opt) \"true\"\n" +# } + if {![catch {set arg $vars(critical_range)}]} { + append comments "# - vars(critical_range)\n" + append args " -criticalRange $arg" + } + if {[info exists vars(all_end_points)] && $vars(all_end_points)} { + append comments "# - vars(all_end_points)\n" + append args "set_db opt_all_end_points true\n" + } else { + append ucomments "# - vars(all_end_points) \"true\"\n" + } + if {![catch {set arg $vars(size_only_file)}]} { + append comments "# - vars(size_only_file)\n" + append args "set_db opt_size_only_file $arg\n" + } else { + append ucomments "# - vars(size_only_file) \"\"\n" + } + if {![catch {set arg $vars(fix_fanout_load)}]} { + append comments "# - vars(fix_fanout_load)\n" + append args "set_db opt_fix_fanout_load $arg\n" + } else { + append ucomments "# - vars(fix_fanout_load) \"\"\n" + } + if {![catch {set arg $vars(useful_skew)}]} { + append comments "# - vars(useful_skew)\n" + if {$vars(ccopt_effort) == "low"} { + append args "set_db opt_useful_skew $arg\n" + append args "set_db opt_useful_skew_delay_pre_cts true\n" + if {$vars(useful_skew) && ![catch {set arg $vars(skew_buffers)}]} { + append comments "# - vars(skew_buffers)\n" + append args "set_db opt_useful_skew_cells $vars(skew_buffers)\n" + append commands [FF::wrap_command prects,set_useful_skew_mode $command] + } + } else { + append commands "# Variable vars(useful_skew) ignored when vars(ccopt_effort) is $vars(ccopt_effort)\n" + set warnings($vars(warning_count)) "Variable vars(useful_skew) ignored when vars(ccopt_effort) is $vars(ccopt_effort)\n" + incr vars(warning_count) + } + } else { + append ucomments "# - vars(useful_skew) \"true\"\n" + append ucomments "# - vars(skew_buffers) \"\"\n" + } + if {$args != ""} { + append commands [FF::wrap_command place,set_opt_mode $args] + } + } + + +# set command [FF_NOVUS::add_tie_cells true false] +# append commands [FF::wrap_command place,add_tie_cells $command] + + if {[info exists vars(jtag_cells)] && + [info exists vars(jtag_rows)]} { + append comments "# - vars(jtag_cells), vars(jtag_rows)\n" +# append commands "# PLACING JTAG CELLS\n" + set command "" + foreach inst $vars(jtag_cells) { + append command "specify_jtag -inst $inst\n" + } + append commands [FF::wrap_command place,specify_jtag $command] + set command "place_jtag -nr_row $vars(jtag_rows)\n" + append commands [FF::wrap_command place,place_jtag $command] + } + } + + "prects" { + ################################################################### + # Set optimization options ... + # Enable signalStorm if requested (required for ECSM/CCS flows) + # For low power flows, make sure always-on buffers are enabled + ################################################################### + + set args "" + if {$vars(flow) == "mmmc"} { + if {$vars(enable_ocv) == "pre_prects"} { + append comments "# - vars(enable_ocv)\n" + append args "set_db timing_analysis_type ocv\n" + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "set_db timing_analysis_aocv true\n" + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "set_db timing_analysis_socv true\n" + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_prects\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command prects,set_analysis_mode $command] + } + + set args "" + if {[lindex [split $vars(version) "."] 0] < 17} { + if {![catch {set arg $vars(preserve_assertions)}]} { + append comments "# - vars(preserve_assertions)\n" + append args "set_db opt_preserve_pins_with_timing_constraints $arg\n" + } else { + append ucomments "# - vars(preserve_assertions) \"true\"\n" + } + } + if {![catch {set arg $vars(leakage_power_effort)}]} { + append comments "# - vars(leakage_power_effort)\n" + append args "set_db opt_leakage_power_effort $arg\n" + } else { + append ucomments "# - vars(leakage_power_effort) \"low or high\"\n" + } + if {![catch {set arg $vars(dynamic_power_effort)}]} { + append comments "# - vars(dynamic_power_effort)\n" + append args "set_db opt_dynamic_power_effort $arg\n" + } else { + append ucomments "# - vars(dynamic_power_effort) \"low or high\"\n" + } +# if {![catch {set arg $vars(clock_gate_aware_opt)}]} { +# append comments "# - vars(clock_gate_aware_opt)\n" +# append args "set_db opt_clock_gate_aware $arg\n" +# } else { +# append ucomments "# - vars(clock_gate_aware_opt) \"true\"\n" +# } +# if {![catch {set arg $vars(critical_range)}]} { +# append comments "# - vars(critical_range)\n" +# append args "set_db opt_critical_range $arg\n" +# } + if {[info exists vars(all_end_points)] && $vars(all_end_points)} { + append comments "# - vars(all_end_points)\n" + append args "set_db opt_all_end_points $vars(all_end_points)\n" + } else { + append ucomments "# - vars(all_end_points) \"true\"\n" + } + if {![catch {set arg $vars(size_only_file)}]} { + append comments "# - vars(size_only_file)\n" + append args "set_db opt_size_only_file $arg\n" + } else { + append ucomments "# - vars(size_only_file) \"\"\n" + } + if {![catch {set arg $vars(fix_fanout_load)}]} { + append comments "# - vars(fix_fanout_load)\n" + append args "set_db opt_fix_fanout_load $arg\n" + } else { + append ucomments "# - vars(fix_fanout_load) \"\"\n" + } + if {![catch {set arg $vars(useful_skew)}]} { + if {$vars(ccopt_effort) == "low"} { + append comments "# - vars(useful_skew)\n" + append args "set_db opt_useful_skew $arg\n" + if {$vars(useful_skew) && ![catch {set arg $vars(skew_buffers)}]} { + append comments "# - vars(skew_buffers)\n" + append args "set_db opt_useful_skew_cells $vars(skew_buffers)\n" + append commands [FF::wrap_command prects,set_useful_skew_mode $command] + } + } else { + append commands "# Variable vars(useful_skew) ignored when vars(ccopt_effort) is $vars(ccopt_effort)\n" + set warnings($vars(warning_count)) "Variable vars(useful_skew) ignored when vars(ccopt_effort) is $vars(ccopt_effort)\n" + incr vars(warning_count) + } + } else { + append ucomments "# - vars(useful_skew) \"true\"\n" + append ucomments "# - vars(skew_buffers) \"\"\n" + } + if {[FF::is_lp_flow]} { + if {![catch {set arg $vars(resize_shifter_and_iso_insts)}]} { + append comments "# - vars(resize_level_shifter_and_iso_insts)\n" + append args "set_db opt_resize_level_shifter_and_iso_insts $arg\n" + } + } + if {$args != ""} { + append commands [FF::wrap_command prects,set_opt_mode $args] + } + +# if {$vars(enable_ss) == "pre_prects"} { +# append comments "# - vars(enable_ss)\n" +# set command "setDelayCalMode -engine signalStorm\n" +# append commands [FF::wrap_command prects,set_delay_cal_mode $command] +# } else { +# append ucomments "# - vars(enable_ss) \"pre_prects\"\n" +# } + if {[FF::is_lp_flow]} { + set command "" + if {[info exists vars(always_on_buffers)]} { + append comments "# - vars(always_on_buffers)\n" + append command "set_interactive_constraint_modes \[all_constraint_modes -active\]\n" + foreach buffer $vars(always_on_buffers) { + append command "set_dont_use false $buffer\n" + append command "set_dont_touch false $buffer\n" + } + } + foreach domain [FF::get_by_suffix vars ",always_on_buffers"] { + if {[info exists vars($domain,always_on_buffers)]} { + foreach buffer $vars($domain,always_on_buffers) { + append command "set_dont_use false $buffer\n" + append command "set_dont_touch false $buffer\n" + } + } + } + if {$command != ""} { + append commands [FF::wrap_command prects,set_dont_use $command] + } + } + } + + "cts" { + ################################################################### + # Set CTS options ... this includes nanoroute options as the clock + # net is typically routed during CTS. For hierarchical flows, the + # clock tree spec is defined per partition . + ################################################################### + + set args "" + if {$vars(enable_ocv) == "pre_cts"} { + append comments "# - vars(enable_ocv)\n" + append args "set_db timing_analysis_type ocv\n" + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "set_db timing_analysis_aocv true\n" + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "set_db timing_analysis_socv true\n" + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_cts\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command postcts,set_analysis_mode $command] + } + + set command "" +# if {![catch {set arg $vars(route_clock_nets)}]} { +# append comments "# - vars(route_clock_nets)\n" +# append command "set_db cts_route_clock_tree_nets $arg\n" +# } else { +# append ucomments "# - vars(route_clock_nets)\n" +# } +# if {$vars(cts_engine) == "cts"} { +# if {[info exists vars(clk_tree_top_layer)] && $vars(clk_tree_top_layer) != {}} { +# append comments "# - vars(clk_tree_top_layer)\n" +# append command "set_db cts_route_top_preferred_layer $vars(clk_tree_top_layer)\n" +# } else { +# append ucomments "# - vars(clk_tree_top_layer)\n" +# } +# if {[info exists vars(clk_tree_bottom_layer)] && $vars(clk_tree_bottom_layer) != {}} { +# append comments "# - vars(clk_tree_bottom_layer)\n" +# append command "set_db cts_route_bottom_preferred_layer $vars(clk_tree_bottom_layer)\n" +# } else { +# append ucomments "# - vars(clk_tree_bottom_layer)\n" +# } +# if {[info exists vars(clk_leaf_top_layer)] && $vars(clk_leaf_top_layer) != {}} { +# append comments "# - vars(clk_leaf_top_layer)\n" +# append command "set_db cts_route_leaf_top_preferred_layer $vars(clk_leaf_top_layer)\n" +# } else { +# append ucomments "# - vars(clk_leaf_top_layer)\n" +# } +# if {[info exists vars(clk_leaf_bottom_layer)] && $vars(clk_leaf_bottom_layer) != {}} { +# append comments "# - vars(clk_leaf_bottom_layer)\n" +# append command "set_db cts_route_leaf_bottom_preferred_layer $vars(clk_leaf_bottom_layer)\n" +# } else { +# append ucomments "# - vars(clk_leaf_bottom_layer)\n" +# } +# if {[info exists vars(clk_tree_ndr)] && $vars(clk_tree_ndr) != {}} { +# append comments "# - vars(clk_tree_ndr)\n" +# append command "set_db cts_route_non_default_rule $vars(clk_tree_ndr)\n" +# } else { +# append ucomments "# - vars(clk_tree_ndr)\n" +# } +# if {[info exists vars(clk_tree_extra_space)] && $vars(clk_tree_extra_space) != {}} { +# append comments "# - vars(clk_tree_extra_space)\n" +# append command "set_db cts_route_preferred_extra_space $vars(clk_tree_extra_space)" +# } else { +# append ucomments "# - vars(clk_tree_extra_space)\n" +# } +# if {[info exists vars(clk_leaf_ndr)] && $vars(clk_leaf_ndr) != {}} { +# append comments "# - vars(clk_leaf_ndr)\n" +# append command "set_db cts_route_leaf_non_default_rule $vars(clk_leaf_ndr)" +# } else { +# append ucomments "# - vars(clk_leaf_ndr)\n" +# } +# if {[info exists vars(clk_leaf_extra_space)] && $vars(clk_leaf_extra_space) != {}} { +# append comments "# - vars(clk_leaf_extra_space)\n" +# append command "set_db cts_route_leaf_preferred_extra_space $vars(clk_leaf_extra_space)" +# } else { +# append ucomments "# - vars(clk_leaf_extra_space)\n" +# } +# if {$command != ""} { +# append command "\n" +# append commands [FF::wrap_command cts,set_cts_mode $command] +# } +# } else { + set args "" + set command "" + if {[info exists vars(clk_leaf_top_layer)] && $vars(clk_leaf_top_layer) != {}} { + append comments "# - vars(clk_leaf_top_layer)\n" + append args "-top_preferred_layer $vars(clk_leaf_top_layer) " + } else { + append ucomments "# - vars(clk_leaf_top_layer)\n" + } + if {[info exists vars(clk_leaf_bottom_layer)] && $vars(clk_leaf_bottom_layer) != {}} { + append comments "# - vars(clk_leaf_bottom_layer)\n" + append args "-bottom_preferred_layer $vars(clk_leaf_bottom_layer) " + } else { + append ucomments "# - vars(clk_leaf_bottom_layer)\n" + } + if {[info exists vars(clk_leaf_ndr)] && $vars(clk_leaf_ndr) != {}} { + append comments "# - vars(clk_leaf_ndr)\n" + append args "-non_default_rule $vars(clk_leaf_ndr) " + } else { + append ucomments "# - vars(clk_leaf_ndr)\n" + } + if {$args != ""} { + append command "create_route_type -name leaf " + append command $args + } + set args "" + if {[info exists vars(clk_tree_top_layer)] && $vars(clk_tree_top_layer) != {}} { + append comments "# - vars(clk_tree_top_layer)\n" + append args "-top_preferred_layer $vars(clk_tree_top_layer) " + } else { + append ucomments "# - vars(clk_tree_top_layer)\n" + } + if {[info exists vars(clk_tree_bottom_layer)] && $vars(clk_tree_bottom_layer) != {}} { + append comments "# - vars(clk_tree_bottom_layer)\n" + append args "-bottom_preferred_layer $vars(clk_tree_bottom_layer) " + } else { + append ucomments "# - vars(clk_tree_bottom_layer)\n" + } + if {[info exists vars(clk_tree_ndr)] && $vars(clk_tree_ndr) != {}} { + append comments "# - vars(clk_tree_ndr)\n" + append args "-non_default_rule $vars(clk_tree_ndr) " + } else { + append ucomments "# - vars(clk_tree_ndr)\n" + } + if {$args != ""} { + append command "\ncreate_route_type -name tree " + append command $args + } + + if {$command != ""} { + append command "\n" + append commands [FF::wrap_command cts,set_cts_mode $command] + } +# } + + set command "" + if {[string tolower $vars(cts_engine)] != "cts"} { +# FF_NOVUS::assign_cts_cells +# foreach corner $vars(rc_corners) { +# if {[info exists vars($corner,atf_file)]} { +# append command "update_ccopt_rc_corner -name $corner -atf $vars($corner,atf_file)\n" +# } +# } +# if {$command != ""} { +# append command "\n" +# append commands [FF::wrap_command cts,update_ccopt_rc_corner $command] +# } +# set command "" +# if {[info exists vars(ccopt_integration)]} { +# append comments "# - vars(ccopt_integration)\n" +# append command "set_db ccopt_integration \"$vars(ccopt_integration)\"\n" +# } else { +# append ucomments "# - vars(ccopt_integration)\n" +# } + if {[info exists vars(cts_inverter_cells)]} { + append comments "# - vars(cts_inverter_cells)\n" + append command "set_db cts_inverter_cells \"$vars(cts_inverter_cells)\"\n" + } else { + append ucomments "# - vars(cts_inverter_cells)\n" + } + if {[info exists vars(cts_buffer_cells)]} { + append comments "# - vars(cts_buffer_cells)\n" + append command "set_db cts_buffer_cells \"$vars(cts_buffer_cells)\"\n" + } else { + append ucomments "# - vars(cts_buffer_cells)\n" + } + if {[info exists vars(clock_gate_cells)]} { + append comments "# - vars(clock_gate_cells)\n" + append command "set_db cts_clock_gating_cells \"$vars(clock_gate_cells)\"\n" + } else { + append ucomments "# - vars(clock_gate_cells)\n" + } + if {[info exists vars(cts_use_inverters)]} { + append comments "# - vars(cts_use_inverters)\n" + append command "set_db cts_use_inverters [string tolower $vars(cts_use_inverters)]\n" + } else { + append ucomments "# - vars(cts_use_inverters)\n" + } + if {[info exists vars(update_io_latency)]} { + append comments "# - vars(update_io_latency)\n" + append command "set_db cts_update_io_latency $vars(update_io_latency)\n" + } else { + append ucomments "# - vars(update_io_latency)\n" + } +# if {[info exists vars(cts_io_opt)]} { +# append comments "# - vars(cts_io_opt)\n" +# append command "set_db ccopt_io_opt [string tolower $vars(cts_io_opt)]\n" +# } else { +# append ucomments "# - vars(cts_io_opt)\n" +# } + if {[info exists vars(ccopt_effort)]} { + append comments "# - vars(ccopt_effort)\n" + if {[string tolower $vars(ccopt_effort)] != "low"} { + append command "set_ccopt_effort $vars(ccopt_effort)\n" + } + } else { + append ucomments "# - vars(ccopt_effort)\n" + } + if {[info exists vars(cts_target_skew)]} { + append comments "# - vars(cts_target_skew)\n" + append command "set_db cts_target_skew $vars(cts_target_skew)\n" + } else { + append ucomments "# - vars(cts_target_skew)\n" + } + if {[info exists vars(cts_target_slew)]} { + append comments "# - vars(cts_target_slew)\n" + append command "set_db cts_target_max_transition_time $vars(cts_target_slew)\n" + } else { + append ucomments "# - vars(cts_target_slew)\n" + } + if {[info exists vars(pre_ccopt_tcl)]} { + append comments "# - vars(pre_ccopt_tcl)\n" + append command "set_db ccopt_pre_tcl \{ source $vars(pre_ccopt_tcl) \}\n" + } + if {[info exists vars(post_ccopt_tcl)]} { + append comments "# - vars(post_ccopt_tcl)\n" + append command "set_db ccopt_post_tcl \{ source $vars(post_ccopt_tcl) \}\n" + } + append command "\n" + append commands [FF::wrap_command cts,set_ccopt_mode $command] +# set command "create_route_type trunk " +# if {[info exists vars(clk_tree_ndr)]} { +# append comments "# - vars(clk_tree_ndr)\n" +# append command "-non_default_rule $vars(clk_tree_ndr)" +# } else { +# append ucomments "# - vars(clk_tree_ndr)\n" +# } +# if {[info exists vars(clk_tree_shield_net)]} { +# append comments "# - vars(clk_tree_shield_net)\n" +# append command "-shield_net $vars(clk_tree_shield_net)" +# } else { +# append ucomments "# - vars(clk_tree_shield_net)\n" +# } +# if {[info exists vars(clk_tree_top_layer)]} { +# append comments "# - vars(clk_tree_top_layer)\n" +# append command "-top_preferred_layer $vars(clk_tree_top_layer)\n" +# } else { +# append ucomments "# - vars(clk_tree_top_layer)\n" +# } +# if {[info exists vars(clk_tree_bottom_layer)]} { +# append command "-bottom_preferred $vars(clk_tree_bottom_layer)\n" +# } else { +# append ucomments "# - vars(clk_tree_bottom_layer)\n" +# } +# if {$command != "create_route_type trunk "} { +# append command "\n" +# append commands [FF::wrap_command cts,create_route_type $command] +# } + } + set args "" + if {![catch {set arg $vars(multi_cut_effort)}]} { + append comments "# - vars(multi_cut_effort)\n" + append args "set_db route_design_detail_use_multi_cut_via_effort $arg\n" + } else { + append ucomments "# - vars(multi_cut_effort)\n" + } + if {![catch {set arg $vars(litho_driven_routing)}]} { + append comments "# - vars(litho_driven_routing)\n" + append args "set_db route_design_with_litho_driven $arg\n" + } else { + append ucomments "# - vars(litho_driven_routing)\n" + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command cts,set_nanoroute_mode $command] + } + + if {([info exists vars(partition_list)]) && + ([file tail [file dirname [pwd]]] == "$vars(partition_dir)")} { + set ptn [file tail [pwd]] + if {[info exists vars($ptn,cts_spec)]} { + set vars(cts_spec) $vars($ptn,cts_spec) + } else { + if {$ptn != $vars(design)} { + if {[info exists vars(cts_spec)]} { + unset vars(cts_spec) + } + } + } + } + } + + "postcts" { + ################################################################### + # Optionally enable cppr, signalStorm, and onChipVariation (if + # MMMC) + ################################################################### + + set args "" + if {$vars(enable_cppr) != "false"} { + append comments "# - vars(enable_cppr)\n" + append args "set_db timing_analysis_cppr $vars(enable_cppr)\n" + } else { + append ucomments "# - vars(enable_cppr)\n" + } + if {$vars(flow) == "mmmc"} { + if {$vars(enable_ocv) == "pre_postcts"} { + append comments "# - vars(enable_ocv)\n" + append args "set_db timing_analysis_type ocv\n" + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "set_db timing_analysis_aocv true\n" + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "set_db timing_analysis_socv true\n" + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_postcts\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command postcts,set_analysis_mode $command] + } + +# if {[info exists vars(cts_spec)]} { +# if {![catch {set arg $vars(clock_gate_clone)}]} { +# append comments "# - vars(clock_gate_clone)\n" +# set command "set_db opt_post_cts_clock_gate_cloning $arg\n" +# append commands [FF::wrap_command postcts,set_opt_mode $command] +# } +# } + } + + "postcts_hold" { + ################################################################### + # Set hold fixing options ... + ################################################################### + + if {[info exists vars(delay_cells)]} { + append comments "# - vars(delay_cells)\n" + set command "" + append command "set_interactive_constraint_modes \[all_constraint_modes -active\]\n" + foreach delay_cell $vars(delay_cells) { + append command "set_dont_use false $delay_cell\n" + } + if {$command != ""} { + append commands [FF::wrap_command postcts_hold,set_dont_use $command] + } + } else { + append ucomments "# - vars(delay_cells)\n" + } + set args "" + if {![catch {set arg $vars(fix_hold_allow_tns_degradation)}]} { + append comments "# - vars(fix_hold_allow_tns_degradation)\n" + append args "#set_db opt_fix_hold_allow_setup_tns_degrade $arg\n" + } else { + append ucomments "# - vars(fix_hold_allow_tns_degradation)\n" + } + if {$vars(fix_hold_ignore_ios)} { + #append commands "setAnalysisMode -honorClockDomains true\n" + append comments "# - vars(fix_hold_ignore_ios)\n" + append args "#set_db opt_fix_hold_ignore_path_groups {in2reg reg2out in2out}\n" + } else { + append ucomments "# - vars(fix_hold_ignore_ios)\n" + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command postcts_hold,set_opt_mode $command] + } + } + + "route" { + ################################################################### + # Set routing options ... + # Recommendations for multicut via insertion and litho driven + # routing. These all incur runtime penalties but have yield + # advantages so are included here. The routeWithLithoDriven option + # is recommended for 45nm but may also be used at 65nm. The + # -drouteUseMultiCutViaEffort can be set to high if needed; + # expect an average of 5% coverage improvement with an average 10% + # runtime hit versus medium + ################################################################### + + if {($vars(enable_cppr) != "false") && $vars(track_opt)} { + append comments "# - vars(enable_cppr)\n" + append args "set_db timing_analysis_cppr $vars(enable_cppr)\n" + } else { + append ucomments "# - vars(enable_cppr)\n" + } + if {$vars(enable_si_aware)} { + set command "set_db delaycal_enable_si true\n " + append commands [FF::wrap_command postroute,set_delay_cal_mode $command] + append comments "# - vars(enable_si_aware)\n" + } else { + append ucomments "# - vars(enable_si_aware)\n" + } + set args "" + if {![catch {set arg $vars(multi_cut_effort)}]} { + append comments "# - vars(multi_cut_effort)\n" + append args "set_db route_design_detail_use_multi_cut_via_effort $arg\n" + } else { + append ucomments "# - vars(multi_cut_effort)\n" + } + if {![catch {set arg $vars(litho_driven_routing)}]} { + append comments "# - vars(litho_driven_routing)\n" + append args "set_db route_design_with_litho_driven $arg\n" + } else { + append ucomments "# - vars(litho_driven_routing)\n" + } + if {![catch {set arg $vars(antenna_diode)}]} { + if {$vars(antenna_diode) != ""} { + append comments "# - vars(antenna_diode)\n" + append args "set_db route_design_antenna_cell_name $arg\n" + append args "set_db route_design_antenna_diode_insertion true\n" + } else { + append ucomments "# - vars(antenna_diode)\n" + } + } else { + append ucomments "# - vars(antenna_diode)\n" + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command route,set_nanoroute_mode $command] + } + } + + "postroute" { + ################################################################### + # Set extraction effort for postroute optimization + # Enable signalStorm if requested + ################################################################### + + set command "set_db extract_rc_engine post_route\n" + if {![catch {set arg $vars(postroute_extraction_effort)}]} { + append comments "# - vars(postroute_extraction_effort)\n" + append command "set_db extract_rc_effort_level $arg\n" + } else { + append ucomments "# - vars(postroute_extraction_effort)\n" + } + if {![catch {set arg $vars(total_c_thresh)}]} { + append comments "# - vars(total_c_thresh)\n" + append command "set_db extract_rc_total_cap_threshold $arg\n" + } else { + append ucomments "# - vars(total_c_thresh)\n" + } + if {![catch {set arg $vars(relative_c_thresh)}]} { + append comments "# - vars(relative_c_thresh)\n" + append command "set_db extract_rc_relative_cap_threshold $arg\n" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(coupling_c_thresh)}]} { + append comments "# - vars(coupling_c_thresh)\n" + append command "set_db extract_rc_coupling_cap_threshold $arg\n" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(qrc_layer_map)}]} { + append comments "# - vars(qrc_layer_map)\n" + append command "set_db extract_rc_lef_tech_file_map $arg" + } else { + append ucomments "# - vars(qrc_layer_map)\n" + } + append command "\n" + append commands [FF::wrap_command postroute,set_extract_rc_mode $command] + + + set args "" + if {($vars(enable_ocv) == "pre_postroute") || ($vars(enable_ocv) == "pre_postcts")} { + if {$vars(flow) != "default"} { + append comments "# - vars(enable_ocv)\n" + append args "set_db timing_analysis_type ocv\n" + } + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "set_db timing_analysis_aocv true\n" + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "set_db timing_analysis_socv true\n" + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_postroute\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + if {$vars(enable_cppr) != "false"} { + append comments "# - vars(enable_cppr)\n" + append args "set_db timing_analysis_cppr $vars(enable_cppr)\n" + } else { + append ucomments "# - vars(enable_cppr)\n" + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command postroute,set_analysis_mode $command] + } + + if {[regexp "9.1" $vars(version)]} { + if {$vars(enable_ss) == "pre_postroute"} { + append comments "# - vars(enable_ss)\n" + set command "setDelayCalMode -engine signalStorm -signoff true " + append commands [FF::wrap_command postroute,set_delay_cal_mode $command] + } else { + append ucomments "# - vars(enable_ss) \"pre_postroute\"\n" + } + } else { + if {$vars(enable_si_aware)} { + set command "set_db delaycal_enable_si true\n " + append commands [FF::wrap_command postroute,set_delay_cal_mode $command] + append comments "# - vars(enable_si_aware)\n" + if {$vars(enable_ss) == "pre_postroute"} { + append commands "# Variable vars(enable_ss) ignored when vars(enable_si_aware) is set\n" + set warnings($vars(warning_count)) "Variable vars(enable_ss) ignored when vars(enable_si_aware) is set\n" + incr vars(warning_count) + } + } else { + append ucomments "# - vars(enable_si_aware)\n" + if {$vars(enable_ss) == "pre_postroute"} { + append comments "# - vars(enable_ss)\n" +# set command "setDelayCalMode -engine signalStorm -signoff true -siAware false\n" +# append commands [FF::wrap_command postroute,set_delay_cal_mode $command] + } else { + set command "#set_db delaycal_enable_si false\n" +# append commands [FF::wrap_command postroute,set_delay_cal_mode $command] + append ucomments "# - vars(enable_ss) \"pre_postroute\"\n" + } + } + } + } + + "postroute_hold" { + ################################################################### + # Set hold fixing options ... + ################################################################### + + set command "set_db extract_rc_engine post_route\n" + if {![catch {set arg $vars(postroute_extraction_effort)}]} { + append comments "# - vars(postroute_extraction_effort)\n" + append command "set_db extract_rc_effort_level $arg\n" + } else { + append ucomments "# - vars(postroute_extraction_effort)\n" + } + if {![catch {set arg $vars(total_c_thresh)}]} { + append comments "# - vars(total_c_thresh)\n" + append command "set_db extract_rc_total_cap_threshold $arg\n" + } else { + append ucomments "# - vars(total_c_thresh)\n" + } + if {![catch {set arg $vars(relative_c_thresh)}]} { + append comments "# - vars(relative_c_thresh)\n" + append command "set_db extract_rc_relative_cap_threshold $arg\n" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(coupling_c_thresh)}]} { + append comments "# - vars(coupling_c_thresh)\n" + append command "set_db extract_rc_coupling_cap_threshold $arg\n" + } else { + append ucomments "# - vars(coupling_c_thresh)\n" + } + if {![catch {set arg $vars(qrc_layer_map)}]} { + append comments "# - vars(qrc_layer_map)\n" + append command "set_db extract_rc_lef_tech_file_map $arg" + } else { + append ucomments "# - vars(qrc_layer_map)\n" + } + append command "\n" + append commands [FF::wrap_command postroute_hold,set_extract_rc_mode $command] + set command "" + if {[info exists vars(delay_cells)]} { + append command "set_interactive_constraint_modes \[all_constraint_modes -active\]\n" + append comments "# - vars(delay_cells)\n" + foreach delay_cell $vars(delay_cells) { + append command "set_dont_use false $delay_cell\n" + } + } else { + append ucomments "# - vars(delay_cells)\n" + } + if {$command != ""} { + append commands [FF::wrap_command postroute_hold,set_dont_use_mode $command] + } + + set args "" + if {![catch {set arg $vars(fix_hold_allow_tns_degradation)}]} { + append comments "# - vars(fix_hold_allow_tns_degradation)\n" + append args "#set_db opt_fix_hold_allow_setup_tns_degrade $arg\n" + } else { + append ucomments "# - vars(fix_hold_allow_tns_degradation)\n" + } + if {$vars(fix_hold_ignore_ios)} { + #append commands "setAnalysisMode -honorClockDomains true\n" + append comments "# - vars(fix_hold_ignore_ios)\n" + append args "#set_db opt_fix_hold_ignore_path_groups {in2reg reg2out in2out}" + } else { + append ucomments "# - vars(fix_hold_ignore_ios)\n" + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command postroute_hold,set_opt_mode $command] + } + } + + "postroute_si" { + ################################################################### + # Set noise, extraction, and SI options ... + # Enable signalStorm if requested + # Enable onChipVariation (if MMMC) + ################################################################### + + set command "set_db extract_rc_coupled true\n" + if {![catch {set arg $vars(total_c_thresh)}]} { + append comments "# - vars(total_c_thresh)\n" + append command "set_db extract_rc_total_cap_threshold $arg\n" + } else { + append ucomments "# - vars(total_c_thresh)\n" + } + if {![catch {set arg $vars(relative_c_thresh)}]} { + append comments "# - vars(relative_c_thresh)\n" + append command "set_db extract_rc_relative_cap_threshold $arg\n" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(coupling_c_thresh)}]} { + append comments "# - vars(coupling_c_thresh)\n" + append command "set_db extract_rc_coupling_cap_threshold $arg\n" + } else { + append ucomments "# - vars(coupling_c_thresh)\n" + } + if {![catch {set arg $vars(qrc_layer_map)}]} { + append comments "# - vars(qrc_layer_map)\n" + append command "set_db extract_rc_lef_tech_file_map $arg\n" + } else { + append ucomments "# - vars(qrc_layer_map)\n" + } + append command "\n" + append commands [FF::wrap_command postroute_si,set_extract_rc_mode $command] + + set args "" + if {![catch {set arg $vars(delta_delay_threshold)}]} { + append comments "# - vars(delta_delay_threshold)\n" + append args "set_db si_delay_delta_threshold $arg\n" + } else { + append ucomments "# - vars(delta_delay_threshold)\n" + } +# if {![catch {set arg $vars(celtic_settings)}]} { +# append comments "# - vars(celtic_settings)\n" +# append args " -insCeltICPreTcl \"$arg\"" +# } else { +# append ucomments "# - vars(celtic_settings)\n" +# } +# if {![catch {set arg $vars(si_analysis_type)}]} { +# append comments "# - vars(si_analysis_type)\n" +# append args " -analysisType $arg" +# } else { +# append ucomments "# - vars(si_analysis_type)\n" +# } + if {$vars(high_timing_effort) && [regexp "9.1" $vars(version)]} { +# append comments "# - vars(high_timing_effort)\n" + append args "set_db si_acceptable_wns 0\n" + } elseif {[info exists vars(acceptable_wns)]} { + append args "set_db si_acceptable_wns $vars(acceptable_wns)\n" + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command postroute_si,set_si_mode $command] + } + + set args "" + if {$vars(enable_ocv) == "pre_postroute_si"} { + if {$vars(flow) != "default"} { + append comments "# - vars(enable_ocv)\n" + append args "set_db timing_analysis_type ocv\n" + } + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "set_db timing_analysis_aocv true\n" + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "set_db timing_analysis_socv true\n" + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_postroute_si\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + if {$vars(enable_cppr) != "false"} { + append comments "# - vars(enable_cppr)\n" + append args "set_db timing_analysis_cppr $vars(enable_cppr)\n" + } else { + append ucomments "# - vars(enable_cppr)\n" + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command postroute_si,set_analysis_mode $command] + } + +# if {$vars(enable_ss) == "pre_postroute_si"} { +# append comments "# - vars(enable_ss)\n" +# set command "setDelayCalMode -engine signalStorm\n" +# append commands [FF::wrap_command postroute_si,set_delay_cal_mode $command] +# } else { +# append ucomments "# - vars(enable_ss) \"pre_postroute_si\"\n" +# } +# } + + "postroute_si_hold" { + ################################################################### + # Set hold fixing options ... + ################################################################### + + set command "" + if {[info exists vars(delay_cells)]} { + append command "set_interactive_constraint_modes \[all_constraint_modes -active\]\n" + append comments "# - vars(delay_cells)\n" + foreach delay_cell $vars(delay_cells) { + append command "set_dont_use false $delay_cell\n" + } + } else { + append ucomments "# - vars(delay_cells)\n" + } + if {$command != ""} { + append commands [FF::wrap_command postroute_hold,set_dont_use_mode $command] + } + + set args "" + if {![catch {set arg $vars(fix_hold_allow_tns_degradation)}]} { + append comments "# - vars(fix_hold_allow_tns_degradation)\n" + append args "#set_db opt_fix_hold_allow_setup_tns_degrade $arg\n" + } else { + append ucomments "# - vars(fix_hold_allow_tns_degradation)\n" + } + if {$vars(fix_hold_ignore_ios)} { + #append commands "setAnalysisMode -honorClockDomains true\n" + append comments "# - vars(fix_hold_ignore_ios)\n" + append args "#set_db opt_fix_hold_ignore_path_groups {in2reg reg2out in2out}" + } else { + append ucomments "# - vars(fix_hold_ignore_ios)\n" + } + set command "" + if {[info exists vars(delay_cells)]} { + append command "set_interactive_constraint_modes \[all_constraint_modes -active\]\n" + append comments "# - vars(delay_cells)\n" + foreach delay_cell $vars(delay_cells) { + append command "set_dont_use false $delay_cell\n" + } + } else { + append ucomments "# - vars(delay_cells)\n" + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command postroute_si_hold,set_opt_mode $command] + } + + ################################################################### + # Set noise, extraction, and SI options ... + # Enable signalStorm if requested + # Enable onChipVariation (if MMMC) + ################################################################### + + set command "set_db extract_rc_coupled true\n" + if {![catch {set arg $vars(total_c_thresh)}]} { + append comments "# - vars(total_c_thresh)\n" + append command "set_db extract_rc_total_cap_threshold $arg\n" + } else { + append ucomments "# - vars(total_c_thresh)\n" + } + if {![catch {set arg $vars(relative_c_thresh)}]} { + append comments "# - vars(relative_c_thresh)\n" + append command "set_db extract_rc_relative_cap_threshold $arg\n" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(coupling_c_thresh)}]} { + append comments "# - vars(coupling_c_thresh)\n" + append command "set_db extract_rc_coupling_cap_threshold $arg\n" + } else { + append ucomments "# - vars(coupling_c_thresh)\n" + } + if {![catch {set arg $vars(qrc_layer_map)}]} { + append comments "# - vars(qrc_layer_map)\n" + append command "set_db extract_rc_lef_tech_file_map $arg\n" + } else { + append ucomments "# - vars(qrc_layer_map)\n" + } + append command "\n" + append commands [FF::wrap_command postroute_si_hold,set_extract_rc_mode $command] + + set args "" + if {![catch {set arg $vars(delta_delay_threshold)}]} { + append comments "# - vars(delta_delay_threshold)\n" + append args "set_db si_delay_delta_threshold $arg\n" + } else { + append ucomments "# - vars(delta_delay_threshold)\n" + } +# if {![catch {set arg $vars(celtic_settings)}]} { +# append comments "# - vars(celtic_settings)\n" +# append args " -insCeltICPreTcl \"$arg\"" +# } else { +# append ucomments "# - vars(celtic_settings)\n" +# } +# if {![catch {set arg $vars(si_analysis_type)}]} { +# append comments "# - vars(si_analysis_type)\n" +# append args " -analysisType $arg" +# } else { +# append ucomments "# - vars(si_analysis_type)\n" +# } + if {$vars(high_timing_effort) && [regexp "9.1" $vars(version)]} { +# append comments "# - vars(high_timing_effort)\n" + append args "set_db si_acceptable_wns 0\n" + } elseif {[info exists vars(acceptable_wns)]} { + append args "set_db si_acceptable_wns $vars(acceptable_wns)\n" + } + if {$args != ""} { + set command "setSIMode $args\n" + append commands [FF::wrap_command postroute_si_hold,set_si_mode $command] + } + if {$vars(enable_ss) == "pre_postroute_si"} { + append comments "# - vars(enable_ss)\n" + set command "setDelayCalMode -engine signalStorm\n" + append commands [FF::wrap_command postroute_si_hold,set_delay_cal_mode $command] + } else { + append ucomments "# - vars(enable_ss) \"pre_postroute_si\"\n" + } + if {$vars(enable_ocv) == "pre_postroute_si"} { + append comments "# - vars(enable_ocv)\n" + if {$vars(flow) != "default"} { + set command "set_db timing_analysis_type ocv\n" + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append command "-aocv true " + } else { + append ucomments "# - vars(enable_aocv)\n" + } + append commands [FF::wrap_command postroute_si_hold,set_analysis_mode $command] + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_postroute_si\"\n" + append ucomments "# - vars(enable_ocv) \"true\"\n" + } + } + + "signoff" { + ################################################################### + # For the default flow, switch to MMMC for final STA to support + # multiple RC corners. Also, enable CCE (signoff) extraction if + # the QRC techfile exists + ################################################################### + if {$vars(flow) == "default"} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# UPDATING TIMING ENVIRONMENT" + append commands "#\n" + } + set command [FF_NOVUS::initialize_timing mmmc] + append commands [FF::wrap_command signoff,initialize_timing $command] + } + + ################################################################### + # Set noise, extraction, and SI options ... + # Enable signalStorm if requested + # Enable onChipVariation (if MMMC) + ################################################################### + + set command "set_db extract_rc_coupled true\n" + if {![catch {set arg $vars(total_c_thresh)}]} { + append comments "# - vars(total_c_thresh)\n" + append command "set_db extract_rc_total_cap_threshold $arg\n" + } else { + append ucomments "# - vars(total_c_thresh)\n" + } + if {![catch {set arg $vars(relative_c_thresh)}]} { + append comments "# - vars(relative_c_thresh)\n" + append command "set_db extract_rc_relative_cap_threshold $arg\n" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(coupling_c_thresh)}]} { + append comments "# - vars(coupling_c_thresh)\n" + append command "set_db extract_rc_coupling_cap_threshold $arg\n" + } else { + append ucomments "# - vars(coupling_c_thresh)\n" + } + if {![catch {set arg $vars(qrc_layer_map)}]} { + append comments "# - vars(qrc_layer_map)\n" + append command "set_db extract_rc_lef_tech_file_map $arg\n" + } else { + append ucomments "# - vars(qrc_layer_map)\n" + } + append command "\n" + append commands [FF::wrap_command signoff,set_extract_rc_mode $command] + + set args "" + if {![catch {set arg $vars(delta_delay_threshold)}]} { + append comments "# - vars(delta_delay_threshold)\n" + append args "set_db si_delay_delta_threshold $arg" + } else { + append ucomments "# - vars(delta_delay_threshold)\n" + } +# if {![catch {set arg $vars(celtic_settings)}]} { +# append comments "# - vars(celtic_settings)\n" +# append args " -insCeltICPreTcl \"$arg\"" +# } else { +# append ucomments "# - vars(celtic_settings)\n" +# } +# if {![catch {set arg $vars(si_analysis_type)}]} { +# append comments "# - vars(si_analysis_type)\n" +# append args " -analysisType $arg" +# } else { +# append ucomments "# - vars(si_analysis_type)\n" +# } + set args "" + if {$vars(enable_ocv) != "false"} { + append comments "# - vars(enable_ocv)\n" + append args "set_db timing_analysis_type ocv\n" + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "set_db timing_analysis_aocv true\n" + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "set_db timing_analysis_socv true\n" + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_signoff\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + if {$vars(enable_cppr) != "false"} { + append comments "# - vars(enable_cppr)\n" + append args "set_db timing_analysis_cppr $vars(enable_cppr)\n" + } else { + append ucomments "# - vars(enable_cppr)\n" + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command signoff,set_analysis_mode $command] + } + if {[regexp "9.1" $vars(version)]} { + if {$vars(enable_ss) == "pre_signoff"} { + set command "setDelayCalMode -engine signalStorm -signoff true\n" + append commands [FF::wrap_command signoff,set_delay_cal_mode $command] + append comments "# - vars(enable_ss)\n" + } else { + append ucomments "# - vars(enable_ss) \"pre_signoff\"\n" + } + } else { +# if {$vars(enable_si_aware)} { +# append comments "# - vars(enable_si_aware)\n" +# append command "-siAware true -engine aae\n " + if {$vars(enable_ss) == "pre_signoff"} { + set command "setDelayCalMode -engine signalStorm -signoff true\n" + append commands [FF::wrap_command signoff,set_delay_cal_mode $command] +# append commands " Variable vars(enable_ss) ignored when vars(enable_si_aware) is set\n" +# set warnings($vars(warning_count)) "Variable vars(enable_ss) ignored when vars(enable_si_aware) is set\n" +# incr vars(warning_count) + } else { + append ucomments "# - vars(enable_ss) \"pre_signoff\"\n" + } +# } else { +# append ucomments "# - vars(enable_si_aware)\n" +# if {$vars(enable_ss) == "pre_signoff"} { +# append comments "# - vars(enable_ss)\n" +# append command "-engine signalStorm -signoff true " +# } else { +# append ucomments "# - vars(enable_ss) \"pre_signoff\"\n" +# } +# } + } + + if {$vars(skip_signoff_checks)} { + set command "set_db extract_rc_engine post_route\nset_db extract_rc_effort_level $vars(signoff_extraction_effort)\nset_db extract_rc_coupled true\n" + append commands [FF::wrap_command signoff,set_extract_rc_mode $command] + } else { + append commands "set vars(active_rc_corners) \[list\]\n" + append commands "foreach view \[all_analysis_views\] {\n" + append commands " set corner \[get_delay_corner \[get_analysis_view \$view -delay_corner\] -rc_corner\]\n" + append commands " if {\[lsearch \$vars(active_rc_corners) \$corner\] == -1 } {\n" + append commands " lappend vars(active_rc_corners) \$corner\n" + append commands " }\n" + append commands "}\n" + append commands "puts \" ACTIVE RC CORNER LIST: \$vars(active_rc_corners)\"\n" + + append commands "set empty_corners \[list\]\n" + append commands "foreach corner \$vars(active_rc_corners) {\n" + append commands " if {!\[file exists \[get_rc_corner \$corner -qrc_tech\]\]} {\n" + append commands " lappend empty_corners \$corner\n" + append commands " }\n" + append commands "}\n" + append commands "if {\[llength \$empty_corners\] == 0} {\n" + set command " set_db extract_rc_engine post_route\n set_db extract_rc_effort_level $vars(signoff_extraction_effort)\n set_db extract_rc_coupled true\n" + append commands [FF::wrap_command signoff,set_extract_rc_mode $command] + append commands "} else {\n" + append commands " puts \" CAN'T RUN SIGNOFF EXTRACTION BECAUSE qx_tech_file IS NOT DEFINED FOR these corners: \$empty_corners\"\n" + set command " set_db extract_rc_engine post_route\n set_db extract_rc_effort_level low\n set_db extract_rc_coupled true\n" + append commands [FF::wrap_command signoff,set_extract_rc_mode $command] + append commands "}\n" + } + } + } + if {[info exists ucomments]} { + if {$ucomments == ""} { + if {[info exists vars(ucomments)]} { + unset vars(ucomments) + } + } else { + set vars(ucomments) $ucomments + } + } + if {[info exists comments]} { + if {$comments == ""} { + if {[info exists vars(comments)]} { + unset vars(comments) + } + } else { + set vars(comments) $comments + } + } + return $commands + } + + proc save_results {{step ""} {format 0}} { + + global vars + global errors + global env + + if {[regexp syn_ $step]} { + set commands "" + if {$vars(report_run_time)} { + append commands "ff_procs::report_time\n" + } + return $commands + } + + if {[info exists vars(hier)]} { + set hier true + } else { + set hier false + } + if {$step != ""} { + set vars(step) $step + } + + if {$vars(debug)} { + puts " Saving results for $vars(step) ..." + } + + set commands "" + if {$vars(batch)} { + + if {$vars(verbose)} { + append commands "#\n" + append commands "# SAVING RESULTS\n" + append commands "#\n" + } + +# if {[regexp _hold $vars(step)] && (![lsearch $vars(fix_hold) $vars(step)] <0)} { +# +# if {!$format} { +# set commands "" +# } else { +# if {$vars(report_run_time)} { +# append commands "FF_NOVUS::report_time $vars(step)\n" +# } +# } +# if {$vars(codegen)} { +# return $commands +# } else { +# uplevel #0 eval $commands +# } +# } + + set header "#---------------------------------------------------------------------\n" + append header "# GENERATING REPORTS\n" + append header "#---------------------------------------------------------------------\n" + + if {$vars(report_power)} { + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + set command "report_power -view $vars(power_analysis_view) -out_file $vars(rpt_dir)/$vars(step).power.rpt\n" + } else { + set command "report_power -out_file $vars(rpt_dir)/$vars(step).power.rpt\n" + } + append commands [FF::wrap_command $vars(step),report_power $command] + } + + if {[FF::is_lp_flow] && [info exists vars(power_domains)] && [llength $vars(power_domains)] > 1} { + append commands $header + set header "" + + ###################################################################### + # Verify power domain + ###################################################################### + +# set command "check_power_domains -bind -gconn" +# append command " -iso_net_pd $vars(rpt_dir)/$vars(step).isonets.rpt" +# append command " -x_net_pd $vars(rpt_dir)/$vars(step).xnets.rpt\n" + +# append commands [FF::wrap_command $step,check_power_domain $command] + + ###################################################################### + # Run CLP + ###################################################################### + + if {$vars(run_clp) && ([auto_execok lec] != "")} { + set command "run_clp " + if {[info exists vars(clp_options)]} { + append command $vars(clp_options) + } + append command "\n" + append commands [FF::wrap_command $step,run_clp $command] + } else { + if {![info exists vars(clp_warning)]} { + puts " WARNING: UNABLE TO RUN CLP ... PLEASE MAKE SURE IT IS IN YOUR PATH" + set vars(clp_warning) true + } + } + } + + set map(init) unplaced + set map(place) placed + set map(partition_place) placed + set map(model_gen) placed + set map(assign_pin) placed + #set map(partition) {} + set map(prects) placed + set map(cts) clock_synthesized + set map(postcts) clock_synthesized + set map(postcts_hold) clock_synthesized + set map(route) clock_synthesized_routed + set map(postroute) clock_synthesized_routed + set map(postroute_hold) clock_synthesized_routed + set map(signoff) clock_synthesized_routed + set map(assemble) placed_routed + + if {$vars(capture_metrics) && ($vars(step) != "debug")} { + if {[lindex [split $vars(version) "."] 0] > 13} { + append commands "pop_snapshot_stack\n" + if {[lindex [split $vars(version) "."] 0] > 16} { + if {[info exists map($step)]} { + if {[info exists vars(compute_metrics)] && $vars(compute_metrics)} { + append commands "create_snapshot -name $vars(step) -categories \[dict get \[get_db metric_category_status_map\] $map($step)\]\n" + } else { + append commands "create_snapshot -name $vars(step) -categories design\n" + } + } else { + append commands "create_snapshot -name $vars(step) -categories design\n" + } + } else { + append commands "create_snapshot -name $vars(step) -categories design\n" + } + append commands "report_metric -file $vars(rpt_dir)/metrics.html -format html\n" + } + } + + if {($step != "partition") && ($step != "rebudget") && ($step != "flexilm")} { + set args "" + if {[info exists vars(save_rc)] && $vars(save_rc)} { + if {[regexp "route" $vars(step)]} { + append args " -rc" + } + } + if {[info exists vars(save_constraints)] && $vars(save_constraints)} { + append args " -tcon" + } + + # BCL: Added subst around vars(dbs_dir) to resolve vars(rundir) + set dir [subst $vars(dbs_dir)] + set design $vars(design) + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + if {$hier} { + set command "write_db $args -oa_lib_cell_view {$vars(oa_partition_lib) $vars(design) $vars(step)}\n" + } else { + set command "write_db $args -oa_lib_cell_view {$vars(oa_design_lib) $vars(design) $vars(step)}\n" + } + } + } else { + if {[info exists vars(relative_path)] && $vars(relative_path)} { + append args " -relative_path" + } + if {[info exists vars(absolute_lib_path)] && $vars(absolute_lib_path)} { + append args " -absolute_lib_path" + } + set command "write_db $args $dir/$vars(step).enc\n" + } + + if {!(($vars(step) == "model_gen") && $vars(use_flexmodels) && $vars(flexmodel_art_based))} { + append commands [FF::wrap_command $step,save_design $command] + append commands [FF::wrap_command $step,save_lec_netlist "write_netlist $vars(dbs_dir)/LEC/$step.v.gz\n"] + } + + } + + if {![info exists env(VPATH)]} { + set env(VPATH) "make" + } + + if {!$vars(generate_flow_steps)} { + append commands "if {\[info exists env(VPATH)\]} {" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)" + append commands "}\n" + } + +# append commands "#\n" +# append commands "# HOUSEKEEPING\n" +# append commands "#\n" + + if {[info exists vars(mail,to)]} { + switch $vars(step) { + init { set summary_file preplace.summary } + assemble { set summary_file signoff.summary } + default { set summary_file $vars(step).summary } + } + if {![info exists vars(mail,steps)] || \ + ([info exists vars(mail,steps)] && ([lsearch $vars(mail,steps) $vars(step)] != -1))} { + append commands "puts \" MAILING RESULTS TO $vars(mail,to)\"\n" + append commands "if {\[file exists $vars(rpt_dir)/$summary_file\]} {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" < $vars(rpt_dir)/$summary_file $vars(mail,to)\n" + append commands "} elseif {\[file exists $vars(rpt_dir)/${summary_file}.gz\]} {\n" + append commands " gunzip -c $vars(rpt_dir)/${summary_file}.gz \| exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" $vars(mail,to)\n" + append commands "} else {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" < /dev/null $vars(mail,to)\n" + append commands "}\n" + } + } + +# append commands "exec /bin/touch \$env(VPATH)/$vars(step)\n" + + if {$format} { + if {$vars(report_run_time)} { + append commands "ff_procs::report_time\n" + } + if {$vars(capture_metrics)} { + if {[lindex [split $vars(version) "."] 0] < 14} { + append commands [eval FF::capture_metrics] + } + } + } + + if {$vars(enable_qor_check)} { +# if {[info exists vars($step,qor_tcl]} { +# set qor_file $vars($step,qor_tcl) +# if {[file exists $qor_file]} { +# set qor [catch {exec $qor_file} msg] +# set make_file [open $this_semaphore w] +# puts $make_file "$qor" +# close $make_file +# } +# } + if {[info exists vars($step,qor_tcl)]} { + if {[file exists $vars($step,qor_tcl)]} { + append commands [FF::source_plug ${step},qor_tcl] + } else { + append commands " WARNING: QOR file $vars($step,qor_tcl) does not exist" + set warnings($warning_count) "WARNING: QOR file $vars($step,qor_tcl) does not exist" + incr warning_count + } + } else { + if {$vars(makefile) && !$vars(generate_flow_steps)} { + append commands "\nif {\[info exists env(VPATH)\]} {\n" + append commands " exec /bin/touch \$env(VPATH)/${step}_qor\n" + append commands "}\n" + } + } + } + append commands [FF::source_plug final_always_source_tcl] + + } else { + append commands "puts \" =================================================\"\n" + append commands "puts \" INFO: Running in interactive mode ...\"\n" + append commands "puts \" Please run 'FF_NOVUS::save_results ' \"\n" + append commands "puts \" to prepare a database for the next step\"\n" + append commands "puts \" =================================================\"\n" + if {$vars(makefile) && !$vars(generate_flow_steps)} { + append commands "if {\[info exists env(VPATH)\]} {\n" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)\n" + append commands "}\n" + } + } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + + } + + proc initialize_multicpu {} { + + global vars + + set commands "" +# append commands "#\n" +# append commands "# SETTING UP MULTI PROCESS DISTRIBUTION AND THREADING\n" +# append commands "#\n" + + global vars + + if {[regexp syn_ $vars(step)]} { + return "" + } + + if {[info exists vars(distribute_timeout)]} { + set command "set_distributed_hosts -time_out $vars(distribute_timeout) " + } else { + set command "set_distributed_hosts " + } + + if {[info exists vars(distribute)]} { + switch $vars(distribute) { + "rsh" { +# append commands "# RUNNING RSH on $vars(rsh,host_list)\n" + append command "-rsh -add \[list $vars(rsh,host_list)\]\n" + set vars(remote_hosts) [llength $vars(rsh,host_list)] + } + "local" { + append command "-local\n" + } + "custom" { +# append commands "# RUNNING CUSTOM ($vars(custom,script))\n" + append command "-custom -custom_script { $vars(custom,script) }\n" + } + "lsf" { +# append commands "# RUNNING LSF ($vars(lsf,queue), $vars(lsf,resource), $vars(lsf,args)\n" + append command "-lsf -queue $vars(lsf,queue) -resource { $vars(lsf,resource) } -lsf_args { $vars(lsf,args) }\n" + } + default { + puts " DISTRIBUTION TYPE $vars(distribute) NOT SUPPORTED\n" + } + } + +# append commands $command + append commands [FF::wrap_command $vars(step),set_distributed_hosts $command] + + set command "set_multi_cpu_usage " + append command "-local_cpu $vars(local_cpus) " + append command "-remote_host $vars(remote_hosts) " + append command "-cpu_per_remote_host $vars(cpus_per_remote_host)\n" + append commands [FF::wrap_command $vars(step),set_multi_cpu_usage $command] + + } else { + + append command "-local\n" + append commands [FF::wrap_command $vars(step),set_distributed_hosts $command] + + set command "set_multi_cpu_usage -local_cpu $vars(local_cpus)\n" + append commands [FF::wrap_command $vars(step),set_multi_cpu_usage $command] + + } + + return $commands + + } + proc derate_timing {{type minmax}} { + + global vars + global errors + +# if {[info exists vars(view_definition_tcl)]} { +# return "" +# } + +# if {$vars(enable_aocv)} { +# set commands "" +# foreach corner $vars(delay_corners) { +# append commands "reset_timing_derate -delay_corner $corner\n" +# } +# return $commands +# } + + set commands "puts \" DERATING DELAY CORNERS ...\"\n" + if {$vars(verbose)} { + append commands "#\n" + append commands "# DERATING DELAY CORNERS ($type) ...\n" + append commands "#\n" + } + switch $type { + "mmmc" { + set found_corner 0 + foreach corner $vars(delay_corners) { + set derate_file 0 + set command($corner) "" + if {[info exists vars($corner,derate_tcl)]} { + set derate_file 1 + incr found_corner 1 + if {[file exists $vars($corner,derate_tcl)]} { + if {$command($corner) == ""} { + append command($corner) [FF::source_plug "$corner,derate_tcl"] + } + } + } + if {!$derate_file} { + foreach object "cell net" { + foreach mode "early late" { + foreach type "data clock" { + if {[info exists vars($corner,${type}_${object}_${mode})]} { + append command($corner) " set_timing_derate -$type -${object}_delay -$mode -delay_corner $corner $vars($corner,${type}_${object}_${mode})\n" + set found_corner 1 + } + if {[info exists vars($corner,${object}_${type}_${mode})]} { + append command($corner) " set_timing_derate -$type -${object}_delay -$mode -delay_corner $corner $vars($corner,${object}_${type}_${mode})\n" + set found_corner 1 + } + } + if {[info exists vars($corner,cell_check_${mode})]} { + append command($corner) " set_timing_derate -cell_check -$mode -delay_corner $corner $vars($corner,cell_check_${mode})\n" + set found_corner 1 + } + if {[info exists vars($corner,check_cell_${mode})]} { + append command($corner) " set_timing_derate -cell_check -$mode -delay_corner $corner $vars($corner,check_cell_${mode})\n" + set found_corner 1 + } + } + } + } + } + ######################################################################### + # There can only be one ilm_non_sdc_file, so need to combine them with + # the timing derate commands if both exists + ######################################################################### + if {$found_corner>0} { + if $vars(ilm) { + set op [open .ilm_non_sdc_file.tcl w] + if {[info exists vars(ilm_non_sdc_file)] && [file exists $vars(ilm_non_sdc_file)]} { + set fhr [open $vars(ilm_non_sdc_file) r] + puts $op "#" + puts $op "# Contents of $vars(ilm_non_sdc_file)" + puts $op "#" + while {[gets $fhr line]>=0} { + puts $op " $line" + } + close $fhr + puts $op "# -------------------------------------------" + set vars(save_ilm_non_sdc_file) $vars(ilm_non_sdc_file) + unset vars(ilm_non_sdc_file) + } + if {[info exists vars(derate_tcl)]} { + puts $op "source $vars(derate_tcl)" + } else { + foreach corner $vars(delay_corners) { + puts $op $command($corner) + } + } + close $op +# if {[lindex [split $vars(version) "."] 0] <= 10} { +# append commands "loadTimingCon -ilmNonSdcFile .ilm_non_sdc_file.tcl\n" +# } else { +# append commands "setIlmNonSdcConstraintFile .ilm_non_sdc_file.tcl\n" +# } + } else { + if {[info exists vars(derate_tcl)]} { + append commands [FF::source_plug derate_tcl] + append commands "\n" + } else { + append commands "set active_corners \[all_delay_corners\]\n" + foreach corner $vars(delay_corners) { + if {$command($corner) != ""} { + append commands "if {\[lsearch \$active_corners $corner\] != -1} {\n" + append commands $command($corner) + append commands "}\n" + } + } + } + } + } else { + if {[info exists vars(derate_tcl)]} { + append commands [FF::source_plug derate_tcl] + append commands "\n" + } + } + } + "minmax" { + + set corners(min) $vars($vars(default_hold_view),delay_corner) + set corners(max) $vars($vars(default_setup_view),delay_corner) + + ################################################################################ + # Derate timing if derating factors are defined + ################################################################################ + foreach object "cell net" { + foreach corner "min max" { + foreach type "data clock" { + foreach mode "early late" { + if {[info exists vars($corners($corner),${type}_${object}_${mode})]} { + append commands "set_timing_derate -$corner -$type -${object}_delay -$mode $vars($corners($corner),${type}_${object}_${mode})\n" + } + if {[info exists vars($corners($corner),${object}_${type}_${mode})]} { + append commands "set_timing_derate -$corner -$type -${object}_delay -$mode $vars($corners($corner),${object}_${type}_${mode})\n" + } + } + } + } + } + foreach corner "min max" { + foreach mode "early late" { + if {[info exists vars($corners($corner),cell_check_${mode})]} { + append commands "set_timing_derate -cell_check -$mode $vars($corners($corner),cell_check_${mode})\n" + } + if {[info exists vars($corners($corner),check_cell_${mode})]} { + append commands "set_timing_derate -cell_check -$mode $vars($corners($corner),check_cell_${mode})\n" + } + } + } + } + default { + puts " INVALID OPTION ... MUST BE EITHER minmax OR mmmc" + } + } + if {[lindex [split $vars(version) "."] 0] > 10} { + set op [open $vars(script_dir)/timingderate.sdc w] + puts $op $commands + close $op + if {!$vars(novus) && ([file tail [file dirname [pwd]]] != "$vars(partition_dir)")} { + set commands "source $vars(script_dir)/timingderate.sdc\n" + } + } + return $commands + } + ##################################################################################### + # The code below updates timing depending on whether the current module is + # - top partition in a hierarchical flow + # - partition in a hierarchical flow + # - chip or block in a flat flow + # Timing is updated by incrementally adding the vars(incr_cts_sdc) to each + # constraint mode that has one defined + ##################################################################################### + + proc update_timing {{type mmmc} {switch_to_propagated true}} { + + global vars + + if {![info exists vars(constraint_modes)]} { + return + } + + set commands "puts \" UPDATING TIMING ...\"\n" + + set ptn [file tail [pwd]] + set parent [file tail [file dirname [pwd]]] + set update true + set top false + if {[info exists vars(partition_list)] && ($parent == "$vars(partition_dir)")} { + if {[lsearch $vars(partition_list) $ptn] != -1} { +# set ilm false + set update false + } else { + set top true + } + } + +# append commands "# ILM $vars(ilm), UPDATE $update\n" + + if {$switch_to_propagated} { + append commands "set op \[open prop.sdc w\]\n" + append commands "puts \$op \"set_propagated_clock \\\[all_clocks\\\]\"\n" + if {$vars(ilm)} { + if {$vars(flat) != "none"} { + append commands [FF_EDI::get_clock_ports] + } else { + append commands "set clock_ports \[FF_EDI::get_clock_ports\]\n" + } + append commands "if {\[llength \$clock_ports\] > 0} {\n" + append commands " foreach port \$clock_ports {\n" + append commands " puts \$op \"set_propagated_clock \$port\"\n" + append commands " }\n" + append commands "}\n" + } + append commands "close \$op\n" + } + + switch $type { + + "minmax" { + if {$vars(ilm) && $update} { + if {[info exists vars(incr_cts_sdc)]} { + foreach file $vars(incr_cts_sdc) { + append commands "loadTimingCon -ilm -incr $file\n" + } + } elseif {[info exists vars(post_cts_sdc)]} { + append command "unloadTimingCon\n" + append commands "loadTimingCon [lindex $vars(post_cts_sdc) 0]\n" + foreach sdc [lrange $vars(post_cts_sdc) 1 end] { + append commands "loadTimingCon -ilm -incr $sdc\n" + } + } + if {$switch_to_propagated} { + append commands "loadTimingCon -ilm -incr prop.sdc\n" + } + } else { + if {$update} { + if {[info exists vars(incr_cts_sdc)]} { + foreach file $vars(incr_cts_sdc) { + append commands "loadTimingCon -incr $file\n" + } + } elseif {[info exists vars(post_cts_sdc)]} { + append commands "unloadTimingCon\n" + append commands "loadTimingCon [lindex $vars(post_cts_sdc) 0]\n" + foreach sdc [lrange $vars(post_cts_sdc) 1 end] { + append commands "loadTimingCon -incr $sdc\n" + } + } + } + if {$switch_to_propagated} { + append commands "loadTimingCon -incr prop.sdc\n" + } + } + } + "mmmc" { +# if {[info exists vars(update_io_latency)] && $vars(update_io_latency)} { +# update_io_latency +# } + if {$switch_to_propagated} { + set prop_sdc "prop.sdc" + } else { + set prop_sdc "" + } + + foreach mode $vars(constraint_modes) { + append commands "if {\[lsearch \[all_constraint_modes\] $mode\] != -1} {\n" + if {$update} { + if {[info exists vars($mode,incr_cts_sdc)]} { + if {$vars(ilm)} { + append commands "set vars($mode,post_cts_sdc_list) \[concat \[get_constraint_mode $mode -ilm_sdc_files\] $vars($mode,incr_cts_sdc) $prop_sdc\]\n" + } else { + append commands "set vars($mode,post_cts_sdc_list) \[concat \[get_constraint_mode $mode -sdc_files\] $vars($mode,incr_cts_sdc) $prop_sdc\]\n" + } + if {[info exists vars($mode,post_cts_sdc)]} { + puts " WARNING: BOTH vars($mode,incr_cts_sdc) AND vars($mode,post_cts_sdc) ARE DEFINED ..." + puts " USING vars($mode,incr_cts_sdc)" + } + } else { + if {[info exists vars($mode,post_cts_sdc)]} { + append commands "set vars($mode,post_cts_sdc_list) \[concat $vars($mode,post_cts_sdc) $prop_sdc\]\n" + } else { + if {$vars(ilm)} { + if {$vars(cts_engine) == "cts" || ($vars(step) == "assemble")} { + append commands "set vars($mode,post_cts_sdc_list) \[concat \[get_constraint_mode $mode -ilm_sdc_files\] $prop_sdc\]\n" + } else { + if {$vars(step) != "assemble"} { + return "" + } + } + } else { + if {$vars(cts_engine) == "cts" || ($vars(step) == "assemble")} { + append commands "set vars($mode,post_cts_sdc_list) \[concat \[get_constraint_mode $mode -sdc_files\] $prop_sdc\]\n" + } else { + if {$vars(step) != "assemble"} { + return "" + } + } + } + } + } + } else { + if {$vars(ilm)} { + if {$vars(cts_engine) == "cts"} { + append commands "set vars($mode,post_cts_sdc_list) \[concat \[get_constraint_mode $mode -ilm_sdc_files\] $prop_sdc\]\n" + } else { + if {[regexp "^assemble" $vars(step)]} { + return "" + } + } + } else { + if {$vars(cts_engine) == "cts"} { + append commands "set vars($mode,post_cts_sdc_list) \[concat \[get_constraint_mode $mode -sdc_files\] $prop_sdc\]\n" + } else { +# if {[regexp "^assemble" $vars(step)]} { + return "" + } + } + } + } + append commands "}\n" + } + + if {!$vars(ilm)} { + append commands "set restore \[get_db timing_defer_mmmc_obj_updates\]\n" + append commands "set_db timing_defer_mmmc_obj_updates true\n" + } + + if {$vars(ilm)} { + exec /bin/touch empty.sdc + append commands "foreach mode \[all_constraint_modes\] {\n" + append commands " if {\[info exists vars(\$mode,post_cts_sdc_list)\]} {\n" + append commands " update_constraint_mode -name \$mode -ilm_sdc_files \$vars(\$mode,post_cts_sdc_list)\n" + append commands " } else {\n" + append commands " foreach view \[all_analysis_views] {\n" + append commands " set m \[regsub _\$view \$mode \"\"\]\n" + append commands " if {\[info exists vars(\$m,post_cts_sdc_list)\]} {\n" + append commands " update_constraint_mode -name \$mode -ilm_sdc_files \$vars(\$m,post_cts_sdc_list)\n" + append commands " }\n" + append commands " } \n" + append commands " } \n" + append commands "} \n" + } else { + append commands "foreach mode \[all_constraint_modes\] \{\n" + append commands " if \{\[info exists vars(\$mode,post_cts_sdc_list)\]\} \{\n" + append commands " update_constraint_mode -name \$mode -sdc_files \$vars(\$mode,post_cts_sdc_list)\n" + append commands " \} else \{\n" + append commands " foreach view \[all_analysis_views] \{\n" + append commands " set m \[regsub _\$view \$mode \"\"\]\n" + append commands " if \{\[info exists vars(\$m,post_cts_sdc_list)\]\} \{\n" + append commands " update_constraint_mode -name \$mode -sdc_files \$vars(\$m,post_cts_sdc_list)\n" + append commands " \}\n" + append commands " \} \n" + append commands " \} \n" + append commands "\} \n" + } + + if {!$vars(ilm)} { + append commands "set_analysis_view -update_timing\n" + append commands "set_db timing_defer_mmmc_obj_updates \$restore\n" + } + set this_index [lsearch $vars(steps) $vars(step)] + set prior [lindex $vars(steps) [expr $this_index - 1]] + # BCL: Added subst around vars(dbs_dir) + if {[file isfile [subst $vars(dbs_dir)]/$prior.enc.dat/mmmc/pathgroup.sdc]} { + # BCL: Added subst around vars(dbs_dir) + set vars(path_group_sdc) [subst $vars(dbs_dir)]/$prior.enc.dat/mmmc/pathgroup.sdc + append commands "ff_procs::load_path_groups $vars(path_group_sdc)\n" + } + } + default { + puts $vars(codgen_log) " INVALID OPTION ... MUST BE EITHER minmax OR mmmc" + } + } + return $commands + } + + proc initialize_timing {{type mmmc}} { + + global vars + global env + global init + global warnings + +# if {[info exists vars(view_definition_tcl)]} { +# return "" +# } + + if {$vars(verbose)} { + append commands "#\n" + append commands "# INITIALIZING [string toupper $type] TIMING\n" + append commands "#\n" + } + + if {$vars(debug)} { + puts " Executing proc: initialize_timing ..." + } + + switch $type { + minmax { +# if {([llength $vars(rc_corners)] > 1)} { +# puts " WARNING: THE \"default\" FLOW SHOULD ONLY HAVE A SINGLE RC CORNER" +# puts " BUT [llength $vars(rc_corners)] CORNERS ARE DEFINED ($vars(rc_corners))" +# } + + ################################################################### + # Define RC corners and set the appropriate temperatures. This + # requires that the cap tables use -best/-worst syntax in the + # configuration file. Scaling factors should be derived using + # Ostrich Values for the default timing environment is derived + # from the default setup and hold analysis views + ################################################################### + + set corners(min) $vars($vars(default_hold_view),delay_corner) + set corners(max) $vars($vars(default_setup_view),delay_corner) + set corner $vars($corners(max),rc_corner) + +# if {[info exists env(FF_KIT_PATH)]} { + if {![catch {set max $vars($vars($corners(max),rc_corner),T)}] && + ![catch {set min $vars($vars($corners(min),rc_corner),T)}]} { + append commands \ + "defineRCCorner -late worst $max -early best $min\n" + } +# } else { +# puts " USING SINGLE RC CORNER $vars($corners(max),rc_corner)" +# if {[info exists vars($vars($corners(max),rc_corner),T)]} { +# setExtractRCMode -scOpTemp $vars($vars($corners(max),rc_corner),T) +# } +# } + + ################################################################### + # Set scaling factors ... for pre-route optimization, the detailed + # cap factor is set to the detailed clock cap factor. This will + # be reset post-route + ################################################################### + + set args "" + if {![catch {set arg $vars($corner,pre_route_res_factor)}]} { + append args " -preRoute_res $arg" + } + if {![catch {set arg $vars($corner,pre_route_cap_factor)}]} { + append args " -preRoute_cap $arg" + } + if {![catch {set arg $vars($corner,pre_route_clk_res_factor)}]} { + append args " -preRoute_clkres $arg" + } + if {![catch {set arg $vars($corner,pre_route_clk_cap_factor)}]} { + append args " -preRoute_clkcap $arg" + } + if {![catch {set arg $vars($corner,post_route_res_factor)}]} { + append args " -postRoute_res " + if {[llength $arg] > 1} { + append args "\"[lindex $arg 2],[lindex $arg 1],[lindex $arg 0]\"" + } else { + append args $arg + } + } + if {![catch {set arg $vars($corner,post_route_cap_factor)}]} { + append args " -postRoute_cap " + if {[llength $arg] > 1} { + append args "\"[lindex $arg 2],[lindex $arg 1],[lindex $arg 0]\"" + } else { + append args $arg + } + } + if {![catch {set arg $vars($corner,post_route_clk_res_factor)}]} { + append args " -postRoute_clkres " + if {[llength $arg] > 1} { + append args "\"[lindex $arg 2],[lindex $arg 1],[lindex $arg 0]\"" + } else { + append args $arg + } + } + if {![catch {set arg $vars($corner,post_route_clk_cap_factor)}]} { + append args " -postRoute_clkcap " + if {[llength $arg] > 1} { + append args "\"[lindex $arg 2],[lindex $arg 1],[lindex $arg 0]\"" + } else { + append args $arg + } + } + if {![catch {set arg $vars($corner,post_route_xcap_factor)}]} { + append args " -postRoute_xcap " + if {[llength $arg] > 1} { + append args "\"[lindex $arg 2],[lindex $arg 1],[lindex $arg 0]\"" + } else { + append args $arg + } + } + if {$args != ""} { + set command "setRCFactor $args\n" + append commands [FF::wrap_command $vars(step),set_rc_factor $command] + } + set command [FF_NOVUS::derate_timing minmax] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } + mmmc { + if {$vars(verbose)} { + append commands "#\n" + append commands "# CREATING RC CORNERS ...\n" + append commands "#\n" + } + foreach rc $vars(rc_corners) { +# set command "\n" + set command "" + set non_command "" + if {[info exists vars($rc,scale_tcl)]} { + append command "create_rc_corner -name $rc" +# append command " -cap_table $vars($rc,cap_table) " + foreach option "cap_table temperature qrc_tech" { + if {![catch {set arg $vars($rc,$option)}]} { + append command " -$option $arg" + } + } + append command "\n" + append command [FF::source_plug "$rc,scale_tcl"] + } else { + append command "create_rc_corner -name $rc" + foreach option "cap_table temperature qrc_tech" { + if {![catch {set arg $vars($rc,$option)}]} { + append command " -$option $arg" + } + } +# append command "\n" +# append command " -cap_table $vars($rc,cap_table) " + if {![catch {set arg $vars($rc,pre_route_res_factor)}]} { + append command " -pre_route_res $arg" + } else { + append non_command "# -pre_route_res \$vars($rc,pre_route_res_factor)\n" + } + if {![catch {set arg $vars($rc,pre_route_cap_factor)}]} { + append command " -pre_route_cap $arg" + } else { + append non_command "# -pre_route_cap \$vars($rc,pre_route_cap_factor)\n" + } + if {![catch {set arg $vars($rc,pre_route_clk_res_factor)}]} { + append command " -pre_route_clock_res $arg" + } else { + append non_command "# -pre_route_clock_res \$vars($rc,pre_route_clk_res_factor)\n" + } + if {![catch {set arg $vars($rc,pre_route_clk_cap_factor)}]} { + append command " -pre_route_clock_cap $arg" + } else { + append non_command "# -pre_route_clock_cap \$vars($rc,pre_route_clk_cap_factor)\n" + } + if {![catch {set arg $vars($rc,post_route_res_factor)}]} { + append command " -post_route_res " + if {[llength $arg] > 1} { + append command "\"$arg\"" + } else { + append command $arg + } + } else { + append non_command "# -post_route_res \$vars($rc,post_route_res_factor)\n" + } + if {![catch {set arg $vars($rc,post_route_cap_factor)}]} { + append command " -post_route_cap " + if {[llength $arg] > 1} { + append command "\"$arg\"" + } else { + append command $arg + } + } else { + append non_command "# -post_route_res \$vars($rc,post_route_cap_factor)\n" + } + if {![catch {set arg $vars($rc,post_route_clk_res_factor)}]} { + append command " -post_route_clock_res " + if {[llength $arg] > 1} { + append command "\"$arg\"" + } else { + append command $arg + } + } else { + append non_command "# -post_route_clock_res \$vars($rc,post_route_clk_res_factor)\n" + } + if {![catch {set arg $vars($rc,post_route_clk_cap_factor)}]} { + append command " -post_route_clock_cap " + if {[llength $arg] > 1} { + append command "\"$arg\"" + } else { + append command $arg + } + } else { + append non_command "# -post_route_clock_cap \$vars($rc,post_route_clk_cap_factor)\n" + } + if {![catch {set arg $vars($rc,post_route_cross_cap)}]} { + append command " -post_route_cross_cap " + if {[llength $arg] > 1} { + append command "\"$arg\"" + } else { + append command $arg + } + } else { + append non_command "# -post_route_cross_cap \$vars($rc,post_route_xcap_factor)\n" + } + } + append command "\n" + append commands [FF::wrap_command $vars(step),create_rc_corner $command] + if {$non_command != ""} { + append commands "#------------------------------------------------\n" + append commands "# Additional (unused) options ....\n" + append commands "#------------------------------------------------\n" + append commands $non_command + append commands "#------------------------------------------------\n" + } + } + if {![info exists vars(view_definition_tcl)]} { + if {![info exists vars(cpf_file)] || ([info exists vars(cpf_file)] && !$vars(cpf_timing))} { + ################################################################ + # CPF_TIMING == FALSE + ################################################################ + set command "" + if {$vars(verbose)} { + append command "#\n" + append command "# CREATING LIBRARY SETS ...\n" + append command "#\n" + } + append commands $command + foreach set $vars(library_sets) { + set command "" + append command "create_library_set -name $set -timing \[list " + append command "$vars($set,timing) " + append command "\]\n" + append commands [FF::wrap_command $vars(step),create_library_set $command] + } + if {[info exists vars(opconds)]} { + if {$vars(verbose)} { + append command "#\n" + append command "# CREATING OPERATING CONDITIONS ...\n" + append command "#\n" + } + foreach opcond $vars(opconds) { + set command "create_opcond -name $opcond" + # We already checked so we know these options exist + set map(P) process + set map(V) voltage + set map(T) temperature + foreach option "P V T" { + append command " -$map($option) $vars($opcond,$option)" + } + append command "\n" + append commands [FF::wrap_command $vars(step),create_opcond $command] + } + } + set command "" + if {$vars(verbose)} { + append command "#\n" + append command "# CREATING DELAY CORNERS ...\n" + append command "#\n" + } + append commands $command + foreach c $vars(delay_corners) { + set command "create_timing_condition -name t_$c" + set dcommand "create_delay_corner -name $c" + if {![catch {set arg $vars($c,library_set)}]} { + append command " -library_set $arg" + } elseif {![catch {set early $vars($c,early_library_set)}] && + ![catch {set late $vars($c,late_library_set)}]} { + append command " -early_library_set $early" + append command " -late_library_set $late" + } else { + puts " ERROR: Library sets for timing condition $c not defined properly" + } + append dcommand " -rc_corner $vars($c,rc_corner)" + if {![catch {set opcond $vars($c,opcond)}] && ![catch {set library $vars($c,opcond_library)}]} { + append command " -opcond_library $library" + append command " -opcond $opcond" + } else { + if {![catch {set early $vars($c,early_opcond_library)}] && + ![catch {set late $vars($c,late_opcond_library)}]} { + append command " -early_opcond_library $early" + append command " -late_opcond_library $late" + } + if {![catch {set early_opcond $vars($c,early_opcond)}] && + ![catch {set late_opcond $vars($c,late_opcond)}]} { + append command " -early_opcond $early_opcond" + append command " -late_opcond $late_opcond" + } + } + append command "\n" + append dcommand " -timing_condition {" + if {[catch {set domains $vars($c,power_domains)}]} { + append dcommand "t_$c" + } else { + set attribute_list "library_set opcond_library opcond irdrop_file \ + late_library_set early_library_set \ + late_opcond_library early_opcond_library \ + late_opcond early_opcond late_irdrop_file early_irdrop_file" + foreach domain $domains { + append dcommand " t_$c" + append dcommand " $domain@t_$c" + # append command " update_delay_corner -name $c -power_domain \"$domain\"" + # foreach attr $attribute_list { + # if {[info exists vars($c,$domain,$attr)]} { + # append command " -$attr $vars($c,$domain,$attr)" + # } + # } + } + # if {![catch {set opcond $vars($domain,opcond)}] && + # ![catch {set library $vars($domain,opcond_library)}]} { + # append command " -opcond_library $library" + # append command " -opcond $opcond" + # } + } + append dcommand " }\n" + append commands [FF::wrap_command $vars(step),create_timing_condition $command] + append commands [FF::wrap_command $vars(step),create_delay_corner $dcommand] + } + set command "" + if {$vars(verbose)} { + append command "#\n" + append command "# CREATING CONSTRAINT MODES ...\n" + append command "#\n" + } + append commands $command + + # Variable ccommand captures the constraint creation for the view_definition.tcl + # Variable ucommand capture the constraint updates for hier/ilm flows + #------------------------------------------------------------------------------------ + set ccommand "" + + set active_views [list] + set active_modes [list] + + # Get modes actually used ... (changed from active to all views) + foreach view [concat $vars(setup_analysis_views) $vars(hold_analysis_views)] { + if {[lsearch $active_views $view] == -1} { + # lappend active_views $view + if {[lsearch $active_modes $vars($view,constraint_mode)] == -1} { + lappend active_modes $vars($view,constraint_mode) + } + } + } + + set flatten_ilm 0 + foreach constraint_mode $active_modes { + if {!$vars(ilm)} { + # Default flat flow + if {[info exists vars($constraint_mode,pre_cts_sdc)]} { + set command "create_constraint_mode -name $constraint_mode " + append command "-sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\] " + append command "\n" + append ccommand [FF::wrap_command $vars(step),create_constraint_mode $command] + } else { + if {![info exists vars($constraint_mode,synth_sdc)] && $vars(rc)} { + puts "Constraint file not found for $constraint_mode ..." + } + } + if {$vars(rc)} { + if {[info exists vars($constraint_mode,synth_sdc)]} { + set command "create_constraint_mode -name $constraint_mode " + append command "-sdc_files \[list $vars($constraint_mode,synth_sdc)\] " + append command "\n" + append ccommand [FF::wrap_command $vars(step),create_constraint_mode $command] + set vars(default_synthesis_mode) $constraint_mode + } else { + if {![info exists vars($constraint_mode,pre_cts_sdc)]} { + puts "Constraint file not found for $constraint_mode ..." + } + } + if {![info exists vars(default_synthesis_mode)]} { + puts " : Please define a synth_sdc for one of the constraint modes" + exit + } + } + } else { + # ILM flow + if {[info exists vars(partition_list)]} { + set sdcs "" + # Hierarchy + ILMs + if {[info exists vars($constraint_mode,pre_cts_ilm_sdc)]} { + # append command "-sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\] " + exec /bin/touch empty.sdc + append sdcs "-sdc_files empty.sdc " + append sdcs "-ilm_sdc_files \[list $vars($constraint_mode,pre_cts_ilm_sdc)\]\n" + } else { + exec /bin/touch empty.sdc + append sdcs "-sdc_files empty.sdc " + append sdcs "-ilm_sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\]\n" + } + if {$vars(top)} { + if {![info exists ucommand]} { set ucommand ""} + set command "update_constraint_mode -name $constraint_mode " + append command $sdcs + append ucommand [FF::wrap_command $vars(step),update_constraint_mode $command] + set dynamic_update 1 + # continue + } else { + set command "create_constraint_mode -name $constraint_mode " + append command $sdcs + append ccommand [FF::wrap_command $vars(step),create_constraint_mode $command] + } + } else { + # ILM only + set command "create_constraint_mode -name $constraint_mode " + if {[info exists vars($constraint_mode,pre_cts_ilm_sdc)]} { + exec /bin/touch empty.sdc + append sdcs "-sdc_files empty.sdc " + append sdcs "-ilm_sdc_files \[list $vars($constraint_mode,pre_cts_ilm_sdc)\]\n" + } else { + exec /bin/touch empty.sdc + append sdcs "-sdc_files empty.sdc " + append sdcs "-ilm_sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\]\n" + } + append command $sdcs + append ccommand [FF::wrap_command $vars(step),create_constraint_mode $command] + } + } + } + + append commands $ccommand + + if {[info exists dynamic_update] && $dynamic_update} { + # set command "" + # append command "foreach mode \[all_constraint_modes\] {\n" + # append command " update_constraint_mode -name \$mode -sdc_files empty.sdc \\\n" + # append command " -ilm_sdc_files \[get_constraint_mode \$mode -sdc_files\]\n" + # append command "}\n" + # append ucommand [FF::wrap_command $vars(step),update_constraint_mode $command] + + set command "" + append command "foreach mode \[all_constraint_modes] \{\n" + append command " foreach view \[all_analysis_views] \{\n" + append command " set m \[regsub _\$view \$mode \"\"\]\n" + append command " if \{( \$m != \$mode ) && ( \[lsearch \[all_constraint_modes\] \$m\] != -1) \} \{\n" + append command " update_constraint_mode -name \$mode -sdc_files empty.sdc -ilm_sdc_files \[get_constraint_mode \$m -ilm_sdc_files\]\n" + append command " \}\n" + append command " \} \n" + append command "\} \n" + append ucommand [FF::wrap_command $vars(step),dynamic_update $command] + + if {$vars(ilm)} { + append ucommand [FF::wrap_command $vars(step),flatten_ilm "flatten_ilm\n"] + } + } + + if {($vars(user_mode) == "hier") && ![info exists vars(view_definition_tcl)]} { + if {($vars(step) == "assemble") || ($vars(step) == "rebudget") || ($vars(step) == "assemble_flexilm") || ($vars(step) == "partition_place") || ($vars(step) == "model_gen")} { + # Create mmmc file for partition and assemble step + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set mmmc_file $vars(script_dir)/incr_view_definition.tcl + set op [open $mmmc_file w] + puts $op [FF::pretty_print $commands 1] + close $op + } else { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file $vars(view_definition_tcl) + } else { + set mmmc_file $vars(script_dir)/view_definition.tcl + set op [open $mmmc_file w] + puts $op [FF::pretty_print $commands 1] + close $op + } + } + #return $commands + } else { + # Return only constraint mode updates for top level flow + if {[info exists ucommand]} { + return $ucommand + } + } + } else { + if {[info exists vars(view_definition_tcl)]} { + if {[info exists ucommand]} { + return $ucommand + } + } + } + if {![info exists vars(power_analysis_view)]} { + set vars(power_analysis_view) "" + } + set vars(all_analysis_views) \ + [lsort -unique [concat $vars(setup_analysis_views) \ + $vars(hold_analysis_views) \ + $vars(power_analysis_view)]] + set command "" + if {$vars(verbose)} { + append command "#\n" + append command "# CREATING ANALYSIS VIEWS ...\n" + append command "#\n" + } + foreach view $vars(all_analysis_views) { +# append command "if {\[lsearch \[all_analysis_views\] $view\] == -1} {\n" + if {[info exists vars(default_synthesis_mode)] && ($vars($view,constraint_mode) == $vars(default_synthesis_mode))} { + set vars(default_synthesis_view) $view + } + append command "create_analysis_view" + append command " -name $view" + append command " -constraint_mode $vars($view,constraint_mode)" + append command " -delay_corner $vars($view,delay_corner)\n" +# append command "}\n" + } + append commands [FF::wrap_command $vars(step),create_analysis_view $command] + if {![info exists vars(gen_postload)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "" + foreach c $vars(delay_corners) { + if {![catch {set domains $vars($c,power_domains)}]} { + foreach domain $domains { + append command " update_delay_corner -name $c -power_domain \"$domain\"\n" + # if {![catch {set opcond $vars($domain,opcond)}] && + # ![catch {set library $vars($domain,opcond_library)}]} { + # append command " -opcond_library $library" + # append command " -opcond $opcond" + # } + } + } + } + append commands [FF::wrap_command init,update_delay_corner $command] + } + } + } else { + ################################################################ + # CPF_TIMING == TRUE + # Since the delay corner names are derived from the CPF, they + # are not known. However, they can be retrieved from the + # analysis_views + ################################################################ + + # if {$vars(verbose)} { + # append commands "# UPDATING DELAY CORNERS ...\n" + # } + if {![info exists vars(delay_corners)]} { + set vars(delay_corners) [FF::[get_by_suffix vars ",rc_corner"]] + } + set command "" + foreach corner $vars(delay_corners) { + append command "if {\[lsearch -exact \[all_delay_corners\] $corner\] != -1} {\n" + append command " update_delay_corner -name $corner -rc_corner $vars($corner,rc_corner)\n" + append command "}\n" + } + append commands [FF::wrap_command $vars(step),update_delay_corner $command] + ################################################################### + # Update constraints modes if an ILM flow + ################################################################### + set ccommand "" + foreach constraint_mode $vars(constraint_modes) { + if {$vars(ilm)} { + if {[info exists vars(partition_list)]} { + set command "update_constraint_mode -name $constraint_mode " + } else { + set command "create_constraint_mode -name $constraint_mode " + } + if {[info exists vars($constraint_mode,pre_cts_ilm_sdc)]} { + append command "-sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\] " + append command "-ilm_sdc_files \[list $vars($constraint_mode,pre_cts_ilm_sdc)\] " + } else { + exec /bin/touch empty.sdc + append command "-sdc_files empty.sdc " + append command "-ilm_sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\] " + } + append command "\n" + if {[info exists vars(partition_list)]} { + append ccommand [FF::wrap_command $vars(step),update_constraint_mode $command] + } else { + append ccommand [FF::wrap_command $vars(step),create_constraint_mode $command] + } + } + } + + ################################################################### + # Return early for partition implementation flows ... + ################################################################### + if {(($vars(mode) == "hier") || ([info exists vars(hier)] && $vars(hier))) && ($vars(step) != "partition")} { + set commands $ccommand + return $commands + } else { + append commands $ccommand + } + } + } + + ################################################################### + # Update library_sets with SI libraries if defined + ################################################################### + +# if {$vars(verbose)} { +# append commands "# UPDATING LIBRARY SETS ...\n" +# } + set command "" + foreach set $vars(library_sets) { + if {([info exists vars($set,si)] && ($vars($set,si) != "")) || \ + ([info exists vars($set,socv)] && ($vars($set,socv) != "")) || \ + ([info exists vars($set,aocv)] && ($vars($set,aocv) != ""))} { + append command "update_library_set -name $set" + } + if {[info exists vars($set,socv)] && ($vars($set,socv) != "")} { + append command " -socv \[list" + foreach file $vars($set,socv) { + append command " $file" + } + append command "\]" + } + if {[info exists vars($set,aocv)] && ($vars($set,aocv) != "")} { + append command " -aocv \[list" + foreach file $vars($set,aocv) { + append command " $file" + } + append command "\]" + } + if {[info exists vars($set,si)] && ($vars($set,si) != "")} { + append command " -si \[list" + foreach file $vars($set,si) { + append command " $file" + } + append command "\]" + } + append command "\n" + } + append commands [FF::wrap_command $vars(step),update_library_set $command] + +# if {$vars(flow) != "mmmc"} { +# append commands [FF_NOVUS::update_timing mmmc] +# } +# set command [FF_NOVUS::derate_timing mmmc] +# append commands [FF::wrap_command $vars(step),derate_timing $command] + + ################################################################### + # Define setup / hold analysis views and enable the default views + # for each + ################################################################### + + append commands "set_analysis_view" + append commands " -setup \[list $vars(active_setup_views)\]" + append commands " -hold \[list $vars(active_hold_views)\]\n" + file mkdir $vars(script_dir) + if {[lindex [split $vars(version) "."] 0] <= 10} { + if {$vars(flat) != "full"} { + set op [open $vars(script_dir)/mmmc.tcl w] + puts $op [FF::pretty_print $commands 1] + close $op + set commands "source \$vars(script_dir)/mmmc.tcl\n" + } + } else { + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set mmmc_file $vars(script_dir)/incr_view_definition.tcl + set op [open $mmmc_file w] + puts $op [FF::pretty_print $commands 1] + close $op + } else { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file $vars(view_definition_tcl) + } else { + set mmmc_file $vars(script_dir)/view_definition.tcl + set vars(view_definition_tcl) $mmmc_file + set op [open $mmmc_file w] + puts $op [FF::pretty_print $commands 1] + close $op + } + } + return + } + } + default { + puts " INVALID OPTION ... MUST BE EITHER minmax OR mmmc" + } + } + return $commands + } + + proc update_rc_corners {} { + + global vars + + foreach rc_corner [all_rc_corners] { + if {$rc_corner != "default_rc_corner"} { + set update false + set command "update_rc_corner -name $rc_corner " + if {[get_rc_corner $rc_corner -cap_table] != $vars($rc_corner,cap_table)} { + set update true + append command "-cap_table $vars($rc_corner,cap_table) " + } + if {[get_rc_corner $rc_corner -preRoute_res] != $vars($rc_corner,pre_route_res_factor)} { + set update true + append command "-preRoute_res $vars($rc_corner,pre_route_res_factor) " + } + if {[get_rc_corner $rc_corner -preRoute_cap] != $vars($rc_corner,pre_route_cap_factor)} { + set update true + append command "-preRoute_cap $vars($rc_corner,pre_route_cap_factor) " + } + if {[get_rc_corner $rc_corner -postRoute_res] != $vars($rc_corner,post_route_res_factor)} { + set update true + append command "-postRoute_res \"$vars($rc_corner,post_route_res_factor)\" " + } + if {[get_rc_corner $rc_corner -postRoute_cap] != $vars($rc_corner,post_route_cap_factor)} { + set update true + append command "-postRoute_cap \"$vars($rc_corner,post_route_cap_factor)\" " + } + if {[get_rc_corner $rc_corner -preRoute_clkres] != $vars($rc_corner,pre_route_clk_res_factor)} { + set update true + append command "-preRoute_clkres $vars($rc_corner,pre_route_clk_res_factor) " + } + if {[get_rc_corner $rc_corner -preRoute_clkcap] != $vars($rc_corner,pre_route_clk_cap_factor)} { + set update true + append command "-preRoute_clkcap $vars($rc_corner,pre_route_clk_cap_factor) " + } + if {[get_rc_corner $rc_corner -postRoute_clkres] != $vars($rc_corner,post_route_clk_res_factor)} { + set update true + append command "-postRoute_clkres \"$vars($rc_corner,post_route_clk_res_factor)\" " + } + if {[get_rc_corner $rc_corner -postRoute_clkcap] != $vars($rc_corner,post_route_clk_cap_factor)} { + set update true + append command "-postRoute_clkcap \"$vars($rc_corner,post_route_clk_cap_factor)\" " + } + if {[get_rc_corner $rc_corner -postRoute_xcap] != $vars($rc_corner,post_route_xcap_factor)} { + set update true + append command "-postRoute_xcap \"$vars($rc_corner,post_route_xcap_factor)\" " + } + foreach option "T qx_tech_file qx_conf_file qx_lib_file" { + if {[info exists vars($rc_corner,$option)]} { + if {[get_rc_corner $rc_corner -$option] != $vars($rc_corner,$option)} { + set update true + append command "-$option $vars($rc_corner,$option) " + } + } + } + if {$update} { + uplevel #0 eval $command + } + } + } + } + proc reset_rc_corners {} { + + global vars + + foreach corner $vars(rc_corners) { + update_rc_corner -name $corner \ + -preRoute_res 1.0 \ + -preRoute_clkres 1.0 \ + -preRoute_cap 1.0 \ + -preRoute_clkcap 1.0 \ + -postRoute_res 1.0 \ + -postRoute_clkres 1.0 \ + -postRoute_cap 1.0 \ + -postRoute_clk_ap 1.0 \ + -postRoute_xcap 1.0 + } + } + proc add_views {} { + + global vars + + puts " CREATING RC CORNERS ..." + foreach rc_corner $vars(rc_corners) { + if {[lsearch [all_rc_corners] $rc_corner] == -1} { + set command "create_rc_corner -name $rc_corner " + append command "-cap_table $vars($rc_corner,cap_table)\] " + append command "-preRoute_res $vars($rc_corner,pre_route_res_factor) " + append command "-preRoute_clkres $vars($rc_corner,pre_route_clk_res_factor) " + append command "-preRoute_cap $vars($rc_corner,pre_route_cap_factor) " + append command "-preRoute_clkcap $vars($rc_corner,pre_route_clk_cap_factor) " + append command "-postRoute_res \"$vars($rc_corner,post_route_res_factor)\" " + append command "-postRoute_clkres \"$vars($rc_corner,post_route_clk_res_factor)\" " + append command "-postRoute_cap \"$vars($rc_corner,post_route_cap_factor)\" " + append command "-postRoute_clkcap \"$vars($rc_corner,post_route_clk_cap_factor)\" " + append command "-postRoute_xcap $vars($rc_corner,post_route_xcap_factor) " + foreach option "T qx_tech_file qx_conf_file qx_lib_file" { + if {[info exists vars($rc_corner,$option)]} { + append command "-$option $vars($rc_corner,$option) " + } + } + uplevel #0 eval $command + } + } + + if {![FF::is_lp_flow] || \ + ([FF::is_lp_flow] && ([llength [all_analysis_views]] == 2))} { + + puts " CREATING LIBRARY SETS ..." + foreach library_set $vars(library_sets) { + if {[lsearch [all_library_sets] $library_set] == -1} { + create_library_set -name $library_set \ + -timing $vars($library_set,timing) + } + } + + puts " CREATING DELAY CORNERS ...\n" + foreach delay_corner $vars(delay_corners) { + if {[lsearch [all_delay_corners] $delay_corner] == -1} { + set command "create_delay_corner -name $delay_corner " + append command "-library_set $vars($delay_corner,library_set) " + append command "-rc_corner $vars($delay_corner,rc_corner) " + if {[info exists vars($delay_corner,opcond)] && [info exists vars($delay_corner,opcond_library)]} { + append command "-opcond_library $vars($delay_corner,opcond_library) " + append command "-opcond $vars($delay_corner,opcond) " + } + uplevel #0 eval $command + if {![catch {set domains $vars($c,power_domains)}]} { + set command " update_delay_corner -name $c -power_domains \"$domains\"" + uplevel #0 eval $command + } + } + } + + puts " UPDATING CONSTRAINT MODES ..." + foreach mode $vars(constraint_modes) { + if {[lsearch [all_constraint_modes] $mode] == -1} { + if {[info exists vars($mode,pre_cts_sdc,full)]} { + append commands "create_constraint_mode " + append commands " -name $mode " + append commands " -sdc_files $vars($mode,pre_cts_sdc,full)\n" + } elseif {[info exists vars($mode,pre_cts_sdc)} { + append commands "create_constraint_mode " + append commands " -name $mode " + append commands " -sdc_files $vars($mode,pre_cts_sdc)\n" + } + } + } + + set vars(all_analysis_views) [lsort -uniq [concat $vars(setup_analysis_views) $vars(hold_analysis_views)]] + puts " UPDATING ANALYSIS VIEWS ..." + + foreach analysis_view $vars(all_analysis_views) { + if {[lsearch [all_analysis_views] $analysis_view] == -1} { + create_analysis_view -name $analysis_view \ + -constraint_mode $vars($analysis_view,constraint_mode) \ + -delay_corner $vars($analysis_view,delay_corner) + } + } + } else { + + ############################################################################ + # Since the delay corner names are derived from the CPF, they are not + # known. However, they can be retrieved from the analysis_views + ############################################################################ + puts " UPDATING DELAY CORNERS ..." + foreach corner $vars(delay_corners) { + puts "Updating delay corner $corner with RC Corner $vars($corner,rc_corner) ..." + update_delay_corner -name $corner -rc_corner $vars($corner,rc_corner) + } + } + + ############################################################################ + # Update library_sets with SI libraries if defined + ############################################################################ + puts " UPDATING LIBRARY SETS ..." + foreach library_set $vars(library_sets) { + if {[info exists vars($library_set,si)] && ($vars($library_set,si) != "")} { + update_library_set -name $library_set \ + -si $vars($library_set,si) + } + } + foreach library_set $vars(library_sets) { + if {[info exists vars($library_set,aocv)] && ($vars($library_set,aocv) != "")} { + update_library_set -name $library_set \ + -aocv $vars($library_set,aocv) + } + } + foreach library_set $vars(library_sets) { + if {[info exists vars($library_set,socv)] && ($vars($library_set,socv) != "")} { + update_library_set -name $library_set \ + -socv $vars($library_set,socv) + } + } + + set_interactive_constraint_modes [all_constraint_modes -active] + + puts " DERATING DELAY CORNERS ..." + FF_NOVUS::derate_timing mmmc + +# if {$vars(flow) != "mmmc"} { +# FF_NOVUS::update_timing mmmc +# } + + ############################################################################ + # Define setup / hold analysis views and enable the default views for each + ############################################################################ + set_analysis_view -setup $vars(active_setup_views) -hold $vars(active_hold_views) + set_default_view -setup $vars(default_setup_view) -hold $vars(default_hold_view) + } + + proc get_power_domains_code {} { + + global vars + + set commands "set domains \[list \[get_db power_domains\]\]\n" +# append commands "dbForEachpower_domain \[dbgHead\] domain {\n" +# append commands " if {\[dbGroupHInstList \[dbpower_domainName \$domain\]\] != \"0x0\"} {\n" +# append commands " lappend domains \[dbpower_domainName \$domain\]\n" +# append commands " }\n" +# append commands "}\n" + return $commands + } + + + proc get_clock_ports {} { + + global vars + + set commands "" + + if {!$vars(codegen) || ($vars(codegen) && ($vars(flat) != "none"))} { + + if {$vars(ilm)} { + if {$vars(step) != "cts"} { + append commands "setIlmType -model si\n" + } + } + append commands "set clock_ports \[list\]\n" + append commands "set clocks \[get_clocks *\]\n" + + append commands "foreach_in_collection clock \$clocks {\n" + append commands " set sources \[get_property \$clock sources\]\n" + append commands " foreach_in_collection source \$sources {\n" + append commands " set source_name \[get_property \$source hierarchical_name\]\n" + append commands " set source_type \[get_property \$source object_type\]\n" + append commands " if {\$source_type == \"port\"} {\n" + append commands " lappend clock_ports \$source_name\n" + append commands " }\n" + append commands " }\n" + append commands "}\n" + } else { + append commands "FF::get_clock_ports\n" + } + return $commands + } + + proc add_tie_cells {{mode true} {add true}} { + ######################################################################### + # This procedure inserts tie hi/lo cells based on information in the + # setup.tcl + ######################################################################### + + global vars + global errors + + set commands "" + if {$vars(verbose)} { + append commands "#\n" + append commands "# ADDING TIE CELLS\n" + append commands "#\n" + } + + set args "" + if {[info exists vars(tie_cells,max_distance)]} { + append args "set_db add_tieoffs_max_distance $vars(tie_cells,max_distance)\n" + } + if {[info exists vars(tie_cells,max_fanout)]} { + append args "set_db add_tieoffs_max_fanout $vars(tie_cells,max_fanout)\n" + } + + if {[FF::is_lp_flow] && ([info exists vars(power_domains)] && ([llength $vars(power_domains)] > 1))} { + + # Get the set of tie cells to use, both domain-specific and generic. + + set all_tie_cells [list] + + set has_default false + if {![catch {set default_cells $vars(tie_cells)}]} { + set has_default true + lappend all_tie_cells $vars(tie_cells) + } + set has_specific false + foreach domain [FF::get_by_suffix vars ",tie_cells"] { + set cells $vars($domain,tie_cells) + lappend all_tie_cells $vars($domain,tie_cells) + if {![llength $cells]} { + continue + } + set has_specific true +# append command "set tie_cells($domain) \[list $cells\]\n" +# append commands $command + } + + # + # If there are no tie cells at all, there's nothing to do + # + + if {!$has_default && !$has_specific} { + return "" + } + + set all_tie_cells [lsort -unique [join $all_tie_cells]] + + # + # If there are no domain-specific entries, life is real simple + # + +# if {!$has_specific} { +# set command "\nset_db add_tieoffs_cells \"$default_cells\"\n$args" +# append commands [FF::wrap_command $vars(step),set_tie_hi_lo_mode $command] +# if {$add} { +# foreach cell $default_cells { +# append commands "setDontUse $cell false\n" +# } +# if {[llength $vars(power_domains)] > 0} { +# foreach domain $vars(power_domains) { +# append commands " catch {add_tieoffs -power_domain $domain -prefix $domain}\n" +# } +# } +# foreach cell $default_cells { +# append commands "setDontUse $cell true\n" +# } +# } +# } else { +# foreach cell $default_cells { +# append commands "setDontUse $cell false\n" +# } + if {[llength $vars(power_domains)] > 0} { + foreach domain $vars(power_domains) { + if {[info exists vars($domain,tie_cells)]} { + set command "\nset_db add_tieoffs_cells \"$vars($domain,tie_cells)\"\n$args" + } else { + if {[info exists default_cells]} { + set command "\nset_db add_tieoffs_cells \"$default_cells\"\n$args" + } else { + continue + } + } + append commands [FF::wrap_command $vars(step),set_tie_hi_lo_mode $command] + append commands " catch {add_tieoffs -power_domain $domain -prefix $domain}\n" + } + } +# foreach cell $default_cells { +# append commands "setDontUse $cell true\n" +# } +# } + } elseif {![catch {set cells $vars(tie_cells)}]} { + set command "\nset_db add_tieoffs_cells \"$cells\"\n$args" +# if {$mode} { + append commands [FF::wrap_command $vars(step),set_tie_hi_lo_mode $command] +# } + set command "" +# append command "foreach cell \{$cells\} {\n" +# append command " setDontUse \$cell false\n" +# append command "}\n" + append command "add_tieoffs\n" +# append command "foreach cell \{$cells\} {\n" +# append command " setDontUse \$cell true\n" +# append command "}\n" + append commands $command + } else { + set commands "" + } + + return $commands + } + + proc add_filler_cells {} { + ######################################################################### + # This procedure inserts tie hi/lo cells based on information in the + # setup.tcl + ######################################################################### + + global vars + global errors + + set commands "" + + set ccommands "" + if {$vars(verbose)} { + append ccommands "#\n" + append ccommands "# ADD FILLER CELLS\n" + append ccommands "#\n" + } + + append commands $ccommands + + if {[FF::is_lp_flow] && ([info exists vars(power_domains)] && ([llength $vars(power_domains)] > 1))} { + + # Get the set of filler cells to use, both domain-specific and generic. + + set all_filler_cells [list] + + set has_default false + if {![catch {set default_cells $vars(filler_cells)}]} { + set has_default true + lappend all_filler_cells $vars(filler_cells) + } + set has_specific false + foreach domain [FF::get_by_suffix vars ",filler_cells"] { + set cells $vars($domain,filler_cells) + lappend all_filler_cells $vars($domain,filler_cells) + if {![llength $cells]} { + continue + } + set has_specific true +# append command "set filler_cells($domain) \[list $cells\]\n" +# append commands $command + } + + # + # If there are no filler cells at all, there's nothing to do + # + + if {!$has_default && !$has_specific} { + return "" + } + + set all_filler_cells [lsort -unique [join $all_filler_cells]] + + # + # If there are no domain-specific entries, life is real simple + # + +# if {!$has_specific} { +# set command "set_db add_fillers_cells \"$default_cells\"\nset_db add_fillers_prefix FILL\n" +# append commands [FF::wrap_command $vars(step),set_filler_mode $command] +# if {$add} { +# foreach cell $default_cells { +# append commands "setDontUse $cell false\n" +# } +# if {[llength $vars(power_domains)] > 0} { +# foreach domain $vars(power_domains) { +# append commands " catch {add_fillers -power_domain $domain}\n" +# } +# } +# foreach cell $default_cells { +# append commands "setDontUse $cell true\n" +# } +# } +# } else { +# foreach cell $default_cells { +# append commands "setDontUse $cell false\n" +# } + if {[llength $vars(power_domains)] > 0} { + set default 0 + foreach domain $vars(power_domains) { + if {[info exists vars($domain,filler_cells)]} { + set command "set_db add_fillers_cells \"$vars($domain,filler_cells)\"\nset_db add_fillers_prefix FILL\n" + set default 0 + } else { + if {[info exists default_cells]} { + if {!$default} { + set command "set_db add_fillers_cells \"$default_cells\"\nset_db add_fillers_prefix FILL\n" + set default 1 + } else { + set command "" + } + } else { + continue + } + } + append commands [FF::wrap_command $vars(step),set_filler_mode $command] + append commands " catch {add_fillers -power_domain $domain}\n" + } + } +# foreach cell $default_cells { +# append commands "setDontUse $cell true\n" +# } +# } + } elseif {![catch {set cells $vars(filler_cells)}]} { + set command "set_db add_fillers_cells \"$cells\"\nset_db add_fillers_prefix FILL\n" + append commands [FF::wrap_command $vars(step),set_filler_mode $command] + set command "add_fillers\n" + append commands $command + } else { + set commands "" + } + + return $commands + } + + proc delete_filler_cells {} { + + global vars + + ######################################################################### + # Remove filler cells + ######################################################################### + + set command "delete_filler\n" + append commands [FF::wrap_command $vars(step),delete_filler_cells $command] + return $commands + } + + proc insert_welltaps_endcaps {{outline false}} { + + global vars + + ######################################################################### + # Insert welltaps and pre/post endcaps + ######################################################################### + + global vars + global errors + global warnings + + set commands "" + + if {[FF::is_lp_flow] && ([info exist vars(power_domains)] && ([llength $vars(power_domains)] > 1))} { + + if {$vars(flat) == "full"} { + # + # Just like tie and filler cells, we can have power domain-specific + # cells and settings that we need to worry about. + # + + append commands [FF_NOVUS::get_power_domains_code] + + # + # Get the set of domains that we need to worry about + # + + set pre [FF::get_by_suffix vars ",pre_endcap"] + set post [FF::get_by_suffix vars ",post_endcap"] + set endcaps [FF::lintersection $pre $post] + set welltaps [FF::get_by_suffix vars ",welltaps"] + + # + # For every domain in the union, we need to issue statements if that + # domain is one of the power domains in the design + # + # NOTE: We really don't need to worry about indenting the commands + # to look nice since the output routine will format it correctly + # + + set domains [FF::lunion $endcaps $welltaps] + + foreach domain $domains { + append commands "if {\[lsearch \$domains $domain\] != -1} {\n" + + # + # Handle the end caps + # + + set std_args "-prefix $domain -power_domain $domain" + set add "add_endcaps $std_args" + if {![catch {set pre $vars($domain,pre_endcap)}] && + ![catch {set post $vars($domain,post_endcap)}]} { + append commands "$add -start_row_cap $pre -end_row_cap $post\n" + } elseif {![catch {set pre $vars(pre_endcap)}] && + ![catch {set post $vars(post_endcap)}]} { + append commands "$add -start_row_cap $pre -end_row_cap $post\n" + } + + set taps "" + if {[catch {set taps $vars($domain,welltaps)}]} { + catch {set taps $vars(welltaps)} + } + if {$taps == ""} { + append commands "\}\n" + continue + } + + # + # Handle well taps + # + + append commands "add_well_taps $std_args -cell \[list $taps\]" + + if {![catch {set i $vars($domain,welltaps,cell_interval)}]} { + append commands " -cell_interval $i" + } elseif {![catch {set i $vars(welltaps,cell_interval)}]} { + append commands " -cell_interval $i" + } + + if {![catch {set offset $vars($domain,welltaps,row_offset)}] || + ![catch {set offset $vars(welltaps,row_offset)}]} { + append commands " -in_row_offset $offset" + } + + if {![catch {set checker $vars($domain,welltaps,checkerboard)}] || + ![catch {set checker $vars(welltaps,checkerboard)}]} { + if {$checker} { + append commands " -checker_board" + } + } + append commands "\n" + + # + # Add a verify step, if requested + # + +# if {![catch {set rule $vars($domain,welltaps,verify_rule)}] || +# ![catch {set rule $vars(welltaps,verify_rule)}]} { +# append commands "check_well_tap -cells \[list $taps\]" +# append commands " -power_domain $domain" +# append commands " -report $vars(rpt_dir)/$domain.welltap.rpt\n" +# } + + append commands "}\n" + } + + # + # We've taken care of all of the domains that we have explicit + # settings for. However, we may still have domains in the design + # that we know nothing explicit about. We need to handle these + # with a different set of code. + # + # We are going to cheat. Since the code we need is already written + # (below), we are going to recursively call this routine to get + # the skeleton that we need and wrap it up into a for-loop. This + # should get us something that looks like the following: + # set processed [list domain1 domain2 domain3] + # foreach domain $domains { + # if {[lsearch $processed_domains $domain] == -1} { + # addEndCap -power_domain $domain -prefix $domain ... + # addWellTap -power_domain $domain -prefix $domain ... + # verifyWellTap -power_domain $domain ... + # } + # } + # + # NOTE: The output routine will take care of making this look pretty + # at the end. We don't need to worry about indentation for + # the inserted commands + # + +# set save $vars(cpf_file) +# unset vars(cpf_file) +# set default_insert [insert_welltaps_endcaps true] +# if {$default_insert != ""} { +# append commands "set processed_domains \[list $domains\]\n" +# append commands "foreach domain \$domains {\n" +# append commands " if {\[lsearch \$processed_domains \$domain\] == -1} {\n" +# append commands " $default_insert" +# append commands " }\n" +# append commands "}\n" +# } +# set vars(cpf_file) $save + } else { + append commands "ff_procs::insert_welltaps_endcaps\n" + } + } else { + # + # There is no CPF file that we need to worry about. However, if + # $outline is true, it means that the code (above) that handles power + # domains called this routine recursively, and we need to change + # the commands a little bit to include variables for power domains + # + # Start with the simple case: endcaps + # + + if {![catch {set pre $vars(pre_endcap)}] && + ![catch {set post $vars(post_endcap)}]} { + + append commands "add_endcaps -start_row_cap $pre -end_row_cap $post" + if {!$outline} { + append commands " -prefix ENDCAP\n" + } else { + append commands " -prefix \$domain -power_domain \$domain\n" + } + } + + # + # Now process welltaps + # + + if {![catch {set taps $vars(welltaps)}]} { + append commands "add_well_taps -cell \[list $taps\]" + if {!$outline} { + append commands " -prefix WELLTAP" + } else { + append commands " -prefix \$domain -power_domain \$domain" + } + + if {![catch {set max_gap $vars(welltaps,max_gap)}]} { + append commands " -max_gap $max_gap" + } elseif {![catch {set interval $vars(welltaps,cell_interval)}]} { + append commands " -cell_interval $interval" + } + + if {![catch {set offset $vars(welltaps,row_offset)}]} { + append commands " -in_row_offset $offset" + } + + if {![catch {set checker $vars(welltaps,checkerboard)}]} { + if {$checker} { + append commands " -checker_board" + } + } + append commands "\n" + + # + # If a verify request has been made, create the command to + # do so. Again, take into account the potential for a recursive + # call to this routine. + # + +# if {![catch {set rule $vars(welltaps,verify_rule)}]} { +# append commands "check_well_tap -cells \[list $taps\] " +# append commands " -report $vars(rpt_dir)/" +# if {!$outline} { +# append commands "welltap.rpt\n" +# } else { +# append commands "\$domain.welltap.rpt -power_domain \$domain\n" +# } +# } elseif {!$outline} { +## puts " Cannot run verifyWellTap because vars(welltaps,verify_rule) is not defined" +# set warnings($vars(warning_count)) "Cannot run verifyWellTap because vars(welltaps,verify_rule) is not defined" +# incr vars(warning_count) +# } + } + } + + # + # If we created any commands to be executed, prefix the commands with a + # header + # + + if {($commands != "") && !$outline} { + set body $commands + + set commands "" + if {$vars(verbose)} { + append commands "#\n" + append commands "# INSERTING WELLTAPS AND/OR ENDCAPS\n" + append commands "#\n" + } + append commands $body + } + + return $commands + } + + proc route_secondary_pg_nets {} { + + global vars + global errors + + # + # Don't try to route unless the proper flags are in place to do so + # + + if {![info exists vars(route_secondary_pg_nets)] || + !$vars(route_secondary_pg_nets)} { + return "" + } + + set commands "# ROUTING SECONDARY POWER NETS ...\n" + + # + # Enable global pin pairs (if defined) + # + + if {[catch {set arg $vars(secondary_pg,cell_pin_pairs)}]} { + puts " ==========================================================" + puts " ERROR: No cell/pin pairs defined. Please define cell/pin" + puts " pairs in your setup.tcl using the variable" + puts " vars(secondary_pg,cell_pin_pairs)" + puts " ==========================================================" + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + append commands "set_pg_pins_use_signal_route $arg\n" + + # + # Build commands for individual nets (if defined) + # + + if {[info exists vars(secondary_pg,nets)]} { + foreach net $vars(secondary_pg,nets) { + if {![catch {set arg $vars($net,cell_pin_pairs)}]} { + append commands "set_pg_pins_use_signal_route $arg\n" + } + } + set nets $vars(secondary_pg,nets) + set netFormat " -nets %s" + } else { + set nets [list "secondary_pg"] + set netFormat "" + } + + foreach net $nets { + set route "route_secondary_pg_pins" + append route [format $netFormat $net] + catch {append route " -pattern $vars($net,pattern)"} + catch {append route " -max_pins_per_trunk $vars($net,max_fanout)"} + catch {append route " -non_default_rule $vars($net,non_default_rule)"} + append commands "$route\n" + } + return $commands + } + + proc add_power_switches {{domains ""}} { + + global vars + global errors + global map + + source $vars(script_path)/ETC/INOVUS/map_options.tcl + + if {$domains == ""} { + append commands [FF_NOVUS::get_power_domains_code] +# eval [FF::get_power_domains_code] + } + + foreach domain $domains { + if {[info exists vars($domain,switchable)] && + $vars($domain,switchable)} { + set type $vars($domain,switch_type) + + deletePowerSwitch -$type -power_domain $domain + + set command "addPowerSwitch -power_domain $domain -$type" + + if {[info exists vars($domain,checker_board)] && + $vars($domain,checker_board)} { + append command " -checkerBoard" + } + if {[info exists vars($domain,back_to_back_chain)] && + $vars($domain,back_to_back_chain)} { + append command " -backToBackChain" + } + if {[info exists vars($domain,loop_back_at_end)] && + $vars($domain,loop_back_at_end)} { + append command " -loopbackAtEnd" + } + if {[info exists vars($domain,check_height)] && + !$vars($domain,check_height)} { + append command " -noDoubleHeightCheck" + } + if {[info exists vars($domain,verify_rows)] && + !$vars($domain,verify_rows)} { + append command " -noRowVerify" + } + if {[info exists vars($domain,enable_chain)] && + !$vars($domain,enable_chain)} { + append command " -noEnableChain" + } + + foreach option [array names map] { + if {[info exists vars($domain,$option)]} { + append command " -$map($option) $vars($domain,$option)" + } + } + + uplevel #0 eval $command + } + } + } + + proc run_clock_eco {args} { + + global vars + global errors + + if {[llength $args] != 1} { + puts " Internal error in run_clock_eco. Wrong number of args." + exit -111 + } + + set commands "" +# append commands "# RUNNING CLOCK ECO\n" + switch $args { + "post_route" { + append commands [FF_NOVUS::delete_filler_cells] + append commands "clock_eco -post_route -use_spec_file_cells_only\n" + append commands [FF_NOVUS::add_filler_cells] + append commands "changeClockStatus -all -no_fixed_net_wires\n" + } + "post_cts" { + append commands "clock_eco -post_cts -use_spec_file_cells_only\n" + } + default { + puts " Internal error in run_clock_eco." + puts " Invalid argument; valid arguments are post_cts and post_route." + exit -111 + } + } + # if {$vars(codegen)} { + return $commands + # } else { + # uplevel #0 eval $commands + # } + } + + ############################################################################ + # Main foundation flow step procedures + ############################################################################ + + proc run_syn_map {{format 1}} { + + global vars + global env + global errors + + set vars(step) syn_map + + set commands "" + +# append commands "source $vars(script_dir)/vars.tcl\n" + + append commands "proc Puts {args} {puts \$args}\n" + + if {$vars(novus)} { + append commands "puts \[get_db program_version /\]\n" + } else { + append commands "puts \[get_attr program_version /\]\n" + } + + ## enable multi processing + append commands "set hostlist \[lrepeat $vars(local_cpus) localhost\]\n" + append commands "set_db super_thread_servers \$hostlist\n" + +# if {$vars(capture_metrics)} { +# append commands "\nenable_metrics -on\n" +# append commands "push_snapshot_stack\n" +# } + append commands [FF::source_plug pre_syn_setup_tcl] + + set command "set_db information_level 1\n" + append command "set_db source_verbose false\n" + append command "set_db -quiet print_error_info false\n" + append command "set_db -quiet echo_commands false\n" + append command "set_db mesg_coloring false\n" + append command "set_db qos_report_basic_cost_groups true\n" + + set command "set_db lib_lef_consistency_check_enable true\n" + append command "set_db script_search_path {./}\n" + + append command "suppress_messages {LBR-30 LBR-31 LBR-170 LBR-72 LBR-155 PHYS-210 PHYS-256 LBR-201 LBR-34 LBR-83 LBR-40 LBR-162 LBR-122}\n" + append command "redirect /dev/null {set map_fancy_names 1}\n" + + append commands [FF::source_plug post_syn_setup_tcl] + + append commands [FF::source_plug pre_syn_load_lib_tcl] + + set command [FF_NOVUS::initialize_step $vars(step)] + set command [FF_NOVUS::initialize_timing] + + set command "\nread_mmmc $vars(view_definition_tcl)\n\n" + append commands [FF::wrap_command $vars(step),read_mmmc $command] + + set command "" + if {[info exists vars(lef_files)]} { + append command "read_physical -lef \"\\\n" + foreach lef $vars(lef_files) { + append command "\t$lef\\\n" + } + append command "\"\n" + } + append commands [FF::wrap_command $vars(step),read_physical $command] + +# foreach lib $vars($vars([string trim $vars($vars($vars(default_setup_view),delay_corner),timing_condition)],library_set),timing) { +# append command " $lib \\\n" +# } +# append command "\"\n" +# append commands [FF::wrap_command $vars(step),read_lib $command] + +# set command "\nset_db lef_library \"\\\n" +# foreach lef $vars(lef_files) { +# append command " $lef \\\n" +# } +# append command "\"\n" +# append commands [FF::wrap_command $vars(step),read_lef $command] + +# set command "\nset_db qrc_tech_file $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),qx_tech_file)\n" +# append commands [FF::wrap_command $vars(step),read_qrc $command] + + if {[info exists vars(dont_use_list)] && $vars(dont_use_list) != "" } { + foreach cell $vars(dont_use_list) { + append commands "set_db avoid true \[find / -libcell $cell\]\n" + } + } + + append commands [FF::source_plug post_syn_load_lib_tcl] + + if {[info exists vars(cpf_file)]} { + set command "read_power_intent -module $vars(design) -cpf $vars(cpf_file)\n" + append commands [FF::wrap_command $vars(step),read_power_intent $command] + } + + if {[info exists vars(ieee1801_file)]} { + set command "read_power_intent -module $vars(design) -1801 $vars(ieee1801_file)\n" + append commands [FF::wrap_command $vars(step),read_power_intent $command] + } + + if {[info exists vars(hdl_search_path)]} { + append commands "set_db hdl_search_path \"$vars(hdl_search_path)\"\n" + } + if {[info exists vars(hdl_file_list)]} { + set command "read_hdl -v2001 \"$vars(hdl_file_list)\"\n" + append commands [FF::wrap_command $vars(step),read_hdl $command] + } else { + append commands [FF::source_plug syn_load_rtl_tcl] + } + + append commands "\n#set read_def_libcell_mismatch_error 0\n" + + set command "#set_db gen_module_prefix _GENUS_\n" + append command "#set_db hdl_array_naming_style %s_%d\n" + append command "#set_db hdl_reg_naming_style %s_reg%s\n" + append command "#set_db hdl_use_if_generate_prefix false\n" + append command "#set_db hdl_use_for_generate_prefix true\n" + append command "#set_db hdl_use_block_prefix false\n" + append command "#set_db hdl_max_loop_limit 8096\n" + append command "#set_db hdl_generate_index_style %s_%d_\n" + append command "#set_db hdl_generate_separator _\n" + append command "#set_db hdl_instance_array_naming_style %s_%d_\n" + append command "#set_db hdl_parameter_naming_style _%s%d\n" + append command "#set_db hdl_record_naming_style %s\[%s\]\n" + append command "#set_db hdl_use_techelt_first true\n" + append command "#set_db hdl_error_on_blackbox true\n" + append command "#set_db hdl_track_filename_row_col false\n" + append command "#set_db hdl_enable_proc_name false\n" + append command "#set_db hdl_error_on_latch false\n" + append command "#set_db hdl_unconnected_input_port_value none\n" + append command "#set_db hdl_undriven_output_port_value none\n" + append command "#set_db hdl_undriven_signal_value none\n" + + append commands [FF::wrap_command $vars(step),set_hdl_attributes $command] + + append commands [FF::source_plug pre_syn_load_elab_tcl] + + append commands "\nelaborate $vars(design)\n" + append commands [FF::wrap_command $vars(step),elaborate $command] + + append commands "\ninit_design\n" + append commands [FF::wrap_command $vars(step),init_design $command] + + append commands [FF::source_plug post_syn_load_elab_tcl] + + append commands "write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/elab.db\n" + + append commands "check_design -multiple_driver -undriven -unresolved > $vars(rpt_dir)/check_design.rpt\n" + append commands "report datapath -all -max_width {{filename 512}} > $vars(rpt_dir)/report_datapath.rpt\n" + + +# append commands "#set treat_invalid_from_to_as_through 1\n" + + if {[info exists vars(clock_gate_cells)]} { + set command "set_db lp_clock_gating_cell \[find /lib* -libcell $vars(clock_gate_cells)\]\n\n" + append command "set_db lp_insert_clock_gating true\n" + append commands [FF::wrap_command $vars(step),insert_clock_gating $command] + } + + if {[info exists vars(leakage_power_effort)] && ($vars(leakage_power_effort) != "none")} { + set command "set_db lp_multi_vt_optimization_effort $vars(leakage_power_effort)\n" + append commands [FF::wrap_command $vars(step),leakage_power_effort $command] + } + append command "#set_db lp_insert_operand_isolation false\n" + append command "#set_db lp_power_analysis_effort low\n" + append command "#set_db lp_clock_gating_hierarchical false\n" + append command "#set_db lp_clock_gating_auto_cost_group_initial_target 0\n" + append command "#set_db lp_clock_gating_max_flops infinity\n" + append command "#set_db lp_clock_gating_min_flops 3\n" + append command "#set_db lp_clock_gating_auto_path_adjust fixed\n" + append command "#set_db lp_clock_gating_auto_path_adjust_fixed_delay 175\n" + + append commands [FF::wrap_command $vars(step),set_icg_attributes $command] + +# append command "#set_db lp_power_optimization_weight \"\"\n" + + + #----------------------------------------------------------------------- + # DFT Settings + #----------------------------------------------------------------------- + set command "#set_db dft_scan_map_mode force_all\n" + append command "#set_db dft_scan_style muxed_scan\n" + append command "#set_db dft_prefix DFT_\n" + append command "#set_db use_scan_seqs_for_non_dft true\n" + append command "#set_db dft_scan_map_mode force_all\n" + append command "#set_db dft_connect_shift_enable_during_mapping tie_off\n" + append command "#set_db dft_connect_scan_data_pins_during_mapping loopback\n" + append command "#set_db dft_scan_output_preference non_inverted\n" + append command "#set_db dft_lockup_element_type edge_sensitive\n" + append command "#set_db dft_mix_clock_edges_in_scan_chains false\n" + + append commands [FF::wrap_command $vars(step),set_dft_attributes $command] + + append commands [FF::source_plug syn_setup_dft_tcl] + + set command "" + ## RC timing still comes from cpf, Innovus timing comes from setup.tcl + if [info exists vars(cpf_file)] { + append command "apply_power_intent -summary\n" + append commands [FF::wrap_command $vars(step),apply_power_intent $command] + } else { +# append command "set mode [lindex $vars(constraint_modes) 0]\n" +# append command "if { \[find / -mode \$mode \] == \"\"} {\n" +# append command " create_mode -default -name \$mode\n" +# append command "}\n" +# ## Now populate the timing modes +# foreach mode $vars(constraint_modes) { +# if {[info exists vars($mode,synth_sdc)]} { +# append command "if { \[find / -mode $mode\] == \"\" } {\n" +# append command " create_mode -name $mode\n" +# append command "}\n" +# append command "read_sdc -mode $mode $vars($mode,synth_sdc)\n" +# } else { +# if {[info exists vars($mode,pre_cts_sdc)]} { +# append command "if { \[find / -mode $mode\] == \"\" } {\n" +# append command " create_mode -name $mode\n" +# append command "}\n" +# append command "read_sdc -mode $mode $vars($mode,pre_cts_sdc)\n" +# } +# } +# } +# append commands [FF::wrap_command $vars(step),apply_constraints $command] +# append command "puts \"The number of exceptions is \[llength \[find / -exception *\]\]\"\n" + + set command "\ndefine_cost_group -name in2out\n" + append command "define_cost_group -name in2reg\n" + append command "define_cost_group -name reg2out\n" + append command "define_cost_group -name reg2reg\n" + +# set mode [lindex $vars(constraint_modes) 0] +# set mode $vars(default_synthesis_mode) + set mode $vars(default_synthesis_view) + + append command "path_group -mode $mode -from \[all::all_inps\] -to \[all::all_outs\] -group in2out -name in2out\n" + append command "path_group -mode $mode -from \[all::all_inps\] -to \[all::all_seqs\] -group in2reg -name in2reg\n" + append command "path_group -mode $mode -from \[all::all_seqs\] -to \[all::all_outs\] -group reg2out -name reg2out\n" + append command "path_group -mode $mode -from \[all::all_seqs\] -to \[all::all_seqs\] -group reg2reg -name reg2reg\n" + +# append command "path_group -from \[all::all_inps\] -to \[all::all_outs\] -group in2out -name in2out\n" +# append command "path_group -from \[all::all_inps\] -to \[all::all_seqs\] -group in2reg -name in2reg\n" +# append command "path_group -from \[all::all_seqs\] -to \[all::all_outs\] -group reg2out -name reg2out\n" +# append command "path_group -from \[all::all_seqs\] -to \[all::all_seqs\] -group reg2reg -name reg2reg\n" + + append commands [FF::wrap_command $vars(step),create_path_groups $command] + } + + + set command "" + set first 1 + if {[info exists vars(def_files)]} { + foreach file $vars(def_files) { + if {[file exists $file]} { + if {$first} { + append command "read_def $file\n" + set first 0 + } else { + append command "read_def -incr $file\n" + } + } + } + append commands [FF::wrap_command $vars(step),read_def $command] + } + + append commands "report timing -lint\n" + + if {[info exists vars(max_route_layer)]} { +# append commands "\nset_db number_of_routing_layers $vars(max_route_layer) designs/$vars(design)\n" + } + +# append commands "#foreach cg \[find / -cost_group *\] {\n" +# append commands "# report timing -cost_group [list \$cg] >> $vars(rpt_dir)/cost_group.map.rpt\n" +# append commands "#}\n" + +# append commands "#set_remove_assign_options -skip_unconstrained_paths -physical\n" +# append commands "#set_db utilization 0 \[find / -layer M1\]\n" + + append commands [FF::source_plug pre_syn_gen_tcl] + + set command "\nsynthesize -to_generic -effort medium\n\n" + append commands [FF::wrap_command $vars(step),syn2gen $command] + + append commands [FF::source_plug post_syn_gen_tcl] + + append commands "write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/syn_gen.db\n" + + set command "\nsynthesize -to_map -effort high -clock_gating_only\n\n" + append commands [FF::wrap_command $vars(step),syn2icg $command] + +# set cg_cells "\n" +# foreach i [filter libcell -invert "" [find / -inst instances_seq/*]] { +# if {[get_attr clock_gating_integrated_cell [get_attr libcell $i]] != "" } { +# lappend cg_cells $i +# } +# } +# if { $cg_cells != "" } { +# set CG_ADJUST [path_adjust -delay -150 -to $cg_cells] +# } + + append commands [FF::source_plug pre_syn_map_tcl] + + # Synthesizing to gates using effort level defined by vars(syn_map_effort). + set command "\nsynthesize -to_mapped -effort high -no_incremental\n\n" + + append commands [FF::wrap_command $vars(step),syn2map $command] + + set command "" + append command "report_area > $vars(rpt_dir)/$vars(step).area.rpt\n" + append command "report_dp > $vars(rpt_dir)/$vars(step).datapath.rpt\n" + append command "report_timing -max_paths 5 -path_type summary > $vars(rpt_dir)/$vars(step).start_end_slack.rpt\n" + append command "report_timing -max_paths 1 -nworst 1 -path_type full_clock > $vars(rpt_dir)/$vars(step).worst_max_path.rpt\n" + append command "report_timing -max_paths 500 -nworst 1 -path_type full_clock > $vars(rpt_dir)/$vars(step).top_500_paths.rpt\n" + append command "report_gates -power > $vars(rpt_dir)/$vars(step).gates_power.rpt\n" + append command "report_clock_gating > $vars(rpt_dir)/$vars(step).clockgating.rpt\n" + append command "report_power -depth 0 > $vars(rpt_dir)/$vars(step).power.rpt\n" + + append commands [FF::wrap_command $vars(step),generate_reports $command] + + if {$vars(capture_metrics)} { + append commands "pop_snapshot_stack\n" + if {[lindex [split $vars(version) "."] 0] > 16} { + append commands "create_snapshot -name $vars(step) -categories design\n" + } else { + append commands "create_snapshot -name $vars(step)\n" + } + append commands "write_metric -format tcl -file $vars(dbs_dir)/$vars(step).um\n" + append commands "report_metric -file $vars(rpt_dir)/$vars(design).html -format html\n" + } + + append commands "write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/syn_map.db\n" + if {[info exists vars(mail,to)]} { + set summary_file $vars(step).summary + if {![info exists vars(mail,steps)] || \ + ([info exists vars(mail,steps)] && ([lsearch $vars(mail,steps) $vars(step)] != -1))} { + append commands "puts \" MAILING RESULTS TO $vars(mail,to)\"\n" + append commands "if {\[file exists $vars(rpt_dir)/$summary_file\]} {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[shell pwd\])\" < $vars(rpt_dir)/$summary_file $vars(mail,to)\n" + append commands "} elseif {\[file exists $vars(rpt_dir)/${summary_file}.gz\]} {\n" + append commands " exec gunzip -c $vars(rpt_dir)/${summary_file}.gz \| /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" $vars(mail,to)\n" + append commands "} else {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[shell pwd\])\" < /dev/null $vars(mail,to)\n" + append commands "}\n" + } + } + + append commands "if {\[info exists env(VPATH)\]} {" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)" + append commands "}\n" + + return $commands + + } + + proc run_syn_incr {{format 1}} { + + global vars + global env + global errors + + set vars(step) syn_incr + + set commands "" + +# append commands "source $vars(script_dir)/vars.tcl\n" + + append commands "proc Puts {args} {puts \$args}\n" + + if {$vars(novus)} { + append commands "puts \[get_db program_version /\]\n" + } else { + append commands "puts \[get_attr program_version /\]\n" + } + + ## enable multi processing + append commands "set hostlist \[lrepeat $vars(local_cpus) localhost\]\n" + append commands "set_db super_thread_servers \$hostlist\n" + +# if {$vars(capture_metrics)} { +# append commands "\nenable_metrics -on\n" +# append commands "push_snapshot_stack\n" +# } + + append commands [FF::source_plug pre_syn_incr_tcl] + +# append commands "catch { set_remove_assign_options -skip_unconstrained_paths -physical }\n" +# append commands "set_db remove_assigns true\n" + + if {$vars(enable_pam)} { + append commands "\nset_db physical_aware_restructuring true\n" + append commands "set_db physical_aware_structuring true\n" + append commands "set_db physical_aware_mapping true\n" + } + + #### OPTIMIZATION EFFORT CONTROL + if {$vars(high_timing_effort)} { + set command "\nset_db tns_opto true\n" + append command "set_db iopt_enable_parallelization true\n" + append command "set_db ultra_global_mapping true\n" + append command "set_db iopt_ultra_optimization true\n" + append commands [FF::wrap_command $vars(step),set_high_effort_attributes $command] + } + + set command "#set_db optimize_merge_flops false\n" + append command "#set_db optimize_constant_0_flops true\n" + append command "#set_db optimize_constant_1_flops false\n" + append command "#set_db optimize_constant_latches false\n" + append command "#set_db delete_unloaded_seqs true\n" + append command "#set_db optimize_net_area false\n" + append command "#set_db dp_area_mode true\n" + append command "#set_db auto_ungroup none\n" + append command "#set_db auto_ungroup_min_effort low\n" + append command "#set_db ungroup_separator \n" + + append commands [FF::wrap_command $vars(step),set_opt_attributes $command] + + ### Detail Stats while running +# append commands "#set iopt_stats 1\n" + + #----------------------------------------------------------------------- + # Max leakage power ? + #----------------------------------------------------------------------- +# append commands "#set_db max_leakage_power ?\n" + set command "\nsynthesize -to_mapped -effort high -incr\n\n" + + append commands [FF::wrap_command $vars(step),syn2incr $command] + + append commands [FF::source_plug post_syn_incr_tcl] + +# append commands "foreach cg \[find / -cost_group *\] {\n" +# append commands " report timing -cost_group \$cg >> $vars(rpt_dir)/syn_incr_\[file tail \$cg\].rpt\n" +# append commands "}\n" + + set command "" + append command "report_area > $vars(rpt_dir)/$vars(step).area.rpt\n" + append command "report_dp > $vars(rpt_dir)/$vars(step).datapath.rpt\n" + append command "report_timing -max_paths 5 -path_type summary > $vars(rpt_dir)/$vars(step).start_end_slack.rpt\n" + append command "report_timing -max_paths 1 -nworst 1 -path_type full_clock > $vars(rpt_dir)/$vars(step).worst_max_path.rpt\n" + append command "report_timing -max_paths 500 -nworst 1 -path_type full_clock > $vars(rpt_dir)/$vars(step).top_500_paths.rpt\n" + append command "report_gates -power > $vars(rpt_dir)/$vars(step).gates_power.rpt\n" + append command "report_clock_gating > $vars(rpt_dir)/$vars(step).clockgating.rpt\n" + append command "report_power -depth 0 > $vars(rpt_dir)/$vars(step).power.rpt\n" + + append commands [FF::wrap_command $vars(step),generate_reports $command] + + if {$vars(capture_metrics)} { + append commands "pop_snapshot_stack\n" + if {[lindex [split $vars(version) "."] 0] > 16} { + append commands "create_snapshot -name $vars(step) -categories design\n" + } else { + append commands "create_snapshot -name $vars(step)\n" + } + append commands "write_metric -format tcl -file $vars(dbs_dir)/$vars(step).um\n" + append commands "report_metric -file $vars(rpt_dir)/$vars(design).html -format html\n" + } + + set command "write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/$vars(step).db\n" + append commands [FF::wrap_command $vars(step),write_db $command] + + if {!$vars(enable_rcp)} { + set command "\nwrite_design -innovus -gzip -basename $vars(dbs_dir)/$vars(step)/$vars(step)\n" + append command "set file \[open $vars(dbs_dir)/$vars(step)/$vars(step).novus_setup.tcl w\]\n" + append command "puts \$file \"eval_enc \{source $vars(dbs_dir)/$vars(step)/$vars(step).enc_setup.tcl\}\"\n" + append command "close \$file\n\n" + append commands [FF::wrap_command $vars(step),write_design $command] + } + + if {[info exists vars(mail,to)]} { + set summary_file $vars(step).summary + if {![info exists vars(mail,steps)] || \ + ([info exists vars(mail,steps)] && ([lsearch $vars(mail,steps) $vars(step)] != -1))} { + append commands "puts \" MAILING RESULTS TO $vars(mail,to)\"\n" + append commands "if {\[file exists $vars(rpt_dir)/$summary_file\]} {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[shell pwd\])\" < $vars(rpt_dir)/$summary_file $vars(mail,to)\n" + append commands "} elseif {\[file exists $vars(rpt_dir)/${summary_file}.gz\]} {\n" + append commands " exec gunzip -c $vars(rpt_dir)/${summary_file}.gz \| /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" $vars(mail,to)\n" + append commands "} else {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[shell pwd\])\" < /dev/null $vars(mail,to)\n" + append commands "}\n" + } + } + + append commands "if {\[info exists env(VPATH)\]} {" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)" + append commands "}\n" + + return $commands + + } + + proc run_syn_place {{format 1}} { + + global vars + global env + global errors + + set vars(step) syn_place + + set commands "" + +# append commands "source $vars(script_dir)/vars.tcl\n" + + append commands "proc Puts {args} {puts \$args}\n" + + if {$vars(novus)} { + append commands "puts \[get_db program_version\]\n" + } else { + append commands "puts \[get_attr program_version\]\n" + } + + ## enable multi processing + append commands "set hostlist \[lrepeat $vars(local_cpus) localhost\]\n" + append commands "set_db super_thread_servers \$hostlist\n" + +# if {$vars(capture_metrics)} { +# append commands "\nenable_metrics -on\n" +# append commands "push_snapshot_stack\n" +# } + + if {[info exists vars(postload_syn_place_tcl)]} { + append commands "set_db enc_postload_script $vars(postload_syn_place_tcl)\n" + } + if {[info exists vars(preexport_syn_place_tcl)]} { + append commands "set_db enc_preexport_script $vars(preexport_syn_place_tcl)\n" + } + if {[info exists vars(preannotation_syn_placed_tcl)]} { + append commands "set_db enc_preannotation_tcl $vars(preannotation_syn_placed_tcl)\n" + } + + append commands "set_db enc_temp_dir ./INNOVUS/rcp_run\n" + append commands "set_db enc_gzip_interface_files true\n" + append commands "set_db pqos_placement_effort no_value\n" + +# append commands "set ::phys::pqos_tns_opt 1\n" + append commands "set_db iopt_enable_parallelization false\n" + +# if {[info exists vars(def_files)]} { +# foreach file $vars(def_files) { +# if {[file exists $file]} { +# set command "read_def $vars(def_files)\n" +# append commands [FF::wrap_command $vars(step),read_def $command] +# } +# } +# } + + append commands [FF::source_plug pre_syn_place_tcl] + + set command "\nsynthesize -to_placed -effort high -pqos_only\n\n" + append commands [FF::wrap_command $vars(step),syn2place $command] + + set command "\nsynthesize -to_placed -effort high -incr\n\n" + append commands [FF::wrap_command $vars(step),syn2place_incr $command] + + append commands [FF::source_plug post_syn_place_tcl] + + append commands "::phys::qos_stats -quiet -tag syn2placed\n" + append commands "::phys::qos_write_stats_array > $vars(rpt_dir)/qos_stats.qdb\n" + append commands "::phys::qos_summary\n" + + append commands "foreach cg \[find / -cost_group *\] {\n" + append commands " report timing -cost_group \$cg >> $vars(rpt_dir)/syn_place_\[file tail \$cg\].rpt\n" + append commands "}\n" + + append command "report_area > $vars(rpt_dir)/$vars(step).area.rpt\n" + append command "report_dp > $vars(rpt_dir)/$vars(step).datapath.rpt\n" + append command "report_timing -max_paths 5 -path_type summary > $vars(rpt_dir)/$vars(step).start_end_slack.rpt\n" + append command "report_timing -max_paths 1 -nworst 1 -path_type full_clock > $vars(rpt_dir)/$vars(step).worst_max_path.rpt\n" + append command "report_timing -max_paths 500 -nworst 1 -path_type full_clock > $vars(rpt_dir)/$vars(step).top_500_paths.rpt\n" + append command "report_gates -power > $vars(rpt_dir)/$vars(step).gates_power.rpt\n" + append command "report_clock_gating > $vars(rpt_dir)/$vars(step).clockgating.rpt\n" + append command "report_power -depth 0 > $vars(rpt_dir)/$vars(step).power.rpt\n" + + append commands [FF::wrap_command $vars(step),generate_reports $command] + + if {$vars(capture_metrics)} { + append commands "pop_snapshot_stack\n" + if {[lindex [split $vars(version) "."] 0] > 16} { + append commands "create_snapshot -name $vars(step) -categories design\n" + } else { + append commands "create_snapshot -name $vars(step)\n" + } + append commands "write_metric -format tcl -file $vars(dbs_dir)/$vars(step).um\n" + append commands "report_metric -file $vars(rpt_dir)/$vars(design).html -format html\n" + } + + set command "write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/$vars(step).db\n" + append commands [FF::wrap_command $vars(step),write_db $command] + + if {$vars(enable_rcp)} { + set command "\nwrite_design -innovus -gzip -basename $vars(dbs_dir)/$vars(step)/$vars(step)\n" + append command "set file \[open $vars(dbs_dir)/$vars(step)/$vars(step).novus_setup.tcl w\]\n" + append command "puts \$file \"eval_enc \{source $vars(dbs_dir)/$vars(step)/$vars(step).enc_setup.tcl\}\"\n" + append command "close \$file\n\n" + append commands [FF::wrap_command $vars(step),write_design $command] + } + + if {[info exists vars(mail,to)]} { + set summary_file $vars(step).summary + if {![info exists vars(mail,steps)] || \ + ([info exists vars(mail,steps)] && ([lsearch $vars(mail,steps) $vars(step)] != -1))} { + append commands "puts \" MAILING RESULTS TO $vars(mail,to)\"\n" + append commands "if {\[file exists $vars(rpt_dir)/$summary_file\]} {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[shell pwd\])\" < $vars(rpt_dir)/$summary_file $vars(mail,to)\n" + append commands "} elseif {\[file exists $vars(rpt_dir)/${summary_file}.gz\]} {\n" + append commands " exec gunzip -c $vars(rpt_dir)/${summary_file}.gz \| /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" $vars(mail,to)\n" + append commands "} else {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[shell pwd\])\" < /dev/null $vars(mail,to)\n" + append commands "}\n" + } + } + + append commands [FF::wrap_command $vars(step),schedule_flow $command] + + append commands "if {\[info exists env(VPATH)\]} {" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)" + append commands "}\n" + + return $commands + + } + + proc run_init {{format 1}} { + + global vars + global env + global errors + global warnings + global env + + set commands "" + set ucomments "" + set comments "" + + if {[info exists vars(view_definition_tcl)]} { + append comments "# - vars(view_definition_tcl)\n" + } + + if {![info exists vars(step)] || (($vars(step) != "partition_place") && ($vars(step) != "model_gen") && ($vars(step) != "prototype"))} { + append commands "set vars(step) init\n" + set vars(step) init + } + + if {$vars(report_run_time)} { + append commands "set vars($vars(step),start_time) \[clock seconds\]\n" + append comments "# - vars(report_run_time)\n" + } else { + append ucomments "# - vars(report_run_time)\n" + } + + if {[info exists vars($vars(step),rpt_dir)]} { + set vars(rpt_dir) $vars($vars(step),rpt_dir) + file mkdir $vars($vars(step),rpt_dir) + } else { + set vars(rpt_dir) $vars(orig_rpt_dir) + } + + ############################################################################### + # Make sure necessary data is defined + # Create make directory if it doesn't exists + ############################################################################### + if {!$vars(codegen)} { + set command "FF_NOVUS::check_setup\n" + append command "sleep 3\n" + uplevel #0 eval $command + } + + ############################################################################### + # Make sure necessary data is defined + ############################################################################### + + foreach dir "[subst $vars(dbs_dir)] [subst $vars(rpt_dir)] [subst $vars(log_dir)]" { + set newDir [subst $dir] + if {![file exists $newDir]} { + file mkdir $newDir + } + } + +# if {[info exists vars(buffer_tie_assign)] && $vars(buffer_tie_assign)} { +# append commands "set_db init_buffer_tie_assign true\n" +# append comments "# - vars(buffer_tie_assign)\n" +# } else { +# append ucomments "# - vars(buffer_tie_assign)\n" +# } + + if {[info exists vars(ground_nets)]} { + append commands "set_db init_ground_nets \"$vars(ground_nets)\"\n" + append comments "# - vars(ground_nets)\n" + } else { + append ucomments "# - vars(ground_nets)\n" + } + + if {[info exists vars(power_nets)]} { + append commands "set_db init_power_nets \"$vars(power_nets)\"\n" + append comments "# - vars(power_nets)\n" + } else { + append ucomments "# - vars(power_nets)\n" + } + + ############################################################################### + # Load pre-initializatiaon plug-in script + ############################################################################### + append commands [FF::source_plug pre_init_tcl] + + ############################################################################### + # These flow scripts support the following: + # - Flat chip or block + # - Hierarchical partition + # - Top level partition + # + # The data loading mechanism are slightly different for each so we determine + # first if we are in a hierarchical flow (i.e. vars(partition_list) is + # defined and, if so, whether we are in a hierarchical partition flow + # or a top partition flow (i.e. cwd == $vars(design) - see below) + # + ############################################################################### + + FF_NOVUS::check_flow + +# append commands "#---------------------------------------------------------------------\n" +# append commands "# EXECUTING FLOW\n" +# append commands "#---------------------------------------------------------------------\n" + + set hier 0 + + if {[info exists vars($vars(step),starting_dbs)]} { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + # Interpret the starting DBS as an OA triple + set restore_command "[list read_db -cellview $vars($vars(step),starting_dbs)]\n" + } else { + if {[file isdirectory $vars($vars(step),starting_dbs)]} { + set restore_command "read_db $vars($vars(step),starting_dbs) \n" + } elseif {[file exists $vars($vars(step),starting_dbs)]} { + set restore_command "read_db $vars($vars(step),starting_dbs) \n" + } else { + puts " Starting DBS ($vars($vars(step),starting_dbs)) defined but does not exist" + set restore_command "read_db $vars($vars(step),starting_dbs) \n" + set warnings($vars(warning_count)) "Starting DBS ($vars($vars(step),starting_dbs)) defined but does not exist" + incr vars(warning_count) + } + } + + append commands [FF::wrap_command $vars(step),read_db $restore_command] + + } else { + + if {![info exists vars(partition_list)] || ([info exists vars(partition_list)] && \ + ([file tail [file dirname [pwd]]] != "$vars(partition_dir)"))} { + + ############################################################################### + # Partition step or flat init step + ############################################################################### + + if {[info exists vars(partition_list)]} { + set hier 1 + } + + if {$vars(verbose)} { + if {![info exists vars(partition_list)]} { + append commands "#\n" + append commands "# FLAT IMPLEMENTATION FLOW\n" + append commands "#\n" + } else { + append commands "#\n" + append commands "# PARTITIONING FLOW\n" + append commands "#\n" + } + } + + if {$vars(verbose)} { + append commands "#\n" + append commands "# LOADING DESIGN DATA\n" + append commands "#\n" + } + ############################################################################### + # Load design configuration file + ############################################################################### + + if {[lindex [split $vars(version) "."] 0] <= 10} { + source $vars(script_path)/ETC/INNOVUS/generic.conf + } + if {$vars(ilm)} { + set ilm_list $vars(ilm_list) + append comments "# - vars(ilm_list) \"\"\n" + if {$vars(mode) == "bottom_up"} { + foreach part $vars(partition_list) { + if {[info exists vars($part,ilm_dir)]} { + append comments "# - vars(,ilm_dir) \"\"\n" + if {[lsearch $ilm_list $part] == -1} { + lappend ilm_list $part + } + } + } + } + foreach ilm $ilm_list { + if {[info exists vars($ilm,lef_file)] && [file exists $vars($ilm,lef_file)]} { + append comments "# - vars(,lef_file) \"\"\n" + if {[lindex [split $vars(version) "."] 0] <= 10} { + lappend rda_Input(ui_leffile) $vars($ilm,lef_file) + } else { + if {[string compare $vars(dbs_format) "fe"]==0} { + lappend vars(lef_files) $vars($ilm,lef_file) + } + } + } else { + puts " WARNING: LEF file either not defined or doesn't exist for $ilm" + puts " Please make sure it is in your vars(lef_files) list" + set warnings($vars(warning_count)) "LEF file either not defined or doesn't exist for $ilm\n\tPlease make sure it is in your vars(lef_files) list" + incr vars(warning_count) + } + if {[info exists vars($ilm,setup_lib)] && [file exists $vars($ilm,setup_lib)]} { + append comments "# - vars(,setup_lib) \"\"\n" + if {[lindex [split $vars(version) "."] 0] <= 10} { + lappend rda_Input(ui_timelib) $vars($ilm,setup_lib) + } else { + if {[string compare $vars(dbs_format) "fe"]==0} { + foreach set $vars(library_sets) { + if {[lsearch $vars($set,timing) $vars($ilm,setup_lib)] == -1} { + lappend vars($set,timing) $vars($ilm,setup_lib) + } + } + } + } + } else { + puts " WARNING: LIB file either not defined or doesn't exist for $ilm" + puts " Please make sure it is in your library set definitions" + set warnings($vars(warning_count)) "LIB file either not defined or doesn't exist for $ilm\n\tPlease make sure it is in your library set definitions" + incr vars(warning_count) + } + } + } else { + append ucomments "# - vars(ilm_list) \"\"\n" + append ucomments "# - vars(,ilm_dir) \"\"\n" + append ucomments "# - vars(,lef_file) \"\"\n" + append ucomments "# - vars(,setup_lib) \"\"\n" + } + + FF_NOVUS::dump_config + + if {[string compare -nocase $vars(netlist_type) "verilog"]>=0} { + set command "" + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file $vars(view_definition_tcl) + } else { + set mmmc_file $vars(script_dir)/view_definition.tcl + } + append command "read_mmmc $mmmc_file\n" + if {[info exists vars(lef_files)]} { + append command "read_physical -lef \"\\\n" + foreach lef $vars(lef_files) { +# append command "read_physical -lef $lef\n" + append command "\t$lef\\\n" + } + append command "\"\n" + } else { + if {[info exists vars(oa_ref_lib)]} { + append command "read_physical -oa_ref_lib " + foreach lib $vars(oa_ref_lib) { + append command " $lib" + } + append command "\n" + } + } + if {[info exists vars(netlist)]} { + append command "read_netlist $vars(netlist)\n" + } + if {[info exists vars(cpf_file)]} { + append command "read_power_intent -cpf $vars(cpf_file)\n" + } + append command "init_design\n" + append commands [FF::wrap_command $vars(step),init_design $command] + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + set command "set_db power_leakage_power_view $vars(power_analysis_view)\n" + append command "set_db power_dynamic_power_view $vars(power_analysis_view)\n" + append commands [FF::wrap_command $vars(step),set_power_analysis_mode $command] + } + } else { + if {$hier} { + if {$vars(step) == "partition_place"} { + set command "read_db -cellview \[list $vars(oa_design_lib) $vars(oa_design_cell) $vars(oa_design_view)\]\n" + } else { + set command "read_db -cellview \[list $vars(oa_partition_lib) $vars(oa_design_cell) $vars(oa_design_view)\]\n" + } + } else { + set command "read_db -cellview \[list $vars(oa_design_lib) $vars(oa_design_cell) $vars(oa_design_view)\]\n" + } + append commands [FF::wrap_command $vars(step),read_db $command] + } + + ############################################################################### + # Load "always source" plug-in script + ############################################################################### + append commands [FF::source_plug always_source_tcl] + + ############################################################################### + # Check for the existence of either a floorplan file, a + # DEF file, or both and load them + ############################################################################### + set command "" + if {[info exists vars(fp_tcl_file)] || [info exists vars(fp_tcl_proc)]} { + append comments "# - vars(fp_tcl_file)\n" + append comments "# - vars(fp_tcl_proc)\n" + if {[info exists vars(fp_tcl_file)] && ![info exists vars(fp_tcl_proc)]} { + append command "ff_procs::source_file $vars(fp_tcl_file)\n" + } elseif {![info exist vars(fp_tcl_file)] && [info exists vars(fp_tcl_proc)]} { + append command "$vars(fp_tcl_proc)\n" + } else { + append command "# ERROR: Both fp_tcl_file and fp_tcl_proc are defined but are mutually exclusive\n" + set errors($vars(error_count)) "Both fp_tcl_file and fp_tcl_proc are defined but are mutually exclusive" + incr vars(error_count) + } + } else { + append ucomments "# - vars(fp_tcl_file)\n" + append ucomments "# - vars(fp_tcl_proc)\n" + if {[info exists vars(fp_file)]} { + if {[file exists $vars(fp_file)]} { + # append command "puts \" LOADING FP FILE $vars(fp_file)\"\n" + append command "read_floorplan $vars(fp_file)\n" + } + append comments "# - vars(fp_file)\n" + } else { + append ucomments "# - vars(fp_file)\n" + } + if {[info exists vars(oa_fp)]} { + append command "oaIn $vars(oa_fp)\n" + append comments "# - vars(oa_fp)\n" + } else { + append ucomments "# - vars(oa_fp)\n" + } + + if {[info exists vars(def_files)]} { + append comments "# - vars(def_files)\n" + if {$vars(rc)} { + if {$vars(enable_rcp)} { + set vars(netlist) $vars(dbs_dir)/syn_place/syn_place.v.gz + set vars(def_files) $vars(dbs_dir)/syn_place/syn_place.def.gz + if {[info exists vars(insert_dft)] && $vars(insert_dft)} { + lappend vars(def_files) $vars(dbs_dir)/syn_place/syn_place.scan.def.gz + } + } else { + set vars(netlist) $vars(dbs_dir)/syn_incr/syn_incr.v.gz + set vars(def_files) $vars(dbs_dir)/syn_incr/syn_incr.def.gz + if {[info exists vars(insert_dft)] && $vars(insert_dft)} { + lappend vars(def_files) $vars(dbs_dir)/syn_incr/syn_incr.scan.def.gz + } + } + foreach def_file $vars(def_files) { + append command "read_def $def_file\n" + } + } else { + foreach def_file $vars(def_files) { + if {[file exists $def_file]} { + append command "read_def $def_file\n" + append comments "# - vars(def_files)\n" + } else { + append ucomments "# - vars(def_files)\n" + } + } + } + } else { + append comments "# - vars(def_files)\n" + } + } + append commands [FF::wrap_command $vars(step),read_floorplan $command] + + if {($vars(parent) == "rc") && $vars(rc)} { + set commands [FF::source_plug always_source_tcl] + if {$vars(report_run_time)} { + append commands "set vars($vars(step),start_time) \[clock seconds\]\n" + } + append commands [FF::source_plug pre_init_tcl] + } + + # if {[info exists vars(guides)]} { + # set command "\nbuild_guides\n" + # append commands [FF::wrap_command init,build_guides $command] + # } + # if {[info exists vars(blockages)]} { + # set command "\nadd_blockages\n" + # append commands [FF::wrap_command init,add_blockages $command] + # } + + if {$vars(add_tracks)} { + set command "add_tracks\n" + if {[info exists vars(honor_pitch)] && $vars(honor_pitch)} { + set command " add_tracks -honor_pitch\n" + } + append commands [FF::wrap_command $vars(step),add_tracks $command] + append comments "# - vars(add_tracks)\n" + } else { + append ucomments "# - vars(add_tracks)\n" + } + + ############################################################################### + # Define power intent if it is defined (low power flow) + ############################################################################### + + # append commands [FF_NOVUS::load_power_intent] + + if {[info exists vars(activity_file)]} { + # append commands $header + # set header "" + set command "readActivityFile -format $vars(activity_file_format) $vars(activity_file)\n" + append commands [FF::wrap_command $vars(step),read_activity_file $command] + append comments "# - vars(activity_file)\n" + append comments "# - vars(activity_file_format)\n" + } else { + append ucomments "# - vars(activity_file)\n" + append ucomments "# - vars(activity_file_format)\n" + } + + ############################################################################### + # Specify ILMs if defined + ############################################################################### + if {[info exists ilm_list] && ($ilm_list != "")} { + set command "" + foreach cell $ilm_list { + if {[info exists vars($cell,ilm_dir)] && [file isdirectory $vars($cell,ilm_dir)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "read_ilm -cell $cell -directory $vars($cell,ilm_dir)\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "read_ilm -cell $cell -oa_cellview {$vars(oa_partition_lib) \[get_db designs .name\] ilm}\n" + } else { + append command "read_ilm -cell $cell -directory $vars($cell,ilm_dir)\n" + } + } + } else { + puts " ERROR: ilm directory missing for $cell" + set errors($vars(error_count)) "ILM directory missing for $cell" + incr vars(error_count) + } + } + if {$command != ""} { + append commands [FF::wrap_command $vars(step),specify_ilm $command] + } + } + +# if {$vars(ilm) && [info exists vars(ilm_non_sdc_file)]} { +# if {[file exists $vars(ilm_non_sdc_file)]} { +# if {[lindex [split $vars(version) "."] 0] <= 10} { +# set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" +# } else { +# set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" +# } +# append commands [FF::wrap_command $vars(step),load_ilm_non_sdc_file $command] +# } +# append comments "# - vars(ilm_non_sdc_file)\n" +# } else { +# append ucomments "# - vars(ilm_non_sdc_file)\n" +# } + + ############################################################################### + # Load timing enviroment based on the flow setting in the + # setup.tcl file. If the flow is mmmc, load the mmmc setup + # here else load the default timing environment + ############################################################################### + # append commands "#\n" + # append commands "# SETTING UP TIMING ENVIRONMENT\n" + # append commands "#\n" + if {$vars(flow) == "mmmc"} { + set command [FF_NOVUS::initialize_timing mmmc] + } else { + set command [FF_NOVUS::initialize_timing minmax] + } + + # foreach var [array name vars] { + # if {($var != "step") && ($var != "mode") && ($var != "ilm") && \ + # ($var != "flavor") && ($var != "user_mode") && ($var != "flat") && \ + # ($var != "report_run_time") && ($var != "makefile") && ($var != "codegen") && \ + # ($var != "backup_data") && ($var != "verbose") && ($var != "format_lines") && \ + # ($var != "warning_count") && ($var != "error_count") && ($var != "rc") && \ + # ($var != "add_tracks") && ($var != "fix_hold") && ($var != "honor_pitch") && \ + # ($var != "script_path") && ($var != "fix_hold") && ($var != "honor_pitch") && \ + # ($var != "steps") && ($var != "sourced") && ($var != "version")} { + # set vars($var) "\\\$vars($var)" + # } + # } + + append commands [FF::wrap_command $vars(step),initialize_timing $command] + if {$vars(flow) == "mmmc"} { + set command [FF_NOVUS::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } + + ############################################################################### + # Load scan DEF if it exists + ############################################################################### + if {[info exists vars(scan_def)]} { + if {[file exists $vars(scan_def)]} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# LOADING SCAN DEF FILE\n" + append commands "#\n" + } + set command "read_def $vars(scan_def)\n" + append commands [FF::wrap_command $vars(step),load_scan $command] + } + append comments "# - vars(scan_def)\n" + } else { + append ucomments "# - vars(scan_def)\n" + } + + ############################################################################### + # Specify spare gates for placement and optimization consideration; this assumes + # the spare cells are in the netlist. + ############################################################################### + + set command "" + if {[info exists vars(spare_cells)]} { + foreach spare_cell $vars(spare_cells) { + append command "specify_spare_gate -inst $spare_cell\n" + } + append comments "# - vars(spare_cells)\n" + } else { + append ucomments "# - vars(spare_cells)\n" + } + append commands [FF::wrap_command $vars(step),specify_spare_gates $command] + + ############################################################################### + # Load the recommended command mode settings + ############################################################################### + if {$vars(verbose)} { + append commands "#\n" + append commands "# DEFINING MODE SETTINGS\n" + append commands "#\n" + } + + ############################################################################### + # Set don't use cells; disable some (clock buffers, strong buffers, etc.), + # enable others that may have "dont_use true" in the library (like delay cells + # for hold fixing) + ############################################################################### + set command "" + if {[info exists vars(dont_use_list)]} { + append command "set_interactive_constraint_modes \[all_constraint_modes -active\]\n" + foreach cell $vars(dont_use_list) { + append command "set_dont_use true $cell\n" + } + append comments "# - vars(dont_use_list)\n" + } else { + append ucomments "# - vars(dont_use_list)\n" + } + if {[info exists vars(dont_use_file)] && [file exists $vars(dont_use_file)]} { + append command "source $vars(dont_use_file)\n" + append comments "# - vars(dont_use_file)\n" + } else { + append ucomments "# - vars(dont_use_file)\n" + } + if {[info exists vars(use_list)]} { + append command "set_interactive_constraint_modes \[all_constraint_modes -active\]\n" + foreach cell $vars(use_list) { + append command "set_dont_use false $cell\n" + } + append comments "# - vars(use_list)\n" + } else { + append ucomments "# - vars(use_list)\n" + } + if {$command != ""} { + append commands [FF::wrap_command $vars(step),set_dont_use $command] + } + + ############################################################################### + # Set maximum routing layers + ############################################################################### + if {[info exists vars(max_route_layer)]} { + set command "set_max_route_layer $vars(max_route_layer)\n" + append commands [FF::wrap_command $vars(step),set_max_route_layer $command] + append comments "# - vars(max_route_layer)\n" + } else { + append ucomments "# - vars(max_route_layer)\n" + } + + ############################################################################### + # Set design mode + ############################################################################### + set process [regsub "nm" $vars(process) ""] + append commands "set_db design_process_node $process\n" + if {[string tolower $vars(flow_effort)] != "standard"} { + append commands "set_db design_flow_effort [string tolower $vars(flow_effort)]\n" + } + + ############################################################################### + # Insert welltaps and pre/post endcaps + ############################################################################### + if {([FF::get_by_suffix vars "welltaps"] != "") || + (([FF::get_by_suffix vars "pre_endcap"] != "") && + ([FF::get_by_suffix vars "post_endcap"] != ""))} { + set command [FF_NOVUS::insert_welltaps_endcaps] + append commands [FF::wrap_command $vars(step),insert_welltaps_endcaps $command] + append comments "# - vars(welltaps)\n" + append comments "# - vars(pre_endcap)\n" + append comments "# - vars(post_endcap)\n" + } else { + append ucomments "# - vars(welltaps)\n" + append ucomments "# - vars(pre_endcap)\n" + append ucomments "# - vars(post_endcap)\n" + } + + } else { + + ############################################################################### + # Partition init step + ############################################################################### + + set ptn [file tail [pwd]] + set vars(design) $ptn + set skip_cpf false + # set vars(ilm) 0 + ############################################################################### + if {[lsearch $vars(partition_list) $ptn] == -1} { + append commands "#------------------------------------------------------------\n" + append commands "# TOP ($ptn) IMPLEMENTATION FLOW\n" + append commands "#------------------------------------------------------------\n" + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadConfig $ptn.conf 0\n" + if {[info exists vars(save_ilm_non_sdc_file)]} { + set vars(ilm_non_sdc_file) $vars(save_ilm_non_sdc_file) + } + append command "global rda_Input\n" + foreach part $vars(partition_list) { + append command "lappend rda_Input(ui_leffile) ../$part/$part.antenna.lef\n" + } + append command "commitConfig\n" + append commands [FF::wrap_command $vars(step),load_config $command] + } else { + if {[string compare $vars(dbs_format) "oa"]==0} { + set command "read_db -cellview \[list $vars(oa_partition_lib) $ptn layout\]\n" + } else { + if {$vars(use_flexmodels)} { + if {$vars(flexmodel_as_ptn)} { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "read_db ${ptn}_proto_eco.enc.dat\n" + } else { + set command "read_db ${ptn}_proto_full.enc.dat\n" + } + } else { + set command "read_db .\n" + append command "ff_replace_flexmodel_with_full_netlist\n" + } + } else { + set command "read_db .\n" + } + # foreach part $vars(partition_list) { + # append command "if {\[file exists ../$part/$part.antenna.lef\]} {\n" + # append command "loadLefFile ../$part/$part.antenna.lef\n" + # append command "}\n" + # } + # set command "source $ptn.globals\n" + # foreach part $vars(partition_list) { + # append command "lappend init_lef_file ../$part/$part.antenna.lef\n" + # } + # append command "init_design\n" + } + append commands [FF::wrap_command $vars(step),read_db $command] + set restore_design true + + if {$vars(capture_metrics) && (($vars(step) == "init") || (($vars(step) == "partition_place") && !$vars(use_flexmodels)) || ($vars(step) == "model_gen"))} { + append commands "enable_metrics -on\n" + append commands "push_snapshot_stack\n" + } + + # FlexILM flow + if {$vars(top)} { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file [file normalize $vars(view_definition_tcl)] + } else { + set mmmc_file [file normalize $vars(script_dir)/view_definition.tcl] + } + + if {$vars(enable_flexilm)} { + set command "" + set dirs "" + foreach block $vars(partition_list) { + append dirs "\\\n -flex_ilm {${block} ../${block}/${block}.flexilm}" + } + set command "commit_module_model $dirs\\\n" + if {[info exists vars(cpf_file)]} { + append command " -mmmc_file $vars(mmmc_file)\\\n" + append command " -cpf_file $vars(cpf_file)\n" + set skip_cpf true + } else { + append command " -mmmc_file $vars(mmmc_file)\n" + } + append commands [FF::wrap_command $vars(step),commit_module_model $command] + } + } + } + } else { + append commands "#------------------------------------------------------------\n" + append commands "# PARTITION ($ptn) IMPLEMENTATION FLOW\n" + append commands "#------------------------------------------------------------\n" + + if {$vars(use_flexmodels)} { + if {$vars(flexmodel_as_ptn)} { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "read_db ${ptn}_proto_eco.enc.dat\n" + } else { + set command "read_db ${ptn}_proto_full.enc.dat\n" + } +# append commands [FF::wrap_command $vars(step),restore_design $command] + } else { + set command "ff_replace_flexmodel_with_full_netlist\n" +# append commands [FF::wrap_command $vars(step),ff_replace_flexmodel_with_full_netlist $command] + } + } else { + if {[string compare $vars(dbs_format) "oa"]==0} { + set command "read_db -cell_view \[list $vars(oa_partition_lib) $ptn layout\]\n" + } else { + set command "read_db .\n" +# set command "source $ptn.globals\n" +# append command "init_design\n" + } + append commands [FF::wrap_command $vars(step),restore_design $command] + set restore_design true + } + } + + if {$vars(capture_metrics) && (($vars(step) == "init") || (($vars(step) == "partition_place") && !$vars(use_flexmodels)) || ($vars(step) == "model_gen"))} { + append commands "enable_metrics -on\n" + append commands "push_snapshot_stack\n" + } + + append commands [FF::source_plug always_source_tcl] + + ############################################################################### + # Load floorplan file or DEF; use defIn to load a DEF file + ############################################################################### + if {[string compare $vars(dbs_format) "fe"]==0} { + if {![info exists restore_design]} { + append commands "read_floorplan $ptn.fp\n" + append commands "source $ptn.mode\n" + if {[file exists $ptn.scan.def]} { + append commands "puts \" LOADING SCAN DEF FILE $ptn.scan.def\"\n" + append commands "read_def $ptn.scan.def\n" + } + } + } + + ############################################################################### + # Override maximum routing layer if defined for the partition + ############################################################################### + if {[info exists vars($ptn,max_route_layer)]} { + append commands "set_max_route_layer ($ptn,max_route_layer)\n" + append comments "# - vars(max_route_layer)\n" + } else { + append ucomments "# - vars(max_route_layer)\n" + } + + ############################################################################### + # Specify the ILM models for the top partition + ############################################################################### + if {$vars(top)} { + if {!$vars(enable_flexilm)} { + set command "" + foreach part $vars(partition_list) { + if {[info exists vars($part,ilm_dir)] && ($vars(codegen) || [file isdirectory $vars($part,ilm_dir)])} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "read_ilm -cell $part -dir $vars($part,ilm_dir)\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "read_ilm -cell $part -oa_cellview {$vars(oa_partition_lib) \[get_db designs .name\] ilm}\n" + } else { + append command "read_ilm -cell $part -directory $vars($part,ilm_dir)\n" + } + } + } else { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "read_ilm -cell $part -directory ../$part/$part.ilm\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "read_ilm -cell $part -oa_cellview {$vars(oa_partition_lib) \[get_db designs .name\] ilm}\n" + } else { + append command "read_ilm -cell $part -directory ../$part/$part.ilm\n" + } + } + } + } + if {$command != ""} { + append commands [FF::wrap_command $vars(step),specify_ilm $command] + } +# if {$vars(ilm) && [info exists vars(ilm_non_sdc_file)]} { +# if {[file exists $vars(ilm_non_sdc_file)]} { +# if {[lindex [split $vars(version) "."] 0] <= 10} { +# set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" +# } else { +# set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" +# } +# append commands [FF::wrap_command $vars(step),load_ilm_non_sdc_file $command] +# } +# } + + set command [FF_NOVUS::initialize_timing mmmc] + # if {![info exists vars(cpf_file)]} { + append commands [FF::wrap_command $vars(step),initialize_timing $command] + # } else { + # set defer_commands [FF::wrap_command $vars(step),initialize_timing $command] + # } + } + } + ############################################################################### + # Load power intent (if it is defined) + ############################################################################### + if {([info exists vars(cpf_file)]) && ($vars(cpf_file) != "") && !$skip_cpf} { + set save $vars(cpf_file) + if {!$vars(top)} { + set vars(cpf_file) "$ptn.cpf" + } + append commands [FF_NOVUS::load_power_intent] + set vars(cpf_file) $save + } elseif {[info exists vars(ieee1801_file)]} { + set save $vars(ieee1801_file) + if {!$vars(top)} { + set vars(ieee1801_file) "$ptn.cpf" + } + append commands [FF_NOVUS::load_power_intent] + set command "read_power_intent $vars(ieee1801_file) -1801\n" + } else { + append ucomments "# - vars(cpf_file)\n" + append ucomments "# - vars(ieee1801_file)\n" + } + } + } + + ############################################################################### + # Load post-initialization plug-in script + ############################################################################### + append commands [FF::source_plug post_init_tcl 0] + + ############################################################################### + # Check pre-place timing (and generate timing graph for placement) + ############################################################################### + if {($vars(step) != "model_gen") && ($vars(step) != "partition_place")} { + if {![info exists vars(time_design_options,setup)]} { + set command "time_design -pre_place -report_prefix preplace -report_dir $vars(rpt_dir)\n" + } else { + set command [format "time_design -pre_place -report_prefix preplace -report_dir $vars(rpt_dir) %s\n" $vars(time_design_options,setup)] + } + append commands [FF::wrap_command $vars(step),time_design $command] + } + + ############################################################################### + # Check data setup (sanity check) + ############################################################################### + set command "check_legacy_design -all\n" + append commands [FF::wrap_command $vars(step),check_design $command] + + if {!$vars(ilm)} { + set command "check_timing\n" + append commands [FF::wrap_command $vars(step),check_timing $command] + } + + ############################################################################### + # Generate reports + #------------------------------------------------------------------------------ + # Report power domain for level-shifters, isolation and pg nets + #------------------------------------------------------------------------------ + if {[FF::is_lp_flow] && ([info exists vars(power_domains)] && ([llength $vars(power_domains)] > 1))} { +# set command "set domains \[FF_NOVUS::get_power_domains_code\]\n" +# set command [FF_NOVUS::get_power_domains_code] + + append command "foreach domain \[get_db power_domains .name\] {\n" + append command " set domain_file \[regsub -all {\[\]\[<>|\\/?*:\]} \$domain _\]\n" + append command " report_power_domains -power_domain \$domain -out_file $vars(rpt_dir)/\${domain_file}.rpt -shifter -iso_inst -pg_nets\n" + append command " report_power_domains -power_domain \$domain -out_file $vars(rpt_dir)/\${domain_file}_binding.rpt -bind_lib\n" + + #------------------------------------------------------------------------------ + # Report library binding for power domains + #------------------------------------------------------------------------------ +# append command " foreach analysis_view \[all_analysis_views\] {\n" +# append command " set_default_view -setup \$analysis_view\n" +# append command " report_power_domains -power_domain \$domain -file $vars(rpt_dir)/\${domain_file}_\$analysis_view.rpt -bind_lib\n" +# append command " }\n" + +# append command " set_db timing_analysis_check_type hold\n" + +# append command " foreach analysis_view \[all_hold_analysis_views\] {\n" +# append command " set_default_view -hold \$analysis_view\n" +# append command " report_power_domains -power_domain \$domain -file $vars(rpt_dir)/\${domain_file}_\$analysis_view.rpt -bind_lib\n" +# append command " }\n" + +# append command " set_db timing_analysis_check_type setup\n" + append command "}\n" + append commands [FF::wrap_command $vars(step),report_power_domains $command] + if {$vars(flow) =="mmmc"} { + append commands "set_default_view -setup $vars(default_setup_view) -hold $vars(default_hold_view)\n" + } + } + + if {[info exists comments]} { + if {$comments == ""} { + if {[info exists vars(comments)]} { + unset vars(comments) + } + } else { + set vars(comments) $comments + } + } + if {[info exists ucomments]} { + if {$ucomments == ""} { + if {[info exists vars(ucomments)]} { + unset vars(ucomments) + } + } else { + set vars(ucomments) $ucomments + } + } + set fcommands [FF_NOVUS::insert_comments] + append fcommands $commands + + if {$vars(codegen)} { + return $fcommands + } else { + uplevel #0 eval $commands + } + + } + + proc run_place {{format 1}} { + + global vars + global env + global errors + + if {[info exists vars(parent)] && ($vars(parent) == "rc")} { + set vars(step) rcp + } else { + if {$vars(step) != "partition_place"} { + set vars(step) place + } + } + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + set command [FF_NOVUS::initialize_step place] + append commands [FF_NOVUS::insert_comments] + append commands [FF::wrap_command $vars(step),initialize_step $command] + + append commands "puts \" RUNNING PLACEMENT ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING PLACEMENT\n" + append commands "#\n" + } + + if {[info exists vars(partition_list)] && ($vars(step) != "partition_place") && \ + (([lsearch $vars(partition_list) $vars(design)] == -1) && $vars(enable_flexilm))} { + set command "" + append command "set_db opt_hier_opt_stage pre_cts\n" + append commands [FF::wrap_command $vars(step),set_hier_mode $command] + } + + ######################################################################### + # Load optional pre placement file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_place_tcl] + + ######################################################################### + # Run standard cell placement or load placement plug-in + ######################################################################### + + set command "" + if {[info exists vars(place_tcl)]} { + if {[file exists $vars(place_tcl)]} { + append command [FF::source_plug place_tcl] + } else { + set errors($vars(error_count)) "Plug-in vars(place_tcl) defined but the file does not exist" + incr vars(error_count) +# set vars(abort) 1 + } + } else { + if {[info exists vars(sdp_files)]} { + foreach file $vars(sdp_files) { + append command "#read_sdp_file -file $file -hier_path -origin -left_over_group \n" + } + append command "#plan_design -user_sdp_group\n" + } + if {[info exists vars(parent)] && ($vars(parent) == "rc")} { + append command "place_design \n" + } else { + if {$vars(place_opt_design)} { +# if {[info exists vars(hier)]} { +# if {($vars(top) && $vars(enable_flexilm))} { +# append command "place_design " +# if {[info exists vars(no_pre_place_opt)] && $vars(no_pre_place_opt)} { +# append command " -no_pre_place_opt" +# } +# append command "\n" +# } else { +# append command "place_opt_design -report_dir $vars(rpt_dir) -report_prefix $vars(step)\n" +# } +# } else { + append command "place_opt_design -report_dir $vars(rpt_dir) -report_prefix $vars(step)\n" +# } + + } else { + append command "place_design " + if {($vars(step) == "partition_place") && $vars(use_flexmodels)} { + append command " -no_pre_place_opt" + } else { + if {[info exists vars(no_pre_place_opt)] && $vars(no_pre_place_opt)} { + append command " -no_pre_place_opt" + } + } + append command "\n" + } + } + } + + if {[info exist vars(parent)] && ($vars(parent) != "rc") && $vars(rc) && $vars(enable_rcp)} { + set command "eco_place\n" + append commands [FF::wrap_command $vars(step),eco_place $command] + } else { +# if {[info exists vars(hier_case)] && [regexp "^1" $vars(hier_case)]} { +# append commands [FF::wrap_command $vars(step),place_design "place_design -no_pre_place_opt\n"] +# } else { + append commands [FF::wrap_command $vars(step),place_design $command] +# } + } + + ######################################################################### + # Load optional post placement file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_place_tcl 0] + + ######################################################################### + # Add tie cells for logic 0/1 nets + ######################################################################### + + set command [FF_NOVUS::add_tie_cells false true] + append commands [FF::wrap_command $vars(step),add_tie_cells $command] + + ############################################################################### + # Check post-place timing + ############################################################################### + if {![regexp "place_opt_design" $commands] && ($vars(step) == "place")} { + if {![info exists vars(time_design_options,setup)]} { + set command "time_design -pre_cts -report_prefix place -report_dir $vars(rpt_dir)\n" + } else { + set command [format "time_design %s -pre_cts -report_prefix place -report_dir $vars(rpt_dir)\n" $vars(time_design_options,setup)] + } + } +# if {($vars(step) == "partition_place") && $vars(use_flexmodels)} { +# if {![regexp "proto" $command]} { +# regsub "time_design" $command "time_design -proto" command +# } +# } +# append commands [FF::wrap_command $vars(step),time_design $command] + + if {($vars(user_mode) == "hier") && $vars(place_opt_design) && ($vars(step) != "partition_place")} { + set ptn [file tail [pwd]] + if {[info exists vars(partition_list)] && ([lsearch $vars(partition_list) $ptn] != -1)} { + if {$vars(enable_flexilm)} { + set command "write_ilm -opt_stage prects -type_flex_ilm flexIlm -to_dir \[get_db designs .name\].flexilm\n" + append commands [FF::wrap_command $vars(step),write_flex_ilm $command] + } else { + if {!$vars(black_box)} { + if {[string compare -nocase $vars(dbs_format) "fe"]==0} { + set command "write_ilm -opt_stage prects -type_flex_ilm ilm -model_type timing -to_dir \[get_db designs .name\].ilm -hold\n" + } else { + set command "write_ilm -opt_stage prects -type_flex_ilm ilm -model_type timing -oa_cellview {$vars(oa_partition_lib) \[get_db designs .name\] ilm}\n" + } + } + append commands [FF::wrap_command $vars(step),write_ilm $command] + } + } else { + if {$vars(enable_flexilm)} { + # Re-assign pins based on new netlist changes + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "" + append command "route_trial\n" + append commands [FF::wrap_command $vars(step),trial_route1 $command] + } else { + set command "" + append command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route1 $command] + } + set command "" + append command "time_design -pre_cts -report_dir $vars(rpt_dir) -report_prefix assemble_flexilm\n" + append commands [FF::wrap_command $vars(step),time_design $command] + + set command "" + append command "assign_partition_pins\n" + append commands [FF::wrap_command $vars(step),assign_partition_pins $command] + + set command "" + append command "check_pin_assignment\n" + append commands [FF::wrap_command $vars(step),check_pin_assignment $command] + + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "" + append command "set_db route_trial_honor_pin true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode2 $command] + set command "" + append command "route_trial\n" + append commands [FF::wrap_command $vars(step),trial_route2 $command] + } else { + set command "" + append command "set_db route_early_global_honor_partition_pin .\n" + append commands [FF::wrap_command $vars(step),set_route_mode2 $command] + set command "" + append command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route2 $command] + } + set command "" + append command "create_timing_budget\n" + append commands [FF::wrap_command $vars(step),create_timing_budget $command] + + set command "" + set dirs "" + foreach block $vars(partition_list) { + append dirs "\\\n -golden_block_dir ../$block/$vars(dbs_dir)/place.enc " + } +# append command "update_partition \\\n -flex_ilm_eco $dirs \\\n -flex_ilm_dir ../../$vars(partition_dir)_PRECTS/ \\\n -post_eco_suffix post_eco -pin_location\n" + append command "update_partition \\\n -flex_ilm_eco $dirs \\\n -flex_ilm_dir ../../$vars(partition_dir)_FLEXILM/ \\\n -post_eco_suffix post_eco -pin_location\n" + append commands [FF::wrap_command $vars(step),update_partition $command] + } + } + } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_prects {{format 1}} { + + global vars + global env + global errors + global warnings + + if {$vars(place_opt_design)} { +# if {!(($vars(user_mode) == "hier") && ([file tail [pwd]] == $vars(top_cell) && $vars(enable_flexilm)))} { + return "" +# } else { +# set warnings($vars(warning_count)) "Feature vars(place_opt_design) not support for top level implementation when vars(enable_flexilm) is true" +# incr vars(warning_count) +# } + } + + if {[info exists vars(parent)] && ($vars(parent) == "rc")} { + set vars(step) rcp + } else { + set vars(step) prects + } + + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_NOVUS::initialize_step prects] + append commands [FF_NOVUS::insert_comments] + append commands [FF::wrap_command $vars(step),initialize_step $command] + + append commands "puts \" RUNNING PRE-CTS OPTIMIZATION ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING PRE-CTS OPTIMIZATION\n" + append commands "#\n" + } + + ######################################################################### + # Load optional pre CTS file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_prects_tcl] + + if {[info exists vars(parent)] && ($vars(parent) == "rc")} { + return $commands + } + + ######################################################################### + # Run pre-CTS optimization + ######################################################################### + + if {([info exists vars(partition_list)]) && ([file tail [file dirname [pwd]]] == "$vars(partition_dir)")} { + set ptn [file tail [pwd]] + if {([lsearch $vars(partition_list) $ptn] == -1) && $vars(enable_flexilm)} { + # Top level flow for flexIlm + # Read Power Intent here ... + set command "" + foreach block $vars(partition_list) { + append command "set_partition_pin_status -partition $block -pins * -status unplaced\n" + } + append commands [FF::wrap_command $vars(step),set_partition_pin_status $command] + + set command "" + if {[lindex [split $vars(version) "."] 0] < 16} { + append command "set_db route_trial_honor_pin false\nset_db route_trial_handle_partition_complex true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode1 $command] + } else { + append command "set_db route_early_global_honor_partition_pin {}\nset_db route_early_global_honor_partition_fence .\n" + append commands [FF::wrap_command $vars(step),set_route_mode1 $command] + } + + set command "" + append command "set_db opt_hier_opt_stage preCTS\n" + append commands [FF::wrap_command $vars(step),set_hier_mode $command] + +# set command "" +# append command "set_db opt_handle_partition_complex true\n" +# append commands [FF::wrap_command $vars(step),set_opt_mode $command] + +# set command "" +# append command "opt_design -pre_cts -report_dir $vars(rpt_dir) -report_prefix flexilm\n" +# append commands [FF::wrap_command $vars(step),opt_design $command] + + } else { + # Non flexIlm top flow and partition flow + set command "opt_design -pre_cts -report_dir $vars(rpt_dir) -report_prefix prects\n" + append commands [FF::wrap_command $vars(step),opt_design $command] + } + } else { + # Flat flow + set command "opt_design -pre_cts -report_dir $vars(rpt_dir) -report_prefix prects\n" + append commands [FF::wrap_command $vars(step),opt_design $command] + } + + ######################################################################### + # Load optional post CTS file (plug-in) + ######################################################################### + + set command "" + append commands [FF::source_plug post_prects_tcl 0] + + if {($vars(user_mode) == "hier")} { + set ptn [file tail [pwd]] + if {[info exists vars(partition_list)] && ([lsearch $vars(partition_list) $ptn] != -1) && !$vars(place_opt_design)} { + if {$vars(enable_flexilm)} { + set command "write_ilm -opt_stage prects -type_flex_ilm flexIlm -to_dir \[get_db designs .name\].flexilm\n" + append commands [FF::wrap_command $vars(step),create_flex_ilm $command] + } else { + if {!$vars(black_box)} { + if {[string compare -nocase $vars(dbs_format) "fe"]==0} { + set command "write_ilm -opt_stage prects -type_flex_ilm ilm -to_dir \[get_db designs .name\].ilm\n" + } else { + set command "write_ilm -opt_stage prects -type_flex_ilm ilm -oa_cellview {$vars(oa_partition_lib) \[get_db designs .name\] ilm}\n" + } + } + append commands [FF::wrap_command $vars(step),write_ilm $command] + } + } else { ; # Top level unconditional (no place_opt_design support) ... + if {$vars(enable_flexilm)} { + set command "" + append command "write_db $vars(dbs_dir)/prects_flexilm.enc\n" + append commands [FF::wrap_command $vars(step),save_design $command] + + # Re-assign pins based on new netlist changes + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "" + append command "route_trial\n" + append commands [FF::wrap_command $vars(step),trial_route1 $command] + } else { + set command "" + append command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route1 $command] + } + + set command "" + append command "time_design -pre_cts -report_dir $vars(rpt_dir) -report_prefix prects_flexilm\n" + append commands [FF::wrap_command $vars(step),time_design $command] + + set command "" + append command "assign_partition_pins\n" + append commands [FF::wrap_command $vars(step),assign_partition_pins $command] + + set command "" + append command "check_pin_assignment\n" + append commands [FF::wrap_command $vars(step),check_pin_assignment $command] + + set command "" + if {[lindex [split $vars(version) "."] 0] < 16} { + append command "set_db route_trial_honor_pin true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode2 $command] + set command "" + append command "route_trial\n" + append commands [FF::wrap_command $vars(step),trial_route2 $command] + } else { + append command "set_db route_early_global_honor_partition_pin .\n" + append commands [FF::wrap_command $vars(step),set_route_mode2 $command] + set command "" + append command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route2 $command] + } + + +# set command "" +# append command "set_db budget_enable_mt_budgeting true\n" +# append commands [FF::wrap_command $vars(step),set_budgeting_mode $command] + + set command "" + append command "create_timing_budget\n" + append commands [FF::wrap_command $vars(step),create_timing_budget $command] + + set command "" + set dirs "" + foreach block $vars(partition_list) { + if {$vars(place_opt_design)} { + append dirs "\\\n -golden_block_dir ../$block/$vars(dbs_dir)/place.enc " + } else { + append dirs "\\\n -golden_block_dir ../$block/$vars(dbs_dir)/prects.enc " + } + } +# append command "update_partition \\\n -flex_ilm_eco $dirs \\\n -flex_ilm_dir ../../$vars(partition_dir)_PRECTS/ \\\n -post_eco_suffix post_eco -pin_location\n" + append command "update_partition \\\n -flex_ilm_eco $dirs \\\n -flex_ilm_dir ../../$vars(partition_dir)_FLEXILM/ \\\n -post_eco_suffix post_eco -pin_location\n" + append commands [FF::wrap_command $vars(step),update_partition $command] + } + } + } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_cts {{format 1}} { + + global vars + global errors + + if {$vars(skip_cts)} { + return "" + } + + set vars(step) cts + set commands "" + set ucomments "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_NOVUS::initialize_step cts] + append commands [FF_NOVUS::insert_comments] + append commands [FF::wrap_command cts,initialize_step $command] + + set vars(only_options) true + + if {[regexp "^ccopt" $vars(cts_engine)]} { + set command [FF_NOVUS::initialize_step postcts] + append commands [FF::wrap_command postcts,initialize_step $command] + if {$vars(postcts_setup_hold)} { + set command [FF_NOVUS::initialize_step postcts_hold] + append commands [FF::wrap_command postcts_hold,initialize_step $command] + } + } + + set vars(only_options) false + + if {$vars(top) && ($vars(user_mode) == "hier") && ($vars(hier_flow_type) == "2pass") && $vars(enable_flexilm)} { + # Read Power Intent here ... + set command "" + foreach part $vars(partition_list) { + if {[info exists vars($part,ilm_dir)] && ($vars(codegen) || [file isdirectory $vars($part,ilm_dir)])} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "read_ilm -cell $part -dir $vars($part,ilm_dir)\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "read_ilm -cell $part -oa_cellview {$vars(oa_partition_lib) \[get_db designs .name\] ilm}\n" + } else { + append command "read_ilm -cell $part -directory $vars($part,ilm_dir)\n" + } + } + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "read_ilm -cell $part\n" + } else { + append command "read_ilm -cell $part -directory ../$part/$part.ilm\n" + } + } + } + if {$command != ""} { +# append commands [FF::wrap_command $vars(step),specify_ilm "$command\nset_db ilm_keep_flatten true\n"] + append commands [FF::wrap_command $vars(step),specify_ilm $command] + } + + set command [FF_NOVUS::initialize_timing mmmc] +# if {![info exists vars(cpf_file)] || ([info exists vars(cpf_file)] && !$vars(cpf_timing)) } { + append commands [FF::wrap_command $vars(step),initialize_timing $command] +# } else { +# set defer_commands [FF::wrap_command $vars(step),initialize_timing $command] +# } + append commands [FF_NOVUS::load_power_intent] + } + + append commands "puts \" RUNNING CLOCK TREE SYNTHESIS ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING CLOCK TREE SYNTHESIS\n" + append commands "#\n" + } + + ######################################################################### + # Load pre-CTS file (plug-in) + ######################################################################### + if {$vars(cts_engine) == "cts"} { + append commands [FF::source_plug pre_cts_tcl] + } + + ######################################################################### + # Run CTS + #------------------------------------------------------------------------ + # Generate the clock tree using clockDesign which: + # - loads the clock specification file + # - removes existing buffers in the clock tree (not marked don't touch); + # if a clock tree has been previously inserted, use changeClockStatus + # to unfix the tree so that it can be removed + # - unfixes the clock nets after tree insertion + # Need to make sure the clock gating cells are usable during clockDesign. + # Disable them afterwards. + ######################################################################### + + set clock_gate_cells [list] + set command "" + if {[info exists vars(clock_gate_cells)]} { + append command "set_interactive_constraint_modes \[all_constraint_modes -active\]\n" + set clock_gate_cells $vars(clock_gate_cells) + foreach cell $clock_gate_cells { + append command "set_dont_use false $cell\n" + } + } + append commands [FF::wrap_command cts,enable_clock_gate_cells $command] + + ######################################################################### + # Run CTS + ######################################################################### + + set command "" + ######################################################################### + # Run ccoptDesign ... convert to propagated timing first in scripted integration + ######################################################################### + if {[info exists vars(cts_tcl)]} { + if {[file exists $vars(cts_tcl)]} { + append commands [FF::source_plug pre_cts_tcl] + append commands [FF::source_plug cts_tcl] + } else { + set errors($vars(error_count)) "Plug-in vars(cts_tcl) defined but the file does not exist" + incr vars(error_count) + } + } else { + set is_native [expr {$vars(ccopt_integration) == "native"}] + set command [FF_NOVUS::update_timing mmmc [expr !$is_native]] + append commands [FF::wrap_command cts,update_timing $command] + set command [FF_NOVUS::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + append commands [FF::source_plug pre_cts_tcl] + if {[regexp "^ccopt" $vars(cts_engine)]} { + append commands [FF::source_plug pre_postcts_tcl 0] + if {$vars(postcts_setup_hold)} { + append commands [FF::source_plug pre_postcts_hold_tcl] + } + } + + # Create a CCOpt clock tree spec if running with native integration + if {$vars(ccopt_effort) != "low"} { +# append commands [FF::wrap_command $vars(step),set_ccopt_mode "set_ccopt_mode -effort $vars(ccopt_effort)\n"] + append commands [FF::wrap_command $vars(step),set_ccopt_effort "set_ccopt_effort -effort $vars(ccopt_effort)\n"] + } + set ccopt_command "ccopt_design" + + if {$vars(postcts_setup_hold)} { + append ccopt_command " -hold" + } + + set command "create_clock_tree_spec\n" + append commands [FF::wrap_command cts,create_clock_tree_spec $command] + + append ccopt_command "\n" + append commands [FF::wrap_command cts,ccopt_design $ccopt_command] + + } + + ######################################################################### + # Load optional post CTS file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_cts_tcl 0] + if {[regexp "^ccopt" $vars(cts_engine)]} { + append commands [FF::source_plug post_postcts_tcl 0] + if {$vars(postcts_setup_hold)} { + append commands [FF::source_plug post_postcts_hold_tcl] + } + } + + ######################################################################### + # Reset clock gating cell usage + ######################################################################### + ############################################################################### + # Check post-cts timing + ############################################################################### + if {![info exists vars(time_design_options,setup)]} { + set command "time_design -postcts -report_prefix cts -report_dir $vars(rpt_dir)\n" + } else { + set command [format "time_design -postcts -report_prefix cts -report_dir $vars(rpt_dir) %s\n" $vars(time_design_options,setup)] + } + append commands [FF::wrap_command cts,time_design $command] + + if {($vars(hier_flow_type) == "2pass") && !$vars(enable_flexilm)} { + set ptn [file tail [pwd]] + if {[info exists vars(partition_list)] && ([lsearch $vars(partition_list) $ptn] != -1)} { + if {[string compare -nocase $vars(dbs_format) "fe"]==0} { + set command "write_ilm -opt_stage postcts -type_flex_ilm ilm -to_dir \[get_db designs .name\].ilm\n" + } else { + set command "write_ilm -opt_stage postcts -type_flex_ilm ilm -oa_cellview {$vars(oa_partition_lib) \[get_db designs .name\] ilm}\n" + } + append commands [FF::wrap_command $vars(step),write_ilm $command] + } + } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_postcts {{format 1}} { + + global vars + global env + global errors + + if {$vars(skip_cts)} { return "" } + +# if {[regexp "^ccopt" [string tolower $vars(cts_engine)]]} { +# return "" +# } + if {[string tolower $vars(cts_engine)] == "ccopt"} { + return "" + } + + set vars(step) postcts + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_NOVUS::initialize_step postcts] + append commands [FF_NOVUS::insert_comments] + append commands [FF::wrap_command postcts,initialize_step $command] + + ############################################################################### + # Specify the ILM models for the top partition (only for 2pass flow) + ############################################################################### + if {$vars(top) && ($vars(user_mode) == "hier") && ($vars(hier_flow_type) == "2pass") && !$vars(enable_flexilm)} { +# if {!$(vars(black_box)} { + set command "" + foreach part $vars(partition_list) { + if {[info exists vars($part,ilm_dir)] && ($vars(codegen) || [file isdirectory $vars($part,ilm_dir)])} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "specifyIlm -cell $part -dir $vars($part,ilm_dir)\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "specifyIlm -cell $part\n" + } else { + append command "specifyIlm -cell $part -dir $vars($part,ilm_dir)\n" + } + } + } else { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "specifyIlm -cell $part -dir ../$part/$part.ilm\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "specifyIlm -cell $part\n" + } else { + append command "specifyIlm -cell $part -dir ../$part/$part.ilm\n" + } + } + } + } + if {$command != ""} { + append commands [FF::wrap_command $vars(step),specify_ilm $command] + } + if {$vars(flow) == "mmmc"} { + set command [FF_NOVUS::update_timing mmmc] + append commands [FF::wrap_command postcts,update_timing $command] + set command [FF_NOVUS::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } else { + set command [FF_NOVUS::update_timing minmax] + append commands [FF::wrap_command postcts,update_timing $command] + set command [FF_NOVUS::derate_timing minmax] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } + if {$vars(ilm) && [info exists vars(ilm_non_sdc_file)]} { + if {[file exists $vars(ilm_non_sdc_file)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" + } else { + set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" + } + append commands [FF::wrap_command $vars(step),load_ilm_non_sdc_file $command] + } + } +# } + +# set command [FF_NOVUS::initialize_timing mmmc] +# if {![info exists vars(cpf_file)]} { +# append commands [FF::wrap_command $vars(step),initialize_timing $command] +# } else { +# set defer_commands [FF::wrap_command $vars(step),initialize_timing $command] +# } + } + + append commands "puts \" RUNNING POST-CTS OPTIMIZATION ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST-CTS OPTIMIZATION\n" + append commands "#\n" + } + + ######################################################################### + # Load optional pre postCTS file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_postcts_tcl] + + if {$vars(cts_engine) == "ccopt" && $vars(ccopt_integration) == "native"} { + set command "puts \" NO POST-CTS OPTIMIZATION REQUIRED FOR CCOPT NATIVE INTEGRATION\"\n" + append commands [FF::wrap_command postcts,opt_design $command] + } else { + ######################################################################### + # Run post-CTS optimization + ######################################################################### + + set command "opt_design -post_cts -report_dir $vars(rpt_dir) -report_prefix postcts\n" + append commands [FF::wrap_command postcts,opt_design $command] + } + + ######################################################################### + # Load optional post postCTS file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_postcts_tcl 0] + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_postcts_hold {{format 1}} { + + global vars + global env + global errors + + if {$vars(skip_cts) || ([lsearch $vars(fix_hold) postcts] < 0) || $vars(postcts_setup_hold)} { + return "" + } + + set vars(step) postcts_hold + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_NOVUS::initialize_step postcts_hold] + append commands [FF_NOVUS::insert_comments] + append commands [FF::wrap_command postcts_hold,initialize_step $command] + + append commands "puts \" RUNNING POST-CTS HOLD FIXING ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST-CTS HOLD FIXING\n" + append commands "#\n" + } + + ######################################################################### + # Load pre-postCTS hold file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_postcts_hold_tcl] + + set command "opt_design -post_cts -hold -report_dir $vars(rpt_dir) -report_prefix postcts_hold\n" + append commands [FF::wrap_command postcts_hold,opt_design $command] + + ######################################################################### + # Load post-postCTS hold file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_postcts_hold_tcl 0] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_route {{format 1}} { + + global vars + global env + global errors + + set vars(step) route + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_NOVUS::initialize_step route] + append commands [FF_NOVUS::insert_comments] + append commands [FF::wrap_command route,initialize_step $command] + set command [FF_NOVUS::add_filler_cells] + append commands [FF::wrap_command route,add_filler_cells $command] + + append commands "puts \" RUNNING GLOBAL/DETAIL ROUTING ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING GLOBAL/DETAIL ROUTING\n" + append commands "#\n" + } + + ######################################################################### + # Load optional pre route file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_route_tcl] + + set command [FF_NOVUS::route_secondary_pg_nets] + append commands [FF::wrap_command route,route_secondary_pg_nets $command] + + set command "check_place $vars(rpt_dir)/$vars(step),check_place.rpt\n" + append commands [FF::wrap_command route,check_place $command] + + ######################################################################### + # Route the design + ######################################################################### + + set command "" + set args "" + if {($vars(enable_ocv) == "pre_postroute") || ($vars(enable_ocv) == "pre_postcts")} { +# if {$vars(flow) != "default"} { + append comments "# - vars(enable_ocv)\n" + append args "set_db timing_analysis_type ocv\n" +# } + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "set_db timing_analysis_aocv true\n" + } else { + append ucomments "# - vars(enable_aocv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_postroute\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + } + if {$args != ""} { + set command "$args\n" + append commands [FF::wrap_command route,set_analysis_mode $command] + } + + if {[info exists vars(postroute_spread_wires)] && !$vars(postroute_spread_wires)} { + append commands "set_db route_design_detail_post_route_spread_wire false\n" + } + + set command "route_design" + if {$vars(track_opt)} { + append comments "# - vars(track_opt)\n" + append command " -track_opt" + } else { + append ucomments "# - vars(track_opt)\n" + } + append commands [FF::wrap_command route,route_design "$command\n"] + + ######################################################################### + # Run ckECO if requested + ######################################################################### + + if {[info exists vars(clock_eco)] && (($vars(clock_eco) == "post_route") || ($vars(clock_eco) == "both"))} { + set command [FF_NOVUS::run_clock_eco post_route] + append commands [FF::wrap_command route,run_clock_eco $command] + } + + ######################################################################### + # Optionally run wire spreading + ######################################################################### + + if {[regsub "nm" $vars(process) ""] >= 16} { + if {[info exists vars(postroute_spread_wires)] && $vars(postroute_spread_wires)} { + set command "set_db route_design_detail_post_route_spread_wire true\nset_db route_with_timing_driven false\n" + append command "routeDesign -wireOpt\n" + append command "set_db route_design_detail_post_route_spread_wire false\n" + append commands [FF::wrap_command route,spread_wires $command] + } + } + + ######################################################################### + # Optionally run LPA + ######################################################################### + + if {$vars(verify_litho)} { + file mkdir $vars(rpt_dir)/LPA/DMC + set command "check_litho -routing_layers_only -techFile $vars(lpa_tech_file) -dir $vars(rpt_dir)/LPA\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append commands [FF::wrap_command route,verify_litho $command] + } + + ######################################################################### + # Set extraction mode to postroute + ######################################################################### + set command "set_db extract_rc_engine post_route\n" + if {![catch {set arg $vars(postroute_extraction_effort)}]} { + append comments "# - vars(postroute_extraction_effort)\n" + append command "set_db extract_rc_effort_level $arg\n" + } else { + append ucomments "# - vars(postroute_extraction_effort)\n" + } + if {![catch {set arg $vars(total_c_thresh)}]} { + append comments "# - vars(total_c_thresh)\n" + append command "set_db extract_rc_total_cap_threshold $arg\n" + } else { + append ucomments "# - vars(total_c_thresh)\n" + } + if {![catch {set arg $vars(relative_c_thresh)}]} { + append comments "# - vars(relative_c_thresh)\n" + append command "set_db extract_rc_relative_cap_threshold $arg\n" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(coupling_c_thresh)}]} { + append comments "# - vars(coupling_c_thresh)\n" + append command "set_db extract_rc_coupling_cap_threshold $arg\n" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(qrc_layer_map)}]} { + append comments "# - vars(qrc_layer_map)\n" + append command "set_db extract_rc_lef_tech_file_map $arg" + } else { + append ucomments "# - vars(qrc_layer_map)\n" + } + append command "\n" + append commands [FF::wrap_command route,set_extract_rc_mode $command] + + ######################################################################### + # Load optional post route file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_route_tcl 0] + + ######################################################################### + # Update to MMMC if flow is "pr_mmmc" + ######################################################################### + + if {$vars(flow) != "default"} { + if {$vars(flow) == "pr_mmmc"} { + set command [FF_NOVUS::initialize_timing mmmc] + append commands [FF::wrap_command route,initialize_timing $command] + } + } + + if {![info exists vars(time_design_options,setup)]} { + set command "time_design -post_route -report_prefix route -report_dir $vars(rpt_dir)\n" + } else { + set command [format "time_design -post_route -report_prefix route -report_dir $vars(rpt_dir) %s\n" $vars(time_design_options,setup)] + } + append commands [FF::wrap_command route,time_design $command] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_postroute {{format 1}} { + + global vars + global env + global errors + + set vars(step) postroute + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_NOVUS::initialize_step postroute] + append commands [FF_NOVUS::insert_comments] + append commands [FF::wrap_command postroute,initialize_step $command] + + if {$vars(metalfill) == "pre_postroute"} { + set command [FF::source_plug metalfill_tcl] + append commands [FF::wrap_command postroute,add_metalfill $command] + } + + ######################################################################### + # Run ckECO if requested + ######################################################################### + + if {[info exists vars(clock_eco)] && (($vars(clock_eco) == "post_route") || ($vars(clock_eco) == "both"))} { + set command [FF_NOVUS::run_clock_eco post_route] + append commands "puts \" RUNNING POST-ROUTE CLOCK ECO ...\"\n" + append commands [FF::wrap_command route,run_clock_eco $command] + } + + append commands "puts \" RUNNING POST-ROUTE OPTIMIZATION ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST-ROUTE OPTIMIZATION\n" + append commands "#\n" + } + + ######################################################################### + # Load optional pre postroute file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_postroute_tcl] + if {$vars(high_timing_effort) && [regexp "9.1" $vars(version)]} { + append commands "opt_leakage_power -fix_timing_only\n" + } + if {$vars(postroute_setup_hold)} { + append commands [FF::source_plug pre_postroute_hold_tcl] + set command "opt_design -post_route -report_dir $vars(rpt_dir) -report_prefix postroute -setup -hold\n" + } else { + set command "opt_design -post_route -report_dir $vars(rpt_dir) -report_prefix postroute\n" + } + append commands [FF::wrap_command postroute,opt_design $command] + + ######################################################################### + # Trim metal fill if added + ######################################################################### + + if {$vars(metalfill) == "pre_postroute"} { + set command "trim_metal_fill\n" + append commands [FF::wrap_command postroute,trim_metal_fill $command] + } + + ######################################################################### + # Optionally run LPA + ######################################################################### + + if {$vars(verify_litho)} { + # BCL: Added subst to handle dererencing variables + file mkdir [subst $vars(rpt_dir)]/LPA/DMC + set command "verifyLitho -routingLayersOnly -techFile $vars(lpa_tech_file) -dir $vars(rpt_dir)/LPA\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append commands [FF::wrap_command postroute,verify_litho $command] + } + + ######################################################################### + # Load optional post postRoute file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_postroute_tcl 0] + if {$vars(postroute_setup_hold)} { + append commands [FF::source_plug post_postroute_hold_tcl] + } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_postroute_hold {{format 1}} { + + global vars + global env + global errors + + if {[lsearch $vars(fix_hold) postroute] < 0} { + return "" + } + + ######################################################################### + # Initialize step ... + ######################################################################### + + set vars(step) postroute_hold + set commands "" +# append commands "set vars(step) $vars(step)\n" + + set command [FF_NOVUS::initialize_step postroute_hold] + append commands [FF_NOVUS::insert_comments] + append commands [FF::wrap_command postroute_hold,initialize_step $command] + + append commands "puts \" RUNNING POST-ROUTE HOLD FIXING ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST-ROUTE HOLD FIXING\n" + append commands "#\n" + } + + ######################################################################### + # Load optional pre postRoute hold file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_postroute_hold_tcl] + set command "opt_design -post_route -hold" + append command " -report_dir $vars(rpt_dir) -report_prefix postroute_hold\n" + append commands [FF::wrap_command postroute_hold,opt_design $command] + + ######################################################################### + # Trim metal fill if added + ######################################################################### + + if {$vars(metalfill) == "pre_postroute"} { + set command "trim_metal_fill\n" + append commands [FF::wrap_command postroute_hold,trim_metal_fill $command] + } + + ######################################################################### + # Optionally run LPA + ######################################################################### + + if {$vars(verify_litho)} { + # BCL: Added subst to handle dererencing variables + file mkdir [subst $vars(rpt_dir)]/LPA/DMC + set command "verifyLitho -routingLayersOnly -techFile $vars(lpa_tech_file) -dir $vars(rpt_dir)/LPA\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append commands [FF::wrap_command postroute_hold,verify_litho $command] + } + + ######################################################################### + # Load optional post postRoute hold file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_postroute_hold_tcl 0] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_signoff {{format 1}} { + + global vars + global env + global errors + global env + + if {$vars(step) != "assemble"} { + set vars(step) signoff + } + set commands "" + + ############################################################################### + # Optionally verify/fix litho + ############################################################################### + if {$vars(fix_litho)} { + # BCL: Added subst to handle dererencing variables + file mkdir [subst $vars(rpt_dir)]/LPA/DMC + set command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append command "setNanoRouteMode -droutePostRouteLithoRepair true \\\n" + append command " -drouteMinimizeTopologyChange true\n" + append command "globalDetailRoute\n" + append command "writeHif -file $vars(rpt_dir)/LPA/incr_verify.hif\n" + append command "verifyLitho -signOff \\\n" + append command " -dir $vars(dbs_dir)/LPA2 \\\n" + append command " -cpu $vars(local_cpus) \\\n" + append command " -config $vars(lpa_conf_file) \\\n" + append command " -incrCheck $vars(rpt_dir)/LPA/incr_verify.hif\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA2/DMC/merged.hif\n" + + append commands [FF::wrap_command signoff,fix_litho $command] + } + + ############################################################################### + # Load optional metalfill plug-in + ############################################################################### + if {$vars(metalfill) == "pre_signoff"} { + set command [FF::source_plug metalfill_tcl] + append commands [FF::wrap_command signoff,add_metalfill $command] + } + + set command [FF_NOVUS::initialize_step signoff] + append commands [FF_NOVUS::insert_comments] +# append commands [FF::wrap_command signoff,initialize_step $command] + append commands $command + + ############################################################################### + # Load optional pre signoff file (plug-in) + ############################################################################### + append commands [FF::source_plug pre_signoff_tcl] + + ############################################################################### + # Run RC Extraction + ############################################################################### + + append commands "puts \" RUNNING FINAL SIGNOFF ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING FINAL SIGNOFF\n" + append commands "#\n" + } + + set command "extract_rc\n" + append commands [FF::wrap_command signoff,extract_rc $command] + + ############################################################################### + # Dump SPEF for signoff STA + ############################################################################### + + if {$vars(skip_signoff_checks)} { + set command "" + foreach corner $vars(rc_corners) { + append command "write_parasitics -rc_corner $corner -spef_file $corner.spef.gz\n" + } + } else { + set command "foreach corner \$vars(active_rc_corners) {\n" + append command " write_parasitics -rc_corner \$corner -spef_file \$corner.spef.gz\n" + append command "}\n" + } + append commands [FF::wrap_command signoff,dump_spef $command] + + if {$vars(step) == "assemble" && + [info exists vars(enable_signoff_eco)] && $vars(enable_signoff_eco)} { + set command "time_signoff -report_only -no_eco_db\n" + append commands [FF::wrap_command signoff,time_signoff $command] + } else { + if {$vars(enable_si_aware)} { + if {![info exists vars(time_design_options,setup)]} { + set command "time_design -report_prefix signoff -sign_off -report_only -report_dir $vars(rpt_dir)\n" + } else { + set command [format "time_design -report_prefix signoff -sign_off -report_only -report_dir $vars(rpt_dir) %s\n" $vars(time_design_options,setup)] + } + } else { + if {![info exists vars(time_design_options,setup)]} { + set command "time_design -report_prefix signoff -sign_off -si -report_only -report_dir $vars(rpt_dir)\n" + } else { + set command [format "time_design -report_prefix sign_off -signoff -si -report_only -report_dir $vars(rpt_dir) %s\n" $vars(time_design_options,setup)] + } + } + append commands [FF::wrap_command signoff,time_design_setup $command] + if {$vars(enable_si_aware)} { + if {![info exists vars(time_design_options,hold)]} { + set command "time_design -report_prefix signoff -sign_off -report_only -hold -report_dir $vars(rpt_dir)\n" + } else { + set command [format "time_design -report_prefix signoff -sign_off -report_only -hold -report_dir $vars(rpt_dir) %s\n" $vars(time_design_options,hold)] + } + } else { + if {![info exists vars(time_design_options,hold)]} { + set command "time_design -report_prefix signoff -sign_off -si -report_only -hold -report_dir $vars(rpt_dir)\n" + } else { + set command [format "time_design -report_prefix sign_off -signoff -si -report_only -hold -report_dir $vars(rpt_dir) %s\n" $vars(time_design_options,hold)] + } + } + append commands [FF::wrap_command signoff,time_design_hold $command] + } + + ############################################################################### + # Dump GDS and/or OA data base + ############################################################################### + if {[info exists vars(gds_layer_map)]} { + set command "write_stream $vars(design).gds.gz -map_file $vars(gds_layer_map) " + if {[info exists vars(gds_files)]} { + append command "-merge { " + foreach file $vars(gds_files) { + if {[file exists $file]} { + append command "$file " + } else { + puts " WARNING: GDS FILE $file DOES NOT EXIST .... SKIPPING\n" + } + } + append command "}" + } + append command "\n" + append commands [FF::wrap_command signoff,stream_out $command] + } + if {[info exists vars(oasis_layer_map)]} { + set command "write_oasis $vars(design).oasis.gz -map_file $vars(oasis_layer_map) " + if {[info exists vars(oasis_files)]} { + append command "-merge { " + foreach file $vars(oasis_files) { + if {[file exists $file]} { + append command "$file " + } else { + puts " WARNING: OASIS FILE $file DOES NOT EXIST .... SKIPPING\n" + } + } + append command "}" + } + append command "\n" + append commands [FF::wrap_command signoff,oasis_out $command] + } + + ############################################################################### + # Dump Model for Top Level (Hierarchical Flow Only) + ############################################################################### + set ptn [file tail [pwd]] + if {[info exists vars(partition_list)]} { + if {([lsearch $vars(partition_list) $ptn] != -1)} { + if {[string compare -nocase $vars(dbs_format) "fe"]==0} { + set command "write_ilm -opt_stage postcts -type_flex_ilm ilm -to_dir \[get_db designs .name\].ilm\n" + } else { + if {[lindex [split $vars(version) "."] 0] > 10} { + set command "write_ilm -opt_stage postcts -type_flex_ilm ilm -oa_cellview {$vars(oa_partition_lib) \[get_db designs .name\] ilm}\n" + } else { + set command "write_ilm -opt_stage postcts -type_flex_ilm ilm -to_dir \[get_db designs .name\].ilm\n" + } + } + append commands [FF::wrap_command signoff,write_ilm $command] + } elseif {$vars(step) != "assemble"} { + append commands [FF::wrap_command signoff,unflatten_ilm "unflatten_ilm\n"] + } + } + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING VERIFY COMMANDS\n" + append commands "#\n" + } + + ############################################################################### + # Run verify commands + ############################################################################### + if {!([info exists vars(enable_signoff_eco)] && $vars(enable_signoff_eco))} { + set command "report_summary -out_dir $vars(rpt_dir)\n" + append commands [FF::wrap_command signoff,report_summary $command] + } + set command "check_connectivity\n" + append commands [FF::wrap_command signoff,check_connectivity $command] + set command "check_drc\n" + append commands [FF::wrap_command signoff,check_drc $command] + set command "check_metal_density\n" + append commands [FF::wrap_command signoff,check_metal_density $command] + if {[info exists vars(partition_list)] && ([lsearch $vars(partition_list) $ptn] != -1)} { + if {[string compare $vars(dbs_format) "fe"]==0} { + set command "check_process_antenna -lef_file $ptn.antenna.lef\n" + } else { + set command "check_process_antenna\n" + # Not sure yet how save_abstract would be called- skip this for now. + } + } else { + set command "check_process_antenna\n" + } + append commands [FF::wrap_command signoff,verify_process_antenna $command] + + if {([info exists vars(enable_lvs)] && $vars(enable_lvs)) && ($vars(dbs_format) == "oa")} { + append commands [FF_EDI::create_lvs_data] + } + if {$vars(novus)} { + append commands "set_flowkit_write_db_args -def\n" + } + + ############################################################################### + # Load optional post signoff file (plug-in) + ############################################################################### + append commands [FF::source_plug post_signoff_tcl 0] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + + } + + proc run_assemble {{format 1}} { + + global vars + global errors + global env + + set vars(step) assemble + set commands "" + append commands "set vars(step) $vars(step)\n" + + FF_NOVUS::initialize_step assemble + +# if {$vars(report_run_time)} { +# append commands "set vars($vars(step),start_time) \[clock seconds\]\n" +# } + + if {$vars(verbose)} { + append commands "#\n" + append commands "# ASSEMBLING DESIGN\n" + append commands "#\n" + } + ############################################################################### + # Load "pre assemble" plug-in script + ############################################################################### + append commands [FF::source_plug pre_assemble_tcl] + + ############################################################################### + # Assemble the design + ############################################################################### + set vars(ilm) false + set ilm_list [list] + set pac_list [list] + if {$vars(enable_pac)} { + foreach part $vars(partition_list) { + if {[info exists vars($part,pac_mode)]} { + if {$vars($part,pac_mode) == "ilm"} { + lappend ilm_list $part + } else { + lappend pac_list $part + } + } + } + } + if {[info exists vars(ilm_list)] && ($vars(ilm_list) != "")} { + foreach ilm $vars(ilm_list) { + if {([lsearch $ilm_list $ilm] == -1) && ([lsearch $pac_list $ilm] == -1)} { + lappend ilm_list $ilm + } + } + } + if {$ilm_list != ""} { + set vars(ilm) true + } + + if {$vars(hier_flow_type) == "2pass"} { + set partition_dir $vars(partition_dir_pass2) + } else { + set partition_dir $vars(partition_dir) + } + set dir [file tail [subst $vars(dbs_dir)]] + + if {[lindex [split $vars(version) "."] 0] > 10} { + set command [FF_NOVUS::initialize_timing mmmc] + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set mmmc_file $vars(script_dir)/incr_view_definition.tcl + } else { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file $vars(view_definition_tcl) + } else { + set mmmc_file $vars(script_dir)/view_definition.tcl + } + } + } + if {([string compare -nocase $vars(dbs_format) "oa"]==0) && ([lindex [split $vars(version) "."] 0] > 10)} { + + if {[info exists vars($vars(design),assemble_step)]} { + set command "assemble_design -top_design {$vars(oa_partition_lib) $vars(design) $vars($vars(design),assemble_step)} -mmmc_file $mmmc_file" + } else { + set command "assemble_design -top_design {$vars(oa_partition_lib) $vars(design) signoff} -mmmc_file $mmmc_file" + } + foreach part $vars(partition_list) { + if {[lsearch $ilm_list $part] == -1} { + if {[info exists vars($part,assemble_step)]} { + append command "\\\n -block {$vars(oa_partition_lib) $part $vars($vars($part),assemble_step)}" + } else { + append command "\\\n -block {$vars(oa_partition_lib) $part signoff}" + } + } + } + } else { +# append commands [FF::wrap_command assemble,initialize_timing $command] + if {[lindex [split $vars(version) "."] 0] > 10} { + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set assemble_command "assemble_design -power_intent_file $vars(cpf_file)" + } else { + set assemble_command "assemble_design -mmmc_file $mmmc_file" + } + } else { + set assemble_command "assemble_design" + } + if {[info exists vars($vars(design),assemble_dbs)]} { + set command "$assemble_command -top_dir $vars($vars(design),assemble_dbs)" + } elseif {[info exists vars($vars(design),assemble_step)]} { + set command "$assemble_command $partition_dir/$vars(design)/$dir/$vars($vars(design),assemble_step).enc" + } else { + if {$vars(generate_flow_steps)} { + set command "$assemble_command -top_dir $partition_dir/$vars(design)/$dir/top.top_signoff.enc " + } else { + set command "$assemble_command -top_dir $partition_dir/$vars(design)/$dir/signoff.enc " + } + } + foreach part $vars(partition_list) { + if {[lsearch $ilm_list $part] == -1} { + if {[info exists vars($part,assemble_dbs)]} { + append command "\\\n -block_dir $vars($part,assemble_dbs)" + } elseif {[info exists vars($part,assemble_step)]} { + append command "\\\n -block_dir $partition_dir/$part/$dir/$vars($part,assemble_step).enc" + } else { + if {$vars(generate_flow_steps)} { + append command "\\\n -block_dir $partition_dir/$part/$dir/block.signoff.enc" + } else { + append command "\\\n -block_dir $partition_dir/$part/$dir/signoff.enc" + } + } + } + } + } + if {$vars(enable_pac)} { + append command "\\\n -hierDir $vars(pac_scratch_dir)" + } + append command "\n\n" + + append commands [FF::wrap_command assemble,assemble_design $command] + if {([lindex [split $vars(version) "."] 0] > 10) && $vars(cpf_timing)} { + append commands "source $mmmc_file\n" + } + if {$vars(flow) == "mmmc"} { + set command [FF_NOVUS::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } + + if {$vars(capture_metrics)} { + if {[lindex [split $vars(version) "."] 0] > 13} { + if {$vars(step) != "debug"} { + append commands "enable_metrics -on\n" + append commands "push_snapshot_stack\n" + } + } + } + + append commands [FF::source_plug always_source_tcl] + + ############################################################################### + # Load "post assemble" plug-in script + ############################################################################### + append commands [FF::source_plug post_assemble_tcl 0] + + ############################################################################### + # Specify ILMs if defined + ############################################################################### + if {$vars(ilm)} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# SPECIFYING ILMs\n" + append commands "#\n" + } + set command "" + foreach cell $ilm_list { + if {[info exists vars($cell,ilm_dir)] && [file isdirectory $vars($cell,ilm_dir)]} { + append command "specifyIlm -cell $cell -dir $vars($cell,ilm_dir)\n" + } else { + puts " WARNING: ILM DIRECTORY MISSING FOR $cell ... SKIPPING" + } + } + + append commands [FF::wrap_command assemble,specify_ilm $command] + + if {[info exists vars(ilm_non_sdc_file)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" + } else { + set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" + } + append commands [FF::wrap_command assemble,load_ilm_non_sdc_file $command] + } + } + +# if {[lindex [split $vars(version) "."] 0] <= 10} { +# if {[info exists vars(cpf_file)]} { +# set command "loadCPF $vars(cpf_file)\n" +# append commands [FF::wrap_command assemble,load_cpf $command] +# set command "commitCPF" +# if {$vars(cpf_keep_rows)} { +# append command " -keepRows" +# } +# if {$vars(cpf_power_domain)} { +# append command " -power_domain" +# } +# if {$vars(cpf_isolation)} { +# append command " -isolation" +# } +# if {$vars(cpf_state_retention)} { +# append command " -state_retention" +# } +# if {$vars(cpf_level_shifter)} { +# append command " -level_shifter" +# } +# if {$vars(cpf_power_switch)} { +# append command " -power_switch" +# } +# append command "\n" +# append commands [FF::wrap_command assemble,commit_cpf $command] +# } +# } + + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command [FF_NOVUS::initialize_timing mmmc] + append commands [FF::wrap_command assemble,initialize_timing $command] + } elseif {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set command [FF_NOVUS::initialize_timing mmmc] + append commands [FF::wrap_command assemble,initialize_timing $command] + } + + set command [FF_NOVUS::update_timing mmmc ] + append commands [FF::wrap_command assemble,update_timing $command] + + if {[info exists vars(enable_signoff_eco)] && $vars(enable_signoff_eco)} { + append commands [FF::source_plug pre_signoff_eco_tcl 0] + set command "check_connectivity\n" + append commands [FF::wrap_command assemble,pre_signoff_eco_verify_connectivity $command] + set command "check_drc\n" + append commands [FF::wrap_command assemble,pre_signoff_eco_verify_geometry $command] + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING SIGN-OFF ECO\n" + append commands "#\n" + } + + set command [FF_NOVUS::delete_filler_cells] + append commands [FF::wrap_command assemble,delete_filler_cells $command] + + set command "extract_rc\n" + append commands [FF::wrap_command assemble,extract_rc $command] + + set op [open ptn.txt w] + foreach ptn $vars(partition_list) { + puts $op "$ptn" + } + close $op + + set command "set_db opt_signoff_partition_list_file \"ptn.txt\"\n" + append command "set_db opt_signoff_optimize_replicated_modules true\n" + append commands [FF::wrap_command assemble,set_signoff_mode $command] + + set command "time_signoff -report_only\n" + append commands [FF::wrap_command assemble,time_signoff $command] + set command "opt_design_signoff -setup -no_eco_route\n" + append commands [FF::wrap_command assemble,signoff_opt_design $command] + set command "add_filler\n" + append commands [FF::wrap_command assemble,add_filler_cells $command] + set command "eco_route -handle_partition\n" + append commands [FF::wrap_command assemble,eco_route $command] + + ######################################################################### + # Optionally run LPA + ######################################################################### + + if {$vars(verify_litho)} { + # BCL: Added subst to handle dererencing variables + file mkdir [subst $vars(rpt_dir)]/LPA/DMC + set command "verifyLitho -routingLayersOnly -techFile $vars(lpa_tech_file) -dir $vars(rpt_dir)/LPA\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append commands [FF::wrap_command assemble,verify_litho $command] + } + + append commands [FF::source_plug post_signoff_eco_tcl 0] + set command "check_connectivity\n" + append commands [FF::wrap_command assemble,post_signoff_eco_verify_connectivity $command] + set command "check_drc\n" + append commands [FF::wrap_command assemble,post_signoff_eco_verify_geometry $command] + } elseif {$vars(enable_pac)} { + set command "check_connectivity\n" + append commands [FF::wrap_command assemble,pre_pac_verify_connectivity $command] + set command "check_drc\n" + append commands [FF::wrap_command assemble,pre_pac_verify_geometry $command] + + if {$vars(verbose)} { + append commands "#\n" + append commands "# DEFINING PAC MODES\n" + append commands "#\n" + } + append commands [FF::source_plug pre_pac_tcl 0] + set command "" + foreach part $pac_list { + append command "set hinst \[dbHInstName \[dbCellHInst \[dbGetCellByName $part\]\]\]\n" + if {[info exists vars($part,pac_mode)]} { + if {$vars($part,pac_mode) == "read_only"} { set vars($part,pac_mode) "readOnly" } + append command "setModuleView -hinst \$hinst -type $vars($part,pac_mode)\n" + } + } + + append command "getModuleView\n" + append commands [FF::wrap_command assemble,set_module_view $command] + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST ASSEMBLY CLOSURE\n" + append commands "#\n" + } +# set command [FF_NOVUS::delete_filler_cells] +# append commands [FF::wrap_command assemble,delete_filler_cells $command] + set command "opt_design -post_route -report_dir $vars(rpt_dir) -report_prefix pac\n" + append commands [FF::wrap_command assemble,opt_design $command] +# set command [FF_NOVUS::add_filler_cells] +# append commands [FF::wrap_command assemble,add_filler_cells $command] + + ######################################################################### + # Optionally run LPA + ######################################################################### + + if {$vars(verify_litho)} { + # BCL: Added subst to handle dererencing variables + file mkdir [subst $vars(rpt_dir)]/LPA/DMC + set command "verifyLitho -routingLayersOnly -techFile $vars(lpa_tech_file) -dir $vars(rpt_dir)/LPA\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append commands [FF::wrap_command assemble,verify_litho $command] + } + + append commands [FF::source_plug post_pac_tcl 0] + set command "check_connectivity\n" + append commands [FF::wrap_command assemble,post_pac_verify_connectivity $command] + set command "check_drc\n" + append commands [FF::wrap_command assemble,post_pac_verify_geometry $command] + } + + if {!$vars(codegen)} { + uplevel #0 eval $commands + set commands "" + } + + append commands [FF_NOVUS::run_signoff $format] + +# if {$vars(makefile)} { +# append commands "if {\[info exists env(VPATH)\]} {\n" +# append commands "exec /bin/touch \$env(VPATH)/assemble\n" +# append commands "}\n" +# } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_rebudget {{format 1}} { + + global vars + global errors + global env + + set vars(step) rebudget + set commands "" +# append commands "set vars(step) $vars(step)\n" + + FF_NOVUS::initialize_step $vars(step) + +# if {$vars(report_run_time)} { +# append commands "set vars($vars(step),start_time) \[clock seconds\]\n" +# } + if {!$vars(enable_flexilm)} { + append commands "\nif {\[file isfile $vars(pac_scratch_dir)/.pacFlowLock\]} {\n" + append commands " file delete $vars(pac_scratch_dir)/.pacFlowLock\n" + append commands "}\n" + } else { +# append commands "if {\[file isfile $vars(script_dir)/view_definition.tcl]} {\n" +# append commands " file copy -force $vars(script_dir)/view_definition.tcl $vars(partition_dir)/$vars(design)/viewDefinition.tcl\n" +# append commands "}\n" + } + + if {$vars(verbose)} { + append commands "#\n" + append commands "# ASSEMBLING DESIGN\n" + append commands "#\n" + } + ############################################################################### + # Load "pre rebudget" plug-in script + ############################################################################### + append commands [FF::source_plug pre_rebudget_tcl] + + ############################################################################### + # Get the FlexILM ECO paths + ############################################################################### + if {$vars(enable_flexilm)} { + append commands "if {\[file isfile \$env(VPATH)/flexilm\]} {\n" + append commands " source \$env(VPATH)/flexilm\n" + append commands "}\n" + } + + ############################################################################### + # Assemble the design + ############################################################################### + set vars(ilm) false + set ilm_list [list] + set pac_list [list] + if {$vars(enable_pac)} { + foreach part $vars(partition_list) { + if {[info exists vars($part,pac_mode)]} { + if {$vars($part,pac_mode) == "ilm"} { + lappend ilm_list $part + } else { + lappend pac_list $part + } + } + } + } + if {[info exists vars(ilm_list)] && ($vars(ilm_list) != "")} { + foreach ilm $vars(ilm_list) { + if {([lsearch $ilm_list $ilm] == -1) && ([lsearch $pac_list $ilm] == -1)} { + lappend ilm_list $ilm + } + } + } + if {$ilm_list != ""} { + set vars(ilm) true + } + + # BCL: Added tail of subst of vars(dbs_dir) + # Note - EDIFF Hierarchical flow is currently INCOMPATIBLE with FF dir structure + # The following code appears to rely on vars(dbs_dir) always being under $vars(partition_dir)/$vars(design) + # This needs to be reconciled + set dir [file tail [subst $vars(dbs_dir)]] + + if {[lindex [split $vars(version) "."] 0] > 10} { + set command [FF_NOVUS::initialize_timing mmmc] + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set mmmc_file $vars(script_dir)/incr_view_definition.tcl + } else { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file $vars(view_definition_tcl) + } else { + set mmmc_file $vars(script_dir)/view_definition.tcl + } + } + } + if {([string compare -nocase $vars(dbs_format) "oa"]==0) && ([lindex [split $vars(version) "."] 0] > 10)} { + + if {[info exists vars($vars(design),rebudget_assemble_step)]} { + set command "assemble_design -top_design {$vars(oa_partition_lib) $vars(design) $vars($vars(design),rebudget_assemble_step)} -mmmc_file $mmmc_file" + } else { + set command "assemble_design -top_design {$vars(oa_partition_lib) $vars(design) cts} -mmmc_file $mmmc_file" + } + foreach part $vars(partition_list) { + if {[lsearch $ilm_list $part] == -1} { + if {[info exists vars($part,rebudget_assemble_step)]} { + append command "\\\n -block {$vars(oa_partition_lib) $part $vars($vars($part),rebudget_assemble_step)}" + } else { + append command "\\\n -block {$vars(oa_partition_lib) $part cts}" + } + } + } + } else { +# append commands [FF::wrap_command rebudget,initialize_timing $command] + if {[lindex [split $vars(version) "."] 0] > 10} { + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set assemble_command "assemble_design -power_intent_file $vars(cpf_file)" + } else { + set assemble_command "assemble_design -mmmc_file $mmmc_file" + } + } else { + set assemble_command "assemble_design" + } + if {[info exists vars($vars(design),rebudget_assemble_dbs)]} { + set command "$assemble_command -top_dir $vars($vars(design),rebudget_assemble_dbs)" + } elseif {[info exists vars($vars(design),rebudget_assemble_step)]} { + set command "$assemble_command $vars(partition_dir)/$vars(design)/$dir/$vars($vars(design),rebudget_assemble_step).enc" + } else { + if {$vars(enable_flexilm)} { + if {$vars(generate_flow_steps)} { + set command "$assemble_command \\\n -top_dir $vars(partition_dir)_FLEXILM/$vars(design) " + } else { + set command "$assemble_command \\\n -top_dir $vars(partition_dir)_FLEXILM/$vars(design) " + } + } else { + if {$vars(generate_flow_steps)} { + set command "$assemble_command -top_dir $vars(partition_dir)/$vars(design)/$dir/top.cts.enc " + } else { + set command "$assemble_command -top_dir $vars(partition_dir)/$vars(design)/$dir/cts.enc " + } + } + } + foreach part $vars(partition_list) { + if {[lsearch $ilm_list $part] == -1} { + if {[info exists vars($part,rebudget_assemble_dbs)]} { + append command "\\\n -block_dir $vars($part,rebudget_assemble_dbs)" + } elseif {[info exists vars($part,rebudget_assemble_step)]} { + append command "\\\n -block_dir $vars(partition_dir)/$part/$dir/$vars($part,rebudget_assemble_step).enc" + } else { + if {$vars(enable_flexilm)} { + append command "\\\n -block_dir \$vars($part,cdtv) " + } else { + if {$vars(generate_flow_steps)} { + append command "\\\n -block_dir $vars(partition_dir)/$part/$dir/block.cts.enc" + } else { + append command "\\\n -block_dir $vars(partition_dir)/$part/$dir/cts.enc" + } + } + } + } + } + } + if {$vars(enable_pac)} { + append command "\\\n -hierDir $vars(pac_scratch_dir)" + } + append command "\n" + + append commands [FF::wrap_command $vars(step),assemble_design $command] + if {([lindex [split $vars(version) "."] 0] > 10) && $vars(cpf_timing)} { + append commands "source $mmmc_file\n" + } + if {$vars(flow) == "mmmc"} { + set command [FF_NOVUS::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } + + append commands [FF::source_plug always_source_tcl] + + ############################################################################### + # Load "post rebudget" plug-in script + ############################################################################### + append commands [FF::source_plug post_rebudget_tcl 0] + + ############################################################################### + # Specify ILMs if defined + ############################################################################### + if {$vars(ilm)} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# SPECIFYING ILMs\n" + append commands "#\n" + } + set command "" + foreach cell $ilm_list { + if {[info exists vars($cell,ilm_dir)] && [file isdirectory $vars($cell,ilm_dir)]} { + append command "specifyIlm -cell $cell -dir $vars($cell,ilm_dir)\n" + } else { + puts " WARNING: ILM DIRECTORY MISSING FOR $cell ... SKIPPING" + } + } + + append commands [FF::wrap_command $vars(step),specify_ilm $command] + + if {[info exists vars(ilm_non_sdc_file)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" + } else { + set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" + } + append commands [FF::wrap_command $vars(step),load_ilm_non_sdc_file $command] + } + } + +# if {[lindex [split $vars(version) "."] 0] <= 10} { +# if {[info exists vars(cpf_file)]} { +# set command "loadCPF $vars(cpf_file)\n" +# append commands [FF::wrap_command $vars(step),load_cpf $command] +# set command "commitCPF" +# if {$vars(cpf_keep_rows)} { +# append command " -keepRows" +# } +# if {$vars(cpf_power_domain)} { +# append command " -power_domain" +# } +# if {$vars(cpf_isolation)} { +# append command " -isolation" +# } +# if {$vars(cpf_state_retention)} { +# append command " -state_retention" +# } +# if {$vars(cpf_level_shifter)} { +# append command " -level_shifter" +# } +# if {$vars(cpf_power_switch)} { +# append command " -power_switch" +# } +# append command "\n" +# append commands [FF::wrap_command $vars(step),commit_cpf $command] +# } +# } + + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command [FF_NOVUS::initialize_timing mmmc] + append commands [FF::wrap_command $vars(step),initialize_timing $command] + } elseif {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set command [FF_NOVUS::initialize_timing mmmc] + append commands [FF::wrap_command $vars(step),initialize_timing $command] + } + + if {!$vars(enable_flexilm)} { + set command [FF_NOVUS::update_timing mmmc ] + append commands [FF::wrap_command $vars(step),update_timing $command] + } + + if {$vars(enable_pac)} { + + if {$vars(verbose)} { + append commands "#\n" + append commands "# DEFINING PAC MODES\n" + append commands "#\n" + } + append commands [FF::source_plug pre_pac_tcl 0] + set command "" + foreach part $pac_list { + append command "set hinst \[dbHInstName \[dbCellHInst \[dbGetCellByName $part\]\]\]\n" + if {[info exists vars($part,pac_mode)]} { + if {$vars($part,pac_mode) == "read_only"} { set vars($part,pac_mode) "readOnly" } + append command "setModuleView -hinst \$hinst -type $vars($part,pac_mode)\n" + } + } + + append command "getModuleView\n" + append commands [FF::wrap_command $vars(step),set_module_view $command] + + if {!$vars(enable_flexilm)} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST ASSEMBLY CLOSURE\n" + append commands "#\n" + } + set command "opt_design -post_cts -report_dir $vars(rpt_dir) -report_prefix pac\n" + append commands [FF::wrap_command $vars(step),opt_design $command] + + append commands [FF::source_plug post_pac_tcl 0] + } + } + + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "set_db route_trial_floorplan_mode true\nset_db route_trial_honor_pin true\n" + append command "route_trial\n" + } else { + set command "set_db route_trial_floorplan_mode true\nset_db route_early_global_honor_partition_pin .\n" + append command "route_early_global\n" + } + append command "create_timing_budget -no_trial_ipo -no_constant_model\n" + append commands [FF::wrap_command $vars(step),create_timing_budget $command] + + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + set command "write_db -oa_lib_cell_view {$vars(oa_design_lib) $vars(design) budget}\n" + } + } else { + set command "write_db $vars(dbs_dir)/budget.enc\n" + } + append commands [FF::wrap_command $vars(step),save_budget_dbs $command] + + ############################################################################### + # Partition and save the partitions into the + # directory PARTITION + ############################################################################### +# append commands [FF::source_plug pre_partition_tcl] + +# set command "set ptngPtnTimingLibFormat lib\npartition -buildScan\n" + set command "partition -buildScan\n" + append commands [FF::wrap_command $vars(step),partition $command] + if {[lindex [split $vars(version) "."] 0] > 10} { + if {([string compare $vars(dbs_format) "oa"]==0)} { + if {$vars(hier_flow_type) == "1pass"} { + set command "savePartition -ptnLib $vars(oa_partition_lib) -dir $vars(partition_dir)\n" + } else { + set command "savePartition -ptnLib $vars(oa_partition_lib) -dir $vars(partition_dir_pass2)\n" + } + } else { + if {$vars(hier_flow_type) == "1pass"} { + set command "savePartition -dir $vars(partition_dir) -def -scanDef\n" + } else { + set command "savePartition -dir $vars(partition_dir_pass2) -def -scanDef\n" + } + } + } else { + set command "savePartition -dir $vars(partition_dir) -def -scanDef\n" + } + append commands [FF::wrap_command $vars(step),save_partition $command] +# append commands [FF::source_plug post_partition_tcl] + + if {$vars(use_flexmodels) && $vars(flexmodel_as_ptn)} { +# set command "replace_proto_model \\\n" +# append command " -pre_ft_dir $vars(eco_dir)/pre_ft \\\n" +# append command " -post_ft_dir $vars(eco_dir)/post_ft \\\n" +# append command " -ptn_dir $vars(partition_dir) \\\n" +# append command " -ptn_full_netlist_dir ./temp_netlist_dir \\\n" +# append command " -out_dir $vars(partition_dir)\n" + + set command "replace_proto_model \\\n" + append command " -ptn_dir $vars(partition_dir) \\\n" + append command " -out_dir $vars(partition_dir)\n" + + append commands [FF::wrap_command $vars(step),replace_proto_model $command] + } + + if {!$vars(codegen)} { + uplevel #0 eval $commands + set commands "" + } + +# if {$vars(makefile) && !$vars(generate_flow_steps)} { + append commands "if {\[info exists env(VPATH)\]} {\n" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)\n" + append commands "}\n" +# } + +# if {$vars(enable_flexilm)} { +# append commands "# Copy Makefiles in case they get deleted during the flow ...\n" +# foreach part [concat $vars(design) $vars(partition_list)] { +# append commands "file copy -force $vars(script_dir)/$part.Makefile $vars(partition_dir_pass2)/$part/Makefile\n" +# } +# append commands "file copy -force $vars(partition_dir)/Makefile $vars(partition_dir_pass2)/Makefile\n" +# append commands "file copy -force $vars(partition_dir)/Makefile.partition $vars(partition_dir_pass2)/Makefile.partition\n" +# } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_assemble_flexilm {{format 1}} { + + global vars + global errors + global env + + set vars(step) assemble_flexilm + set commands "" +# append commands "set vars(step) $vars(step)\n" + + FF_NOVUS::initialize_step $vars(step) + + if {$vars(verbose)} { + append commands "#\n" + append commands "# ASSEMBLING DESIGN\n" + append commands "#\n" + } + ############################################################################### + # Load "pre rebudget" plug-in script + ############################################################################### + append commands [FF::source_plug pre_rebudget_tcl] + + ############################################################################### + # Assemble the design + ############################################################################### + set vars(ilm) false + if {[info exists vars(ilm_list)] && ($vars(ilm_list) != "")} { + set vars(ilm) true + } else { + set vars(ilm_list) "" + } + + # BCL: Added tail of subst of vars(dbs_dir) + # Note - EDIFF Hierarchical flow is currently INCOMPATIBLE with FF dir structure + # The following code appears to rely on vars(dbs_dir) always being under $vars(partition_dir)/$vars(design) + # This needs to be reconciled + set dir [file tail [subst $vars(dbs_dir)]] + + if {[lindex [split $vars(version) "."] 0] > 10} { + set command [FF_NOVUS::initialize_timing mmmc] + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set mmmc_file $vars(script_dir)/incr_view_definition.tcl + } else { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file $vars(view_definition_tcl) + } else { + set mmmc_file $vars(script_dir)/view_definition.tcl + } + } + } + if {([string compare -nocase $vars(dbs_format) "oa"]==0) && ([lindex [split $vars(version) "."] 0] > 10)} { + + if {[info exists vars($vars(design),rebudget_assemble_step)]} { + set command "assemble_design -top_design {$vars(oa_partition_lib) $vars(design) $vars($vars(design),rebudget_assemble_step)} -mmmc_file $mmmc_file" + } else { + set command "assemble_design -top_design {$vars(oa_partition_lib) $vars(design) cts} -mmmc_file $mmmc_file" + } + foreach part $vars(partition_list) { + if {[lsearch $ilm_list $part] == -1} { + if {[info exists vars($part,rebudget_assemble_step)]} { + append command "\\\n -block {$vars(oa_partition_lib) $part $vars($vars($part),rebudget_assemble_step)}" + } else { + append command "\\\n -block {$vars(oa_partition_lib) $part cts}" + } + } + } + } else { +# append commands [FF::wrap_command rebudget,initialize_timing $command] + if {[lindex [split $vars(version) "."] 0] > 10} { + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set assemble_command "assemble_design -cpf_file $vars(cpf_file)" + } else { + set assemble_command "assemble_design -mmmc_file $mmmc_file" + } + } else { + set assemble_command "assemble_design" + } + if {[info exists vars($vars(design),rebudget_assemble_dbs)]} { + set command "$assemble_command -def_merge -top_design $vars($vars(design),rebudget_assemble_dbs)" + } elseif {[info exists vars($vars(design),rebudget_assemble_step)]} { + set command "$assemble_command -def_merge $vars(partition_dir)/$vars(design)/$dir/$vars($vars(design),rebudget_assemble_step).enc" + } else { + if {$vars(enable_flexilm)} { +# set command "$assemble_command \\\n -top_dir $vars(partition_dir_pass2)/$vars(design) " + set command "$assemble_command \\\n -top_dir $vars(partition_dir)_PRECTS/$vars(design) " + } else { + set command "$assemble_command -top_dir $vars(partition_dir)/$vars(design)/$dir/cts.enc " + } + } + foreach part $vars(partition_list) { + if {[lsearch $vars(ilm_list) $part] == -1} { + if {[info exists vars($part,rebudget_assemble_dbs)]} { + append command "\\\n -block_dir $vars($part,rebudget_assemble_dbs)" + } elseif {[info exists vars($part,rebudget_assemble_step)]} { + append command "\\\n -block_dir $vars(partition_dir)/$part/$dir/$vars($part,rebudget_assemble_step).enc" + } else { + if {$vars(enable_flexilm)} { + append command "\\\n -block_dir $vars(partition_dir)_PRECTS/$part/${part}_post_eco.enc" + } else { + append command "\\\n -block_dir $vars(partition_dir)/$part/$dir/cts.enc" + } + } + } + } + } + append command "\n" + append commands [FF::wrap_command $vars(step),assemble_design $command] + + append commands [FF::source_plug always_source_tcl] + + + set command "" + # Additional timing setup + if {[info exists vars($vars(design),latency_sdc)]} { + append command "foreach mode \[all_constraint_modes -active\] {\n" + append command " set sdc_files \[get_constraint_mode \$mode -sdc_files\]\n" + append command " set sdc_list \[concat \$sdc_files $vars($vars(design),latency_sdc)\]\n" + append command " update_constraint_mode -name \$mode -sdc_files \$sdc_list\n" + append command "}\n" + + append commands [FF::wrap_command $vars(step),update_constraint_mode $command] + } + + foreach view [concat $vars(setup_analysis_views) $vars(hold_analysis_views)] { + foreach ptn $vars(partition_list) { + if {[info exists vars($ptn,$view,latency_sdc)]} { + set latency($view,$ptn) $vars($ptn,$view,latency_sdc) + } elseif {[info exists vars($ptn,latency_sdc)]} { + set latency($view,$ptn) $vars($ptn,latency_sdc) + } else { + set latency($view,$ptn) "none" + } + } + } + + set command "" + foreach view [concat $vars(setup_analysis_views) $vars(hold_analysis_views)] { + foreach ptn $vars(partition_list) { + if {$latency($view,$ptn) != "none"} { + append command "set_partition_user_constraints_file -view $view -name $latency($view,$ptn) -partition $ptn\n" + } + } + } + + if {$command != ""} { + append commands [FF::wrap_command $vars(step),set_partition_user_constraints_file $command] + } + + if {([lindex [split $vars(version) "."] 0] > 10) && $vars(cpf_timing)} { + append commands "source $mmmc_file\n" + } + if {$vars(flow) == "mmmc"} { + set command [FF_NOVUS::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } + + ############################################################################### + # Load "post assemble_flexilm" plug-in script + ############################################################################### + append commands [FF::source_plug post_flexilm 0] + + ############################################################################### + # Specify ILMs if defined + ############################################################################### + if {$vars(ilm)} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# SPECIFYING ILMs\n" + append commands "#\n" + } + set command "" + foreach cell $vars(ilm_list) { + if {[info exists vars($cell,ilm_dir)] && [file isdirectory $vars($cell,ilm_dir)]} { + append command "specify_ilm -cell $cell -dir $vars($cell,ilm_dir)\n" + } else { + puts " WARNING: ILM DIRECTORY MISSING FOR $cell ... SKIPPING" + } + } + + append commands [FF::wrap_command $vars(step),specify_ilm $command] + + if {[info exists vars(ilm_non_sdc_file)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" + } else { + set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" + } + append commands [FF::wrap_command $vars(step),load_ilm_non_sdc_file $command] + } + } + +# if {[lindex [split $vars(version) "."] 0] <= 10} { +# if {[info exists vars(cpf_file)]} { +# set command "loadCPF $vars(cpf_file)\n" +# append commands [FF::wrap_command $vars(step),load_cpf $command] +# set command "commitCPF" +# if {$vars(cpf_keep_rows)} { +# append command " -keepRows" +# } +# if {$vars(cpf_power_domain)} { +# append command " -power_domain" +# } +# if {$vars(cpf_isolation)} { +# append command " -isolation" +# } +# if {$vars(cpf_state_retention)} { +# append command " -state_retention" +# } +# if {$vars(cpf_level_shifter)} { +# append command " -level_shifter" +# } +# if {$vars(cpf_power_switch)} { +# append command " -power_switch" +# } +# append command "\n" +# append commands [FF::wrap_command $vars(step),commit_cpf $command] +# } +# } + + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command [FF_NOVUS::initialize_timing mmmc] + append commands [FF::wrap_command $vars(step),initialize_timing $command] + } elseif {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set command [FF_NOVUS::initialize_timing mmmc] + append commands [FF::wrap_command $vars(step),initialize_timing $command] + } + + if {!$vars(enable_flexilm)} { + set command [FF_NOVUS::update_timing mmmc ] + append commands [FF::wrap_command $vars(step),update_timing $command] + } + + set command "" + foreach name $vars(partition_list) { + append command "set_partition_pin_status -partition $name -pins * -status placed\n" + } + append commands [FF::wrap_command $vars(step),set_partition_pin_status $command] + +# set command "db_delete_route_trial\n" +# append commands [FF::wrap_command $vars(step),delete_route_trial $command] + + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "set_db route_trial_handle_partition_complex true\n" + append command "set_db route_trial_honor_pin false\n" + append command "route_trial\n" + append commands [FF::wrap_command $vars(step),route_trial $command] + } else { + set command "set_db set_db route_early_global_honor_partition_fence .\n" + append command "set_db route_early_global_honor_partition_pin {}\n" + append command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route $command] + } + + set command "" + append command "create_active_logic_view -type flat_top\n" + append command "time_design -pre_cts -report_dir $vars(rpt_dir) -report_prefix assemble_prects_flexilm\n" + append command "clear_active_logic_view\n" + append commands [FF::wrap_command $vars(step),create_active_logic_view $command] + +# append command "derive_timing_budget -no_trial_ipo -no_constant_model\n" +# append commands [FF::wrap_command $vars(step),derive_timing_budget $command] + +# if {[string compare -nocase $vars(dbs_format) "oa"]==0} { +# if {[lindex [split $vars(version) "."] 0] > 10} { +# set command "write_db -cellview {$vars(oa_design_lib) $vars(design) budget}\n" +# } else { +# set command "write_oa_design $vars(oa_design_lib) $vars(design) budget\n" +# } +# } else { +# set command "write_design $vars(dbs_dir)/budget.enc\n" +# } +# append commands [FF::wrap_command $vars(step),save_design,budget $command] + + append commands "#---------------------------------------------------------------------\n" + append commands "# GENERATING REPORTS\n" + append commands "#---------------------------------------------------------------------\n" + + if {$vars(report_power)} { + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + set command "report_power -view $vars(power_analysis_view) -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } else { + set command "report_power -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } + append commands [FF::wrap_command $vars(step),report_power $command] + } + + if {[FF::is_lp_flow] && [info exists vars(power_domains)] && [llength $vars(power_domains)] > 1} { + + ###################################################################### + # Verify power domain + ###################################################################### + +# set command "check_power_domains -bind -gconn" +# append command " -iso_net_pd $vars(rpt_dir)/$vars(step).isonets.rpt" +# append command " -x_net_pd $vars(rpt_dir)/$vars(step).xnets.rpt\n" + +# append commands [FF::wrap_command $vars(step),check_power_domain $command] + + ###################################################################### + # Run CLP + ###################################################################### + + if {$vars(run_clp) && ([auto_execok lec] != "")} { + set command "run_clp " + if {[info exists vars(clp_options)]} { + append command $vars(clp_options) + } + append command "\n" + append commands [FF::wrap_command $vars(step),run_clp $command] + } else { + if {![info exists vars(clp_warning)]} { + puts " WARNING: UNABLE TO RUN CLP ... PLEASE MAKE SURE IT IS IN YOUR PATH" + set vars(clp_warning) true + } + } + } + if {!$vars(codegen)} { + uplevel #0 eval $commands + set commands "" + } + + if {!$vars(generate_flow_steps)} { + append commands "if {\[info exists env(VPATH)\]} {\n" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)\n" + append commands "}\n" + } + +# if {$vars(enable_flexilm)} { +# append commands "# Copy Makefiles in case they get deleted during the flow ...\n" +# foreach part [concat $vars(design) $vars(partition_list)] { +# append commands "file copy -force $vars(script_dir)/$part.Makefile $vars(partition_dir_pass2)/$part/Makefile\n" +# } +# append commands "file copy -force $vars(partition_dir)/Makefile $vars(partition_dir_pass2)/Makefile\n" +# append commands "file copy -force $vars(partition_dir)/Makefile.partition $vars(partition_dir_pass2)/Makefile.partition\n" +# } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_flexilm {{format 1}} { + + global vars + global errors + global env + + set vars(step) flexilm + set commands "" +# append commands "set vars(step) $vars(step)\n" + + FF_NOVUS::initialize_step flexilm + +# if {$vars(report_run_time)} { +# append commands "set vars($vars(step),start_time) \[clock seconds\]\n" +# } + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RESTORING DESIGN\n" + append commands "#\n" + } + ############################################################################### + # Load "pre flexilm" plug-in script + ############################################################################### + append commands [FF::source_plug pre_flexilm_tcl] + + ############################################################################### + # Restore the design + ############################################################################### + set vars(ilm) false + set ilm_list [list] + set pac_list [list] + if {$vars(enable_pac)} { + foreach part $vars(partition_list) { + if {[info exists vars($part,pac_mode)]} { + if {$vars($part,pac_mode) == "ilm"} { + lappend ilm_list $part + } else { + lappend pac_list $part + } + } + } + } + if {[info exists vars(ilm_list)] && ($vars(ilm_list) != "")} { + foreach ilm $vars(ilm_list) { + if {([lsearch $ilm_list $ilm] == -1) && ([lsearch $pac_list $ilm] == -1)} { + lappend ilm_list $ilm + } + } + } + if {$ilm_list != ""} { + set vars(ilm) true + } + + # BCL: Added tail of subst of vars(dbs_dir) + # Note - EDIFF Hierarchical flow is currently INCOMPATIBLE with FF dir structure + # The following code appears to rely on vars(dbs_dir) always being under $vars(partition_dir)/$vars(design) + # This needs to be reconciled + set dir [file tail [subst $vars(dbs_dir)]] + + if {[lindex [split $vars(version) "."] 0] > 10} { + set command [FF_NOVUS::initialize_timing mmmc] + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set mmmc_file $vars(script_dir)/incr_view_definition.tcl + } else { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file $vars(view_definition_tcl) + } else { + set mmmc_file $vars(script_dir)/view_definition.tcl + } + } + } + +# append commands "setLimitedAccessFeature encFlexILM 1\n" + + append commands "file copy -force $vars(script_dir)/view_definition.tcl $vars(partition_dir)/$vars(design)/$vars(dbs_dir)/prects.enc/viewDefinition.tcl\n" + + set cwd [exec pwd] + append commands "cd $vars(partition_dir)/$vars(design)\n" + +# set command "read_db . $vars(design)\n" + set command "read_db $vars(dbs_dir)/prects.enc \n" + append commands [FF::wrap_command flexilm,read_db $command] + +# if {([lindex [split $vars(version) "."] 0] > 10) && $vars(cpf_timing)} { +# append commands "source $mmmc_file\n" +# } + append commands [FF::source_plug always_source_tcl] + + ############################################################################### + # Load "post flexilm" plug-in script + ############################################################################### + append commands [FF::source_plug post_flexilm 0] + + ############################################################################### + # Specify ILMs if defined + ############################################################################### + if {$vars(ilm)} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# SPECIFYING ILMs\n" + append commands "#\n" + } + set command "" + foreach cell $ilm_list { + if {[info exists vars($cell,ilm_dir)] && [file isdirectory $vars($cell,ilm_dir)]} { + append command "specifyIlm -cell $cell -dir $vars($cell,ilm_dir)\n" + } else { + puts " WARNING: ILM DIRECTORY MISSING FOR $cell ... SKIPPING" + } + } + + append commands [FF::wrap_command $vars(step),specify_ilm $command] + +# if {[info exists vars(ilm_non_sdc_file)]} { +# if {[lindex [split $vars(version) "."] 0] <= 10} { +# set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" +# } else { +# set command "set_ilm_non_sdc_constraints_file $vars(ilm_non_sdc_file)\n" +# } +# append commands [FF::wrap_command $vars(step),load_ilm_non_sdc_file $command] +# } +# } + +# if {[lindex [split $vars(version) "."] 0] <= 10} { +# if {[info exists vars(cpf_file)]} { +# set command "loadCPF $vars(cpf_file)\n" +# append commands [FF::wrap_command $vars(step),load_cpf $command] +# set command "commitCPF" +# if {$vars(cpf_keep_rows)} { +# append command " -keepRows" +# } +# if {$vars(cpf_power_domain)} { +# append command " -power_domain" +# } +# if {$vars(cpf_isolation)} { +# append command " -isolation" +# } +# if {$vars(cpf_state_retention)} { +# append command " -state_retention" +# } +# if {$vars(cpf_level_shifter)} { +# append command " -level_shifter" +# } +# if {$vars(cpf_power_switch)} { +# append command " -power_switch" +# } +# append command "\n" +# append commands [FF::wrap_command $vars(step),commit_cpf $command] +# } + } + +# if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set command [FF_NOVUS::initialize_timing mmmc] + append commands [FF::wrap_command $vars(step),initialize_timing $command] +# } + +# set command [FF_NOVUS::update_timing mmmc ] +# append commands [FF::wrap_command $vars(step),update_timing $command] + + foreach mode [concat $vars(active_setup_views) $vars(active_hold_views)] { + set command "update_constraint_mode -name $mode -ilm_sdc_files \[get_constraint_mode $mode -sdc_files\]\n" + append commands [FF::wrap_command $vars(step),update_constraint_mode $command] + } + + append commands "cd $cwd\n" + + set command "" + foreach part $vars(partition_list) { + append command "set_module_model -cell $part \\\n" + append command "-type flexIlm \\\n" + append command "-dir $vars(partition_dir)/$part/$part.flexilm\n" + } + + append commands [FF::wrap_command $vars(step),set_module_model $command] + + set command "commit_module_model\n" + append commands [FF::wrap_command $vars(step),commit_module_model $command] + + set command "" + foreach part $vars(partition_list) { + append command "setModuleView -partition $part -type interface\n" + } + append commands [FF::wrap_command $vars(step),set_module_view $command] + + set command "getModuleView\n" + append commands [FF::wrap_command $vars(step),get_module_view $command] + + if {$vars(flow) == "mmmc"} { + set command [FF_NOVUS::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + set command "" +# foreach mode $vars(constraint_modes) { +# append command "update_constraint_mode -name $mode -sdc_files \"$vars($mode,pre_cts_sdc)\"\n" +# } +# append commands [FF::wrap_command $vars(step),update_constraint_mode $command] + } + + #set_analysis_view -setup [all_setup_analysis_views] -hold [all_hold_analysis_views] + #puts " SETUP -> [all_setup_analysis_views]" + #puts " HOLD -> [all_hold_analysis_views]" + + set command "create_active_logic_view -type top_critical -pre_cts\n" + append commands [FF::wrap_command $vars(step),create_active_logic_view $command] + set command "set_db opt_hier_opt_stage pre_cts\n" + append commands [FF::wrap_command $vars(step),set_hier_mode $command] +# set command "setOptMode -addInstancePreFix FlexILMI_ -addNetPreFix FlexILMN_\n" +# append commands [FF::wrap_command $vars(step),set_opt_mode $command] + + append commands [FF::source_plug pre_flexilm_tcl 0] + set command "" + foreach part $pac_list { + append command "set hinst \[dbHInstName \[dbCellHInst \[dbGetCellByName $part\]\]\]\n" + if {[info exists vars($part,pac_mode)]} { + if {$vars($part,pac_mode) == "read_only"} { set vars($part,pac_mode) "readOnly" } + append command "setModuleView -hinst \$hinst -type $vars($part,pac_mode)\n" + } + } + + append command "getModuleView\n" + append commands [FF::wrap_command $vars(step),set_module_view $command] + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING FLEXILM OPTIMIZATION\n" + append commands "#\n" + } + set command "opt_design -pre_cts -report_dir $vars(rpt_dir) -report_prefix flexilm\n" + append commands [FF::wrap_command $vars(step),opt_design $command] + + append commands [FF::source_plug post_flexilm_tcl 0] + + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + set command "write_db -oa_lib_cell_view {$vars(oa_design_lib) $vars(design) flexilm}\n" + } + } else { + set command "write_db $vars(dbs_dir)/flexilm.enc\n" + } + append commands [FF::wrap_command $vars(step),save_dbs $command] + + set command "clear_active_logic_view\n" + append commands [FF::wrap_command $vars(step),clear_active_logic_view $command] + + set command "update_partition -flex_ilm_eco \\\n" + foreach part $vars(partition_list) { + append command " -golden_block_dir $vars(partition_dir)/$part/$vars(dbs_dir)/prects.enc \\\n" + } + append command " -flex_ilm_dir $vars(partition_dir)_FLEXILM\n" + append commands [FF::wrap_command $vars(step),update_partition $command] + + set command "report_resource -end opt_flexIlm\n" + append commands [FF::wrap_command $vars(step),report_resource $command] + + append commands "#---------------------------------------------------------------------\n" + append commands "# GENERATING REPORTS\n" + append commands "#---------------------------------------------------------------------\n" + + if {$vars(report_power)} { + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + set command "report_power -view $vars(power_analysis_view) -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } else { + set command "report_power -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } + append commands [FF::wrap_command $vars(step),report_power $command] + } + + if {[FF::is_lp_flow] && [info exists vars(power_domains)] && [llength $vars(power_domains)] > 1} { + + ###################################################################### + # Verify power domain + ###################################################################### + +# set command "check_power_domains -bind -gconn" +# append command " -iso_net_pd $vars(rpt_dir)/$vars(step).isonets.rpt" +# append command " -x_net_pd $vars(rpt_dir)/$vars(step).xnets.rpt\n" + +# append commands [FF::wrap_command $vars(step),check_power_domains $command] + + ###################################################################### + # Run CLP + ###################################################################### + + if {$vars(run_clp) && ([auto_execok lec] != "")} { + set command "run_clp " + if {[info exists vars(clp_options)]} { + append command $vars(clp_options) + } + append command "\n" + append commands [FF::wrap_command $vars(step),run_clp $command] + } else { + if {![info exists vars(clp_warning)]} { + puts " WARNING: UNABLE TO RUN CLP ... PLEASE MAKE SURE IT IS IN YOUR PATH" + set vars(clp_warning) true + } + } + } + if {!$vars(codegen)} { + uplevel #0 eval $commands + set commands "" + } + +# if {$vars(makefile)} { + append commands "if {\[info exists env(VPATH)\]} {\n" + append commands "set op \[open $env(VPATH)/flexilm w\]\n" + foreach part $vars(partition_list) { + append commands "puts \$op \"set vars($part,cdtv) \$::Rda_CDTV::ilmDataInfo($part,blockDir)\"\n" + } + append commands "close \$op\n" +# foreach part $vars(partition_list) { +# append commands "file copy -force $vars(partition_dir_pass2)/$part/Makefile $vars(partition_dir_pass2)/$part.Makefile\n" +# } + + append commands "exec /bin/touch \$env(VPATH)/$vars(step)\n" + append commands "}\n" +# } + + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_partition_place {{format 1}} { + + global vars + global errors + global env + + set vars(step) partition_place + set vars(hier) true + if {[info exists vars(time_design_options,setup)]} { + set tmp_time_design_options_setup $vars(time_design_options,setup) + } else { + set vars(time_design_options,setup) "" + } + + set commands "" + + + if {!$vars(use_flexmodels)} { + # Initialise the design if not using flexmodels + if {$vars(codegen)} { + append commands [FF_NOVUS::run_init $format] + } else { + FF_NOVUS::run_init $format + } + } + + if {$vars(use_proto_net_delay_model) } { + if {!$vars(use_flexmodels)} { + set command "catch {exec rm -rf proto_model_BACKUP}\ncatch {exec mv -f proto_model proto_model_BACKUP}\n" + append commands [FF::wrap_command $vars(step),proto_model_BACKUP $command] + set command "create_proto_net_delay_model\n" + append commands [FF::wrap_command $vars(step),create_ps_per_micron_model $command] + } + set command "time_design -proto -pre_place -report_prefix preplace -report_dir $vars(rpt_dir)\n" + append commands [FF::wrap_command $vars(step),time_design $command] + } else { + set command "time_design -pre_place -report_prefix preplace -report_dir $vars(rpt_dir)\n" + append commands [FF::wrap_command $vars(step),time_design $command] + } + + if {$vars(use_flexmodels)} { + set command "report_proto_models -created\n" + append commands [FF::wrap_command $vars(step),report_proto_models $command] + } + + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + set command "write_db -oa_lib_cell_view {$vars(oa_design_lib) $vars(design) init}\n" + } + } else { + if {$vars(step) != "partition_place"} { + set command "write_db $vars(dbs_dir)/init.enc \n" + } else { + set command "" + } + } + + append commands [FF::wrap_command $vars(step),save_design,init $command] + + set command "" + # Additional timing setup + if {[info exists vars($vars(design),latency_sdc)]} { + append command "foreach mode \[all_constraint_modes -active\] {\n" + append command " set sdc_files \[get_constraint_mode \$mode -sdc_files\]\n" + append command " set sdc_list \[concat \$sdc_files $vars($vars(design),latency_sdc)\]\n" + append command " update_constraint_mode -name \$mode -sdc_files \$sdc_list\n" + append command "}\n" + + append commands [FF::wrap_command $vars(step),update_constraint_mode $command] + } + + foreach view [concat $vars(setup_analysis_views) $vars(hold_analysis_views)] { + foreach ptn $vars(partition_list) { + if {[info exists vars($ptn,$view,latency_sdc)]} { + set latency($view,$ptn) $vars($ptn,$view,latency_sdc) + } elseif {[info exists vars($ptn,latency_sdc)]} { + set latency($view,$ptn) $vars($ptn,latency_sdc) + } else { + set latency($view,$ptn) "none" + } + } + } + + set command "" + foreach view [concat $vars(setup_analysis_views) $vars(hold_analysis_views)] { + foreach ptn $vars(partition_list) { + if {$latency($view,$ptn) != "none"} { + append command "set_partition_user_constraints_file -view $view -name $latency($view,$ptn) -partition $ptn\n" + } + } + } + + if {$command != ""} { + append commands [FF::wrap_command $vars(step),set_partition_user_constraints_file $command] + } + + # Insert feedthrough and trial route, as appropriate + set do_trial_route_time_design 1 + + # Pre-placement + if {[info exists vars(place,set_place_mode,skip)]} { + set cache_skip_place_mode $vars(place,set_place_mode,skip) + } + set vars(place,set_place_mode,skip) 1 + if {[info exists vars(place,place_design,skip)]} { + set cache_skip_place_design $vars(place,place_design,skip) + } + set vars(place,place_design,skip) 1 + + set vars(hier_case) "$vars(use_flexmodels)$vars(placement_based_ptn)$vars(abutted_design)$vars(insert_feedthrough)" + + # Disable scan reorder for partitioning flow + # set command "set_db place_reorder_scan false\n" + # append commands [FF::wrap_command $vars(step),set_place_mode $command] + + append command "if {\[get_db hinsts .partition.clones\] != \"\"} {\n" + append command " align_partition_clones\n" + append command "}\n" + append commands [FF::wrap_command $vars(step),align_partition_clones $command] + + switch $vars(hier_case) { + "0000" { + if {$vars(enable_nrgr)} { +# set command "set_db design_use_turbo_nrgr_flow true\n" +# append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + } + "0001" { + if {$vars(enable_nrgr)} { +# set command "set_db design_use_turbo_nrgr_flow true\n" +# append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + "0010" { + if {$vars(enable_nrgr)} { +# set command "set_db design_use_turbo_nrgr_flow true\n" +# append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + "0011" { + if {$vars(enable_nrgr)} { +# set command "set_db design_use_turbo_nrgr_flow true\n" +# append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + "0100" { + if {$vars(enable_nrgr)} { +# set command "set_db design_use_turbo_nrgr_flow true\n" +# append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\nset_db place_design_floorplan_mode true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + "0101" { + if {$vars(enable_nrgr)} { +# set command "set_db design_use_turbo_nrgr_flow true\n" +# append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\nset_db place_design_floorplan_mode true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + "0110" { + if {$vars(enable_nrgr)} { +# set command "set_db design_use_turbo_nrgr_flow true\n" +# append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\nset_db place_design_floorplan_mode true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + "0111" { + if {$vars(enable_nrgr)} { +# set command "set_db design_use_turbo_nrgr_flow true\n" +# append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\nset_db place_design_floorplan_mode true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + + "1000" { + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + set command "set_proto_mode -place_effort default\n" + append commands [FF::wrap_command $vars(step),set_proto_mode $command] + set command "set_db route_trial_floorplan_mode true\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + } + "1001" { + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + set command "set_proto_mode -place_effort default\n" + append commands [FF::wrap_command $vars(step),set_proto_mode $command] + set command "set_db route_trial_floorplan_mode true\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + } + "1010" { + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + set command "set_proto_mode -place_effort default\n" + append commands [FF::wrap_command $vars(step),set_proto_mode $command] + set command "set_db route_trial_floorplan_mode true\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + } + "1011" { + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + set command "set_proto_mode -place_effort default\n" + append commands [FF::wrap_command $vars(step),set_proto_mode $command] + set command "set_db route_trial_floorplan_mode true\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + } + "1100" { + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\nset_db place_design_floorplan_mode true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + } + "1101" { + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\nset_db place_design_floorplan_mode true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + } + "1110" { + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\nset_db place_design_floorplan_mode true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + } + } + "1111" { + set command "set_db place_global_cong_effort auto\nset_db place_global_clock_gate_aware true\nset_db place_global_place_io_pins true\nset_db place_design_floorplan_mode true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + } + } + + if {$vars(use_proto_net_delay_model)} { + set command "set_proto_mode -timing_net_delay_model use_actual_wire\n" + append commands [FF::wrap_command $vars(step),set_proto_model $command] + } + + # Place design + + set save $vars(place_opt_design) + if {$vars(codegen)} { + append commands [FF_NOVUS::run_place $format] + } else { + uplevel #0 eval $commands + FF_NOVUS::run_place $format + set commands "" + } + set vars(place_opt_design) $save + + if {[info exists cache_skip_place_mode]} { + set vars(place,set_place_mode,skip) $cache_skip_place_mode + } else { + set vars(place,set_place_mode,skip) false + } + if {[info exists cache_skip_place_mode]} { + set vars(place,place_design,skip) $cache_skip_place_design + } else { + set vars(place,place_design,skip) false + } + + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + set command "write_db -oa_lib_cell_view {$vars(oa_design_lib) $vars(design) place}\n" + } + } else { + set command "write_db $vars(dbs_dir)/place.enc \n" + } + append commands [FF::wrap_command $vars(step),save_design $command] + + # Post-placement + switch $vars(hier_case) { + "0000" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "set_db route_trial_handle_partition_complex true\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + set command "route_trial\n" + append commands [FF::wrap_command $vars(step),route_trial $command] + } else { + set command "set_db route_early_global_honor_partition_fence .\n" + append commands [FF::wrap_command $vars(step),set_route__mode $command] + set command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route $command] + } + } + "0001" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "route_trial\n" + append commands [FF::wrap_command $vars(step),route_trial_1 $command] + set command "add_partition_feedthrus -route_based -write_topological_file topo.txt -net_mapping netmapping.txt -double_buffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "set_db route_trial_handle_partition_complex true\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + set command "route_trial\n" + append commands [FF::wrap_command $vars(step),route_trial_2 $command] + } else { + set command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route_1 $command] + set command "add_partition_feedthrus -route_based -write_topological_file topo.txt -net_mapping netmapping.txt -double_buffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "set_db route_early_global_honor_partition_fence .\n" + append commands [FF::wrap_command $vars(step),set_route_mode $command] + set command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route_2 $command] + } + } + "0010" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "set_db route_trial_handle_partition_complex true\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + set command "route_trial\n" + append commands [FF::wrap_command $vars(step),route_trial $command] + } else { + set command "set_db route_early_global_honor_partition_fence .\n" + append commands [FF::wrap_command $vars(step),set_route_mode $command] + set command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route $command] + } + } + "0011" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "route_trial\n" + append commands [FF::wrap_command $vars(step),route_trial_1 $command] + set command "add_partition_feedthrus -route_based -write_topological_file topo.txt -net_mapping netmapping.txt -double_buffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "set_db route_trial_handle_partition_complex true\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + set command "route_trial\n" + append commands [FF::wrap_command $vars(step),route_trial_2 $command] + } else { + set command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route_1 $command] + set command "add_partition_feedthrus -route_based -write_topological_file topo.txt -net_mapping netmapping.txt -double_buffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "set_db route_early_global_honor_partition_fence .\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + set command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route_2 $command] + } + } + "0100" { + } + "0101" { + } + "0110" { + } + "0111" { + set command "add_partition_feedthrus -write_topological_file topo.txt -net_mapping netmapping.txt -double_buffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + } + "1000" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "set_db route_trial_handle_partition_complex true\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + set command "route_trial\n" + append commands [FF::wrap_command $vars(step),route_trial $command] + } else { + set command "set_db route_early_global_honor_partition_fence .\n" + append commands [FF::wrap_command $vars(step),set_route_mode $command] + set command "route_early_global\n" + append commands [FF::wrap_command $vars(step),route_early $command] + } + } + "1001" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "route_trial\n" + append commands [FF::wrap_command $vars(step),route_trial $command] + set command "add_partition_feedthrus -route_based -write_topological_file topo.txt -net_mapping netmapping.txt -double_buffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "set_db route_trial_handle_partition_complex true\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + set command "route_trial\n" + append commands [FF::wrap_command $vars(step),route_trial $command] + } else { + set command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route_1 $command] + set command "add_partition_feedthrus -route_based -write_topological_file topo.txt -net_mapping netmapping.txt -double_buffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "set_db route_early_global_honor_partition_fence .\n" + append commands [FF::wrap_command $vars(step),set_route__mode $command] + set command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route_2 $command] + } + } + "1010" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "set_db route_trial_handle_partition_complex true\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + set command "route_trial\n" + append commands [FF::wrap_command $vars(step),route_trial $command] + } else { + set command "set_db route_early_global_honor_partition_fence .\n" + append commands [FF::wrap_command $vars(step),set_route_mode $command] + set command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route $command] + } + + } + "1011" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "route_trial\n" + append commands [FF::wrap_command $vars(step),route_trial $command] + set command "add_partition_feedthrus -route_based -write_topological_file topo.txt -net_mapping netmapping.txt -double_buffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "set_db route_trial_handle_partition_complex true\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + set command "route_trial\n" + append commands [FF::wrap_command $vars(step),route_trial $command] + } else { + set command "route_early_global\n" + append commands [FF::wrap_command $vars(step),early_route_1 $command] + set command "add_partition_feedthrus -route_based -write_topological_file topo.txt -net_mapping netmapping.txt -double_buffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "set_db route_early_global_honor_partition_fence .\n" + append commands [FF::wrap_command $vars(step),set_route_trial_mode $command] + set command "route_early_global\n" + append commands [FF::wrap_command $vars(step),route_early_2 $command] + } + } + "1100" { + } + "1101" { + set command "add_partition_feedthrus -write_topological_file topo.txt -net_mapping netmapping.txt -double_buffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + } + "1110" { + set do_route_trial_time_design 0 + } + "1111" { + set command "add_partition_feedthrus -write_topological_file topo.txt -net_mapping netmapping.txt -double_buffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + } + } + if {$vars(use_proto_net_delay_model)} { + set command "time_design -proto -pre_cts -report_prefix place -report_dir $vars(rpt_dir)\n" + } else { + set command "time_design -pre_cts -report_prefix place -report_dir $vars(rpt_dir)\n" + } + append commands [FF::wrap_command $vars(step),time_design $command] + + # Output or run the generated commands + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + + } + + proc run_assign_pin {{format 1}} { + global vars + global errors + global env + + set vars(step) assign_pin + set vars(hier) true + set commands "" + + ############################################################################### + # Assign partition pins via plug-in as this the + # pitch, depth, and layer values are design specific + # Also, verify the pin assignment and fix them + ############################################################################### + + append commands [FF::source_plug pre_assign_pin_tcl] + + set command "assign_partition_pins\n" + append commands [FF::wrap_command $vars(step),assign_partition_pins $command] + + append commands [FF::source_plug post_assign_pin_tcl] + + set command "check_pin_assignment\n" + append commands [FF::wrap_command $vars(step),check_pin_assignment $command] + + set command "report_unaligned_nets -out_file $vars(rpt_dir)/unaligned.rpt\n" + append commands [FF::wrap_command $vars(step),report_unaligned_nets $command] + + if {!([info exists vars(placement_based_ptn)] && $vars(placement_based_ptn))} { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "set_db route_trial_handle_partition_complex true\nset_db route_trial_honor_pin true\n" + append command "route_trial\n" + } else { + set command "set_db route_early_global_honor_partition_fence .\nset_db route_early_global_honor_partition_pin .\n" + append command "route_early_global\n" + } + append commands [FF::wrap_command $vars(step),route_trial $command] + } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_model_gen {{format 1}} { + + global vars + global errors + global env + + set vars(step) model_gen + set vars(hier) true + set commands "" + + # Initialise the design + if {$vars(codegen)} { + append commands [FF_NOVUS::run_init $format] + } else { + FF_NOVUS::run_init $format + } + + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + set command "write_db -oa_lib_cell_view {$vars(oa_design_lib) $vars(design) init}\n" + } else { + set command "write_db $vars(dbs_dir)/init.enc\n" + } + + append commands [FF::wrap_command $vars(step),save_design,init $command] + + + if {$vars(use_proto_net_delay_model) && $vars(use_flexmodels)} { + set command "catch {exec rm -rf proto_model_BACKUP}\ncatch {exec mv -f proto_model proto_model_BACKUP}\n" + append commands [FF::wrap_command $vars(step),proto_model_BACKUP $command] + set command "create_ps_per_micron_model\n" + append commands [FF::wrap_command $vars(step),create_ps_per_micron_model $command] + } + + append commands [FF::source_plug pre_model_gen_tcl] + + if {$vars(enable_nrgr)} { +# set command "set_db design_use_turbo_nrgr_flow true\n" +# append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + + set vars(hier_case) "$vars(flexmodel_as_ptn)$vars(insert_feedthrough)" + + switch $vars(hier_case) { + "00" { + set command "identify_proto_model\n" + append commands [FF::wrap_command $vars(step),identify_proto_model $command] + } + "01" { + set command "identify_proto_model\n" + append commands [FF::wrap_command $vars(step),identify_proto_model $command] + } + "10" { + set command "set_db proto_create_partition_as_flexmodel true\n" + append commands [FF::wrap_command $vars(step),set_proto_mode $command] +# if {[info exists vars(partition_list)] && ($vars(partition_list) != "")} { +# foreach ptn $vars(partition_list) { +# set command "set_proto_model -model $ptn -type flex_module\n" +# append commands [FF::wrap_command $vars(step),set_proto_model $command] +# } +# } else { +# puts " ERROR: Flexmodel partition flow enabled but no partitions are defined" +# set errors($vars(error_count)) "Flexmodel partition flow enabled but no partitions are defined" +# incr vars(error_count) +# } + } + "11" { + set command "set_db proto_create_partition_as_flexmodel true\n" + append commands [FF::wrap_command $vars(step),set_proto_mode $command] +# if {[info exists vars(partition_list)] && ($vars(partition_list) != "")} { +# foreach ptn $vars(partition_list) { +# set command "set_proto_model -model $ptn -type flex_module\n" +# append commands [FF::wrap_command $vars(step),set_proto_model $command] +# } +# } else { +# puts " ERROR: Flexmodel partition flow enabled but no partitions are defined" +# set errors($vars(error_count)) "Flexmodel partition flow enabled but no partitions are defined" +# incr vars(error_count) +# } + } + } + +# if {[info exists vars(model_gen,min_inst)]} { +# set min_inst $vars(model_gen,min_inst) +# } else { +# set min_inst 1000 +# } +# set command "set_db ilm_keep_high_fanout_ports false\n" +# append commands [FF::wrap_command $vars(step),setIlmMode $command] + + set command "set_db ilm_keep_high_fanout_ports false\n" + append commands [FF::wrap_command $vars(step),set_ilm_mode $command] + if {$vars(flexmodel_art_based)} { + set command "create_proto_model -out_dir $vars(dbs_dir)/model_gen.enc\n" + } else { + set command "create_proto_model -partition_based\ncommit_proto_model\n" + } + append commands [FF::wrap_command $vars(step),create_proto_model $command] + if {$vars(create_flexfiller_blockage)} { + set command "create_flexfiller_route_blockage\n" + append commands [FF::wrap_command $vars(step),create_flexfiller_route_blockage $command] + } + + append commands [FF::source_plug post_model_gen_tcl] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_partition {{format 1}} { + + global vars + global errors + global env + + set vars(step) partition + set vars(hier) true + + set commands "" + + ############################################################################### + # Budget the blocks based on the mode + ############################################################################### + + set command "" +# append command "set_global timing_support_hierarchical_pin_constraints true\n" +# append command "set_db tbgPrintExceptionInfoInJustify 1\n" + append commands [FF::wrap_command $vars(step),set_budget_vars $command] + + if {$vars(budget_mode) == "proto_net_delay_model" && $vars(use_proto_net_delay_model)} { + set command "time_design -proto -report_prefix budget -report_dir $vars(rpt_dir)\n" + append commands [FF::wrap_command $vars(step),time_design $command] + } + + # Define budgeting options ... + set command "" + + append command "set_db budget_write_latency_per_clock true\n" + + append command "if {\[get_db hinsts .partition.clones\] != \"\"} {\n" + append command " set_db budget_merge_clones true\n" + append command "}\n" + + if {[info exists vars(abutted_design)] && $vars(abutted_design)} { + append command "set_db budget_abutted true\n" + } + +# switch [string tolower $vars(budget_mode)] { +# giga_opt { +# append command "set_db budget_virtual_opt_engine giga_opt\n" +# } +# proto_net_delay_model { +# if {$vars(use_proto_net_delay_model)} { +# append command "set_db budget_virtual_opt_engine none\n" +# } +# } +# } +# append command "set_db budget_enable_mt_budgeting true\n" + + append commands [FF::wrap_command $vars(step),set_budgeting_mode $command] + + if {([string tolower $vars(budget_mode)] != "proto_net_delay_model") && $vars(use_proto_net_delay_model)} { + set command "set_proto_timing_settings -reset\n" + append commands [FF::wrap_command $vars(step),set_proto_timing_settings $command] + } + set command "create_timing_budget -justify\n" + append commands [FF::wrap_command $vars(step),create_timing_budget $command] + + ############################################################################### + # Run CLP + ############################################################################### + if {[FF::is_lp_flow] && [info exists vars(power_domains)] && [llength $vars(power_domains)] > 1} { + if {$vars(run_clp) && ([auto_execok lec] != "")} { + set command "run_clp " + if {[info exists vars(clp_options)]} { + append command $vars(clp_options) + } + append command "\n" + append commands [FF::wrap_command $vars(step),run_clp $command] + } + } + + ############################################################################### + # Partition and save the partitions into the + # directory PARTITION + ############################################################################### + +# if {$vars(use_flexmodels)} { +# set max_layer [getTrialRouteMode -maxRouteLayer] +# setPlaceMode -reset +# setTrialRouteMode -reset +# setTrialRouteMode -maxRouteLayer $max_layer +# } + + append commands [FF::source_plug pre_partition_tcl] + + set command "commit_partition -build_scan\n" + append commands [FF::wrap_command $vars(step),partition $command] + if {[lindex [split $vars(version) "."] 0] > 10} { + if {([string compare $vars(dbs_format) "oa"]==0)} { + set command "write_partitions -partition_lib $vars(oa_partition_lib) -dir $vars(partition_dir)\n" + } else { + set command "write_partitions -dir $vars(partition_dir) -def -def_scan\n" + } + } else { + set command "write_partitions -dir $vars(partition_dir) -def -def_scan\n" + } + append commands [FF::wrap_command $vars(step),save_partition $command] + + if {$vars(use_flexmodels) && $vars(flexmodel_as_ptn)} { +# set command "replace_proto_model \\\n" +# append command " -pre_ft_dir $vars(eco_dir)/pre_ft \\\n" +# append command " -post_ft_dir $vars(eco_dir)/post_ft \\\n" +# append command " -ptn_dir $vars(partition_dir) \\\n" +# append command " -ptn_full_netlist_dir ./temp_netlist_dir \\\n" +# append command " -out_dir $vars(partition_dir)\n" + + set command "replace_proto_model \\\n" + append command " -ptn_dir $vars(partition_dir) \\\n" + append command " -out_dir $vars(partition_dir)\n" + + append commands [FF::wrap_command $vars(step),replace_proto_model $command] + } + + append commands [FF::source_plug post_partition_tcl] + + append commands "#---------------------------------------------------------------------\n" + append commands "# GENERATING REPORTS\n" + append commands "#---------------------------------------------------------------------\n" + + if {$vars(report_power)} { + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + set command "report_power -view $vars(power_analysis_view) -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } else { + set command "report_power -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } + append commands [FF::wrap_command $vars(step),report_power $command] + } + set command "" + + if {[FF::is_lp_flow] && [info exists vars(power_domains)] && [llength $vars(power_domains)] > 1} { + + ###################################################################### + # Verify power domain + ###################################################################### + +# set command "check_power_domain -bind -gconn" +# append command " -iso_net_pd $vars(rpt_dir)/$vars(step).isonets.rpt" +# append command " -x_net_pd $vars(rpt_dir)/$vars(step).xnets.rpt\n" + +# append commands [FF::wrap_command $vars(step),check_power_domain $command] + + ###################################################################### + # Run CLP + ###################################################################### + + if {$vars(run_clp) && ([auto_execok lec] != "")} { + set command "run_clp " + if {[info exists vars(clp_options)]} { + append command $vars(clp_options) + } + append command "\n" + append commands [FF::wrap_command $vars(step),run_clp $command] + } else { + if {![info exists vars(clp_warning)]} { + puts " WARNING: UNABLE TO RUN CLP ... PLEASE MAKE SURE IT IS IN YOUR PATH" + set vars(clp_warning) true + } + } + } + + if {!$vars(codegen)} { + uplevel #0 eval $commands + } + + set path [file normalize $vars(script_path)] + + file mkdir $vars(partition_dir) + + if {![file exists $vars(partition_dir)/Makefile.partition]} { + file copy $vars(script_path)/ETC/INNOVUS/Makefile.partition $vars(partition_dir) + } + set op [open $vars(partition_dir)/Makefile w] + if {![info exists env(VPATH)]} { + set env(VPATH) "make" + } + puts $op "VPATH=$env(VPATH)" + puts $op "BLOCKS = $vars(partition_list)" + puts $op "" + puts $op "include Makefile.partition" + close $op + + foreach var [array names vars] { + set svars($var) $vars($var) + } + set vars(mode) flat +# set vars(hier) true + set link [file normalize $vars(script_root)] + foreach block [concat $vars(design) $vars(partition_list)] { + exec mkdir -p $vars(partition_dir)/$block +# if {[file exists .ff.tcl]} { +# file copy -force .ff.tcl $vars(partition_dir)/$block +# } + if {[file exists $vars(partition_dir)/$block/Makefile]} { + file delete $vars(partition_dir)/$block/Makefile + } + if {[info exists vars($block,innovus_config_tcl)] && [file exists $vars($block,innovus_config_tcl)]} { + puts " Sourcing $vars($block,innovus_config_tcl)" + source $vars($block,innovus_config_tcl) + } + set cwd [pwd] + + if {([lindex [split $vars(version) "."] 0] > 10) && ([string compare $vars(dbs_format) "oa"]==0)} { + if {[file exists cds.lib]} { + set ip [open cds.lib r] + set i 0 + while {[gets $ip line]>=0} { + set cds_lib($i) $line + incr i + } + close $ip + } else { + puts " ERROR: A cds.lib file is required for open access flows ..." + } + } + cd $vars(partition_dir)/$block + set vars(design) $block + if {$vars(codegen)} { + if {[info exists vars(proc_file)]} { + unset vars(proc_file) + } + unset vars(steps) + } + if {[info exists vars(cts_spec)]} { + unset vars(cts_spec) + } + if {[info exists vars($block,cts_spec)]} { + set vars(cts_spec) $vars($block,cts_spec) + } + + if {!$vars(codegen)} { + exec ln -s $link SCRIPTS + exec ln -s SCRIPTS/Makefile.edi.flat Makefile + } else { + set vars(mode) flat + set vars(hier) true + unset vars(step) + execute_flow all $vars(format_lines) + FF::dump_vars + } + cd $cwd +# set actions $vars(actions) + foreach var [array names vars] { + if {$var != "processed_plugins"} { + unset vars($var) + } + } +# set vars(actions) $actions + foreach var [array names svars] { + if {$var != "processed_plugins"} { + set vars($var) $svars($var) + } + } + } + if {$vars(hier_flow_type) == "2pass"} { + foreach block [concat $vars(design) $vars(partition_list)] { + exec mkdir -p $vars(partition_dir_pass2)/$block/$vars(script_dir)/INNOVUS + exec mkdir -p $vars(partition_dir_pass2)/$block/$vars(rpt_dir) + if {[file isdirectory $vars(partition_dir_pass2)/$block/$vars(script_dir)/ETC]} { + file delete -force $vars(partition_dir_pass2)/$block/$vars(script_dir)/ETC + } +# file copy -force $vars(partition_dir)/$block/$vars(script_dir)/ETC $vars(partition_dir_pass2)/$block/$vars(script_dir)/ETC + foreach file [glob $vars(partition_dir)/Make*] { + if {[file isfile $file]} { + file copy -force $file $vars(partition_dir_pass2) + } + } + foreach file [glob $vars(partition_dir)/$block/$vars(script_dir)/*] { + if {[file isfile $file]} { + file copy -force $file $vars(partition_dir_pass2)/$block/$vars(script_dir) + } + } + if {[file isfile $vars(partition_dir)/$block/.ilm_non_sdc_file.tcl]} { + file copy -force $vars(partition_dir)/$block/.ilm_non_sdc_file.tcl $vars(partition_dir_pass2)/$block + } + if {[file isfile $vars(partition_dir)/$block/empty.sdc]} { + file copy -force $vars(partition_dir)/$block/empty.sdc $vars(partition_dir_pass2)/$block + } + if {[file isfile $vars(partition_dir)/$block/Makefile.pass2]} { + file copy -force $vars(partition_dir)/$block/Makefile.pass2 $vars(partition_dir_pass2)/$block/Makefile + file delete $vars(partition_dir)/$block/Makefile.pass2 + } + cd $vars(partition_dir_pass2)/$block + if {$vars(enable_flexilm)} { + set index [lsearch [FF::adjust_steps] cts] + } else { + set index [lsearch [FF::adjust_steps] postcts] + } + cd $cwd + foreach step [lrange $vars(steps) $index end] { + if {[lsearch $vars(fsteps) $step] != -1} { + if {[file isfile $vars(partition_dir)/$block/$vars(script_dir)/INNOVUS/run_$step.tcl]} { + file copy -force $vars(partition_dir)/$block/$vars(script_dir)/INNOVUS/run_$step.tcl \ + $vars(partition_dir_pass2)/$block/$vars(script_dir)/INNOVUS + file delete -force $vars(partition_dir)/$block/$vars(script_dir)/INNOVUS/run_$step.tcl + } + } + } +# if {$vars(enable_flexilm)} { +# file copy -force $vars(partition_dir)/$block/Makefile.pass2 $vars(partition_dir_pass2)/$block.Makefile +# } else { +# file copy -force $vars(partition_dir)/$block/Makefile.pass2 $vars(partition_dir_pass2)/$block/Makefile +# } +# cd $vars(partition_dir_pass2)/$block +# set adjusted [FF::adjust_steps] +# FF::gen_makefile [lrange $vars(steps) $index end] flat +# FF::gen_makefile [lrange $adjusted $index end] flat +# cd $cwd + } + } + + foreach var [array names vars] { + unset vars($var) + } + foreach var [array names svars] { + set vars($var) $svars($var) + } + + if {$vars(codegen)} { +# if {$vars(makefile)} { +# append commands "\nexec /bin/touch $env(VPATH)/partition\n" +# } + return $commands + } else { + exec /bin/touch $env(VPATH)/partition + } + } + + proc run_debug {{format 1}} { + + global vars + global errors + global env + + set commands "" + append commands "\nglobal env\n" + + append commands "if {\[info exists env(STEP)\]} {\n" + append commands "[FF_NOVUS::load_design \$env(STEP)]\n" + append commands "}\n" + +# append commands "[FF::source_plug always_source_tcl]\n" + + append commands "gui_fit\n" + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + + } + + proc run_lec {} { + + global vars + global errors + global env + + set commands "" + + append commands "vpxmode\n" + append commands "set dofile abort exit\n" + append commands "set undefined cell black_box -noascend -both\n" + append commands "tclmode\n" + append commands "// setup variables \n" + append commands "global vars\n" + append commands "proc Puts {args} {\n" + append commands " puts \$args\n" + append commands "}\n" + + append command "// Define the netlist to be verify\n" + append commands "if {\[info exists env(STEP)\] && \[file exists $vars(dbs_dir)/LEC/\$env(STEP).v.gz\]} {\n" + append commands " set revisedNetlist $vars(dbs_dir)/LEC/\$env(STEP).v.gz\n" + append commands "} else {\n" + append commands " puts \" Failed to find netlist DBS/LEC/\$env(STEP).v.gz\"\n" + append commands "}\n" + + if {[info exists vars(threads)]} { + append commands "vpx set compare option -threads $vars(threads)\n" + } + + append commands "// read liberty cell definitions\n" + if {[info exists vars($vars(default_setup_view),delay_corner)]} { + if {[info exists vars($vars($vars(default_setup_view),delay_corner),library_set)]} { + set set $vars($vars($vars(default_setup_view),delay_corner),library_set) + } else { + return + } + } else { + return + } + append commands "vpx read library -statetable -both -liberty \[list $vars($set,timing)\]\n" + + append commands "// read reference netlist\n" + append commands "vpx read design -verilog -sensitive -golden $vars(netlist)\n" + + append commands "// read post-implementation netlist\n" + append commands "vpx read design -verilog -sensitive -revised \$revisedNetlist\n" + + append commands "//set top level\n" + append commands "vpx set root module $vars(design) -both\n" + + regsub -all "#" [FF::source_plug pre_lec_tcl] "//" temp + append commands $temp + + append commands "vpxmode\n" + append commands "report design data\n" + append commands "report black box\n" + + append commands "set mapping method -name first\n" + append commands "set flatten model -seq_constant -seq_constant_x_to 0\n" + append commands "set flatten model -nodff_to_dlat_zero -nodff_to_dlat_feedback\n" + append commands "set flatten model -gated_clock\n" + append commands "set system mode lec\n" + append commands "add compare point -all\n" + append commands "compare -gate_to_gate\n" + append commands "usage\n" + append commands "// vpx report compare data" + append commands "report compare data -class nonequivalent -class abort -class notcompared\n" + append commands "report verification -verbose\n" + append commands "report statistics\n" + + append commands "tclmode\n" + append commands "set points_count \[get_compare_points -count\]\n" + append commands "set diff_count \[get_compare_points -diff -count\]\n" + append commands "set abort_count \[get_compare_points -abort -count\]\n" + append commands "set unknown_count \[get_compare_points -unknown -count\]\n" + append commands "if {\$points_count == 0} {\n" + append commands " puts \"---------------------------------\"\n" + append commands " puts \"ERROR: No compare points detected\"\n" + append commands " puts \"---------------------------------\"\n" + append commands "}\n" + append commands "if {\$diff_count > 0} {\n" + append commands " puts \"------------------------------------\"\n" + append commands " puts \"ERROR: Different Key Points detected\"\n" + append commands " puts \"------------------------------------\"\n" + append commands "}\n" + append commands "if {\$abort_count > 0} {\n" + append commands " puts \"-----------------------------\"\n" + append commands " puts \"ERROR: Abort Points detected \"\n" + append commands " puts \"-----------------------------\"\n" + append commands "}\n" + append commands "if {\$unknown_count > 0} {\n" + append commands " puts \"----------------------------------\"\n" + append commands " puts \"ERROR: Unknown Key Points detected\"\n" + append commands " puts \"----------------------------------\"\n" + append commands "}\n" + append commands "puts \"No of compare points = \$points_count\"\n" + append commands "puts \"No of diff points = \$diff_count\"\n" + append commands "puts \"No of abort points = \$abort_count\"\n" + append commands "puts \"No of unknown points = \$unknown_count\"\n" + append commands "exit 0\n" + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + + } + + proc dump_config {} { + + global vars + global udm + global rda_Input + global rda_defaults + +# set commands "" + file mkdir $vars(script_dir) + if {[info command FFF::get_tool] ne "" && [FFF::get_tool] eq "rc"} { + tcl_source $vars(script_path)/ETC/INNOVUS/udm.tcl + } else { + source $vars(script_path)/ETC/INNOVUS/udm.tcl + } + if {[info exists vars(cpf_file)]} { + if {$vars(cpf_timing)} { + unset init(mmmc_file) + } else { + unset init(cpf_file) + } + } + if {[lindex [split $vars(version) "."] 0] > 10} { + if {!$vars(generate_flow_steps) || ([lindex [split $vars(version) "."] 0] < 15)} { + set op [open $vars(script_dir)/init.tcl w] + # BCL: Trying to fix embedded paths... + set relativizeMesgLog "" + set relativizeMesgLog "$relativizeMesgLog [FF::remove_outer_braces [FF::relativizeFileOrDir -arr init -vardir ff_exe_dir -relativePathsOk]]" + + #foreach var [array names init] { + # puts $op "set init_$var \"$init($var)\"" + #} + foreach var [array names ninit] { + if {$vars(netlist_type) == "verilog"} { + if {$var == "oa_design_lib"} { continue } + if {$var == "oa_design_cell"} { continue } + if {$var == "oa_design_view"} { continue } + } + puts $op "set_db init_$var \"$ninit($var)\"" + } + close $op + } + } else { + set op [open $vars(script_dir)/run.conf w] + #BCL: Added .ff.tcl sourcing in run.conf in order to pull in codegen variables + puts $op "# Set up codegen variables (possibly) needed to resolve some conf variables" + #puts $op "if {\[file exists .ff.tcl\]} {" + #puts $op " source .ff.tcl" + #puts $op "}" + #BCL: Only enclose in curlies if subst is not part of the netlist name + foreach var [array names rda_Input] { + # BCL: only use curlies if the variable doesn't contain subst (otherwise subst will not be performed) + if {[regexp {subst} $rda_Input($var)]} { + puts $op "set rda_Input($var) \"$rda_Input($var)\"" + } else { + puts $op "set rda_Input($var) \{$rda_Input($var)\}" + } + } +# if {$vars(flat) != "full"} { +# puts $op "set rda_Input(ui_view_definition_file) \"$vars(script_dir)/view_definition.tcl\"" +# } + } + } + + proc get_required_procs {file} { + # + # Given a list of required procedures, return the lines that represent + # those procedures from the utils.tcl file + # + + global vars + global errors + + # + # Read the file and gather all of the contents + # + + set all_lines "" + set length 0 + set ip [open $file] + while {[gets $ip line]>=0} { + set utils_lines($length) $line + incr length + } + close $ip + + # + # Iterate across each line and pull out relevant procedures + # + + set lines "" + set i 0 + while {$i < $length} { + set line [regsub "puts" $utils_lines($i) "puts"] + foreach proc $vars(required_procs) { + if {[regexp "proc $proc" $line] > 0} { + append lines " $line\n" + incr i + while {$i < $length} { + set line $utils_lines($i) + if {[regexp "proc " $line] > 0} { + incr i -1 + break + } + if {![regexp "^#" [string trimleft $line] ] && ($i != [expr $length-1])} { + append lines "$line\n" + } + incr i + } + break + } + } + incr i + } + + set lines [string trimright $lines] + return "$lines\n" + } + + proc normalize_files {} { + + global vars + global errors + + if {[info exists vars(normalize_files)] && !$vars(normalize_files)} { + return + } + + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file [file normalize $vars(view_definition_tcl)] + } else { + set mmmc_file [file normalize $vars(script_dir)/view_definition.tcl] + } + set vars(mmmc_file) $mmmc_file + + foreach file_var [list cpf_file def_files netlist cts_spec lef_files \ + gds_files activity_file ilm_non_sdc_file ] { + if {[info exists vars($file_var)]} { + set temp [list] + foreach file $vars($file_var) { + lappend temp [file normalize $file] + } + set vars($file_var) $temp + } + } + } + + proc normalize_constraints {} { + + global vars + + set cwd [pwd] + cd $vars(cwd) + + foreach mode $vars(constraint_modes) { + foreach var "pre_cts_sdc incr_cts_sdc post_cts_sdc pre_cts_ilm_sdc" { + if {[info exists vars($mode,$var)]} { + set temp [list] + foreach file $vars($mode,$var) { + lappend temp [file normalize $file] + } + set vars($mode,$var) $temp + } + } + } + cd $cwd + } + + proc denormalize_files {} { + + global vars + global tvars + + foreach var [array names vars] { + if {($var != "setup_path") && ($var != "script_dir") && ($var != "script_path") && ($var == "execute_string")} { + set tvars($var) $vars($var) + } + } + +# set op [open .setup.ff.tcl w] + catch {unset path_array} + set path_list [list] + set path_vars [list] + foreach var [array names tvars] { + if [file isdirectory $tvars($var)] { + set path_array($tvars($var)) $var + lappend path_vars $var + lappend path_list $tvars($var) + } + } + + set sorted_path_list [lsort -decreasing $path_list] +# puts "-> Found [llength $sorted_path_list]" + foreach path $sorted_path_list { +# puts "$path -> $path_array($path) ([string length $path])" +# puts $op "set vars($path_array($path)) $path" + } + + foreach var [array names tvars] { + set found 0 + foreach path $sorted_path_list { + if {($var == $path_array($path)) || ([string first "\[" $var] != -1)} { + break + } + # puts $op "[format "regsub -all \"%s\" \"%s\" \\$%s" $path [join $tvars($var)] $path_array($path) temp]" + if {[catch {set command [format "regsub -all \"%s\" \"%s\" \\\$vars(%s) temp" $path [join $tvars($var)] $path_array($path)]}]} { + break + } + set foo [eval $command] + if {$foo > 0} { +# puts $op "set vars($var) \"[join $temp]\"" + if {[llength $temp] > 1} { + set vars($var) [join $temp] + } else { + set vars($var) $temp + } + set found 1 + } + } +# if {!$found} { +# puts $op "set vars($var) \"[join $vars($var)]\"" +# } + } +# foreach path $sorted_path_list { +# set vars($path_array($path)) $path +# } +# close $op +# source .setup.ff.tcl + } + + + proc gen_check {} { + + global vars + global errors + + set op [open $vars(script_dir)/check_qor.tcl w] + + puts $op "#![lindex $vars(execute_string) 0]" + + puts $op "if {!\[llength \$argv\]} {" + puts $op " puts \" ERROR: MISSING QOR RESULT FILE NAME\"" + puts $op " exit -1" + puts $op "}" + + puts $op "foreach name \$argv {" + puts $op " if {!\[file exists \$name\]} {" + puts $op " puts \" ERROR: QOR RESULT FILE MISSING (\$name)\"" + puts $op " exit -1" + puts $op " }" + + puts $op " file stat \$name qor_stat" + puts $op " if {!\$qor_stat(size)} {" + puts $op " continue" + puts $op " }" + puts $op " set qor_file \[open \$name r\]" + puts $op " gets \$qor_file qor_result" + puts $op " if {\[expr \$qor_result\]} {" + puts $op " exit -1" + puts $op " }" + puts $op "}" + + puts $op "exit 0" + + close $op + + exec chmod +x $vars(script_dir)/check_qor.tcl + } + + proc source_config_files {} { + + global vars + global env + global user_vars + global desc + global errors + + puts " LOADING CONFIGURATION FILES:" + set vars(config_files) [list] + foreach file "setup.tcl innovus_config.tcl lp_config.tcl genus_config.tcl" { + set temp [regsub "\\." $file "_"] + set vars($temp) [list] + if {[file exists $vars(setup_path)/$file]} { + FF::source_file $vars(setup_path)/$file + lappend vars($temp) $vars(setup_path)/$file + lappend vars(config_files) $vars(setup_path)/$file + } + if {($vars(setup_path) != ".") && [file exists $file]} { + FF::source_file $file + lappend vars($temp) $file + lappend vars(config_files) $file + } + if {$vars($temp) != ""} { + puts " $temp -> $vars($temp)" + } + } + + foreach var [array names vars] { + set user_vars($var) $vars($var) +# puts $var + } + + if {[FF::is_lp_flow]} { + set vars(required_procs) \ + "source_file system_info get_clock_ports get_power_domains modify_power_domains add_power_switches \ + route_secondary_pg_nets insert_welltaps_endcaps report_time buffer_always_on_nets \ + save_results load_applet get_tool load_path_groups" + } else { + set vars(required_procs) \ + "source_file system_info get_clock_ports report_time insert_welltaps_endcaps \ + save_results load_applet get_tool load_path_groups " + } + } + + proc execute_flow {step {format 1} {abort ""}} { + + # + # This is the entry point, responsible for calling functions and + # aggregating results for each step in the flow + # + global vars + global dargs + global fargs + global svars + global env + global errors + + if {![info exists vars(sourced)]} { set vars(sourced) 0 } +# if {![info exists vars(single)]} { set vars(single) 0 } + if {![info exists vars(catch_errors)]} { set vars(catch_errors) 0 } + if {![info exists vars(stop_step)]} { set vars(stop_step) "signoff" } + if {![info exists vars(initialized)]} { set vars(initialized) 0 } + if {![info exists vars(loaded)]} { set vars(loaded) 0 } + if {![info exists vars(bsteps)]} { set vars(bsteps) [list] } + if {![info exists env(VPATH)]} { set env(VPATH) make } + + # + # If no steps are defined, set the steps to execute based upon the + # mode that the system is running in. We need to do this because the + # hierarchical flow will unset the vars() array before recursively + # calling this routine. + # + + if {![info exists vars(steps)]} { + # BCL: Moved the following if / else up (it must always execute) + if {![info exists vars(mode)]} { + if {[info exists fargs(mode)]} { + set vars(mode) $fargs(mode) + } else { + set vars(mode) $dargs(mode) + } + } +# if {[info exists vars(hier)] && !$vars(hier)} { +# FF::set_steps $vars(mode) $format +# unset vars(mode) +# } else { +# FF::set_steps $vars(mode) $format +# } + } + + # + # Set the procedures that we will need to include within each file that + # we create to run a step. + # + +# set vars(required_procs) \ +# "source_plug get_clock_ports get_power_domains report_time" + + # + # Make sure that the variables are actually sourced from the + # configuration files + # + + if {!$vars(sourced) && ($step != "source")} { + execute_flow "source" $format $abort + } + + if {$vars(sourced)} { + if {[info exists vars(hier)] && !$vars(hier)} { + FF::set_steps $vars(mode) $format + unset vars(mode) + } else { + FF::set_steps $vars(mode) $format + } + } + # + # Execute the appropriate step per the command + # + + set action "" + switch -- $step { + "source" { + if {!$vars(sourced)} { + FF_NOVUS::source_config_files + if {[info exists fargs(version)]} { + if {![regexp "^10" $fargs(version)] && ![regexp "^9" $fargs(version)]} { + FF_NOVUS::denormalize_files + } + } elseif {[info exists dargs(version)]} { + if {![regexp "^10" $dargs(version)] && ![regexp "^9" $dargs(version)]} { + FF_NOVUS::denormalize_files + } + } + foreach arg [join $vars(arg_list)] { + if {[info exists vars($arg)]} { + if {[info exists fargs($arg)]} { + if {$vars($arg) != $fargs($arg)} { + puts " WARNING: Overwriting vars($arg) from $vars($arg) to $fargs($arg) ..." + } + set vars($arg) $fargs($arg) + } else { + # Only set the farg if it wasn't set in a config file + if {![info exists vars($arg)]} { + set vars($arg) $dargs($arg) + } + } + } else { + if {[info exists fargs($arg)]} { + set vars($arg) $fargs($arg) + } else { + set vars($arg) $dargs($arg) + } + } + } + FF_NOVUS::seed_variables +# FF_NOVUS::check_setup +# FF_NOVUS::normalize_files + set vars(sourced) true + set vars(top_cell) $vars(design) + } + } + "source_only" { + # BCL: Added this in since i want to source the variables w/out calling check_setup + if {!$vars(sourced)} { + FF_NOVUS::source_config_files + if {[info exists fargs(version)]} { + if {![regexp "^10" $fargs(version)] && ![regexp "^9" $fargs(version)]} { + FF_NOVUS::denormalize_files + } + } elseif {[info exists dargs(version)]} { + if {![regexp "^10" $dargs(version)] && ![regexp "^9" $dargs(version)]} { + FF_NOVUS::denormalize_files + } + } + foreach arg [join $vars(arg_list)] { + if {[info exists vars($arg)]} { + if {[info exists fargs($arg)]} { + if {$vars($arg) != $fargs($arg)} { + puts " WARNING: Overwriting vars($arg) from $vars($arg) to $fargs($arg) ..." + } + set vars($arg) $fargs($arg) + } else { + # Only set the farg if it wasn't set in a config file + if {![info exists vars($arg)]} { + set vars($arg) $dargs($arg) + } + } + } else { + if {[info exists fargs($arg)]} { + set vars($arg) $fargs($arg) + } else { + set vars($arg) $dargs($arg) + } + } + } + FF_NOVUS::seed_variables +# FF_NOVUS::check_setup +# FF_NOVUS::normalize_files +# set vars(sourced) true + set vars(top_cell) $vars(design) + } + } + "check" { + if {$abort == ""} { + set abort $vars(abort) + } + set save $vars(abort) + set vars(abort) $abort + set vars(abort) $save + if {![info exists vars(mode)]} { + if {[info exists fargs(mode)]} { + set vars(mode) $fargs(mode) + } else { + set vars(mode) $dargs(mode) + } + } + if {$vars(mode) == "hier"} { + if {![info exists vars(partition_list)]} { + puts " FLOW MODE $vars(mode) SELECTED BUT \$vars(partition_list) NOT DEFINED" + exit 99 + } + if {[file tail [file dirname [pwd]]] != "$vars(partition_dir)"} { + FF_NOVUS::check_setup + } + } else { + FF_NOVUS::check_setup + } + + FF::process_file_lists + } + + "all" { + + # + # We have already sourced in all of the files. Now execute the + # rest of the steps, including check + # + + puts "-------------------------------------------------" + puts " Generating scripts for $vars(design)" + puts "-------------------------------------------------" + execute_flow check $format $abort + + set vars(steps) [join $vars(steps)] + set vars(all) true + set commands "" + + if {$vars(mode) == "hier"} { + if {[file tail [file dirname [pwd]]] == "$vars(partition_dir)"} { + set all_steps $vars(fsteps) + } else { + set all_steps $vars(hsteps) + } + } else { + if {!$vars(generate_flow_steps)} { + file mkdir $vars(script_dir)/INNOVUS + set fhr [open $vars(script_path)/INNOVUS/run_all.tcl r] + set fhw [open $vars(script_dir)/INNOVUS/run_all.tcl w] + while {[gets $fhr line]>=0} { + regsub "source FF" $line "source $vars(script_dir)" line + puts $fhw " $line" + } + close $fhr + close $fhw + } + set all_steps $vars(steps) + } + # + # Execute each step of the flow and get a composite list of the + # actual steps that had actions generated for them. Then create + # a Makefile for those steps + # + if {[info exists vars(rc_steps)]} { + set actions $vars(rc_steps) + } else { + set actions [list] + } + # + foreach step $all_steps { + set commands [execute_flow $step $format $abort] + if {$commands != ""} { + lappend actions $commands + } + } + #set vars(make_tool_args) "-nowin -64" + + if {($vars(user_mode) == "hier") && ($vars(hier_flow_type) == "2pass")} { + # Only generate steps up to (and including) cts for 2pass flows + # Go ahead and generate both Makefiles as the actions are known + if {$vars(enable_flexilm)} { + if {$vars(place_opt_design)} { + if {[file tail [pwd]] == $vars(top_cell)} { + set index [lsearch $actions "prects"] + } else { + set index [lsearch $actions "place"] + } + } else { + set index [lsearch $actions "prects"] + } + FF::gen_makefile [lrange $actions [expr $index+1] end] $vars(mode) + file copy -force Makefile Makefile.pass2 + FF::gen_makefile [lrange $actions 0 $index] $vars(mode) + } else { + set index [lsearch $actions "cts"] + FF::gen_makefile [lrange $actions [expr $index+1] end] $vars(mode) + file copy -force Makefile Makefile.pass2 + FF::gen_makefile [lrange $actions 0 $index] $vars(mode) + } + } else { + FF::gen_makefile $actions $vars(mode) + } + if {$vars(enable_qor_check)} { + FF_NOVUS::gen_check + } + execute_flow debug $format $abort + if {[info exists vars(run_lec)] && $vars(run_lec)} { + execute_flow lec $format $abort + } + } + "lec" { +# puts "-------------------------------------------------" +# puts " Generating scripts for $vars(design)" + puts "-------------------------------------------------" + if {![info exists vars(netlist)]} { + puts " Cannot generate 'lec' step w/o verilog netlist defined" + } else { + if {!$vars(generate_flow_steps)} { + file mkdir $vars(script_dir)/INNOVUS + set op [open $vars(script_dir)/INNOVUS/run_lec.tcl w] + puts $op "//" + puts $op "// Innovus Foundation Flow Code Generator, [exec date]" + puts $op "//" + if {$step == "lec"} { + puts $op "tclmode" + } + #puts $op "if {\[file exists .ff.tcl\]} {" + #puts $op " source .ff.tcl" + #puts $op "}" + set varsFile [FF::relPathTo [file normalize $vars(script_dir)/vars.tcl] [file normalize $vars(rundir)]] + puts $op "if {\[file exists $varsFile\]} {" + puts $op " source $varsFile" + puts $op "}" + puts $op "source $vars(script_dir)/procs.tcl" + puts " Generating step $step" + set commands [FF_NOVUS::run_lec] + puts $op [FF::pretty_print $commands $format] + close $op + } + } +# FF::gen_makefile lec $vars(mode) + } + "default" { + + # + # Run each step either singuarly or recursively + # + # + # Create the list of commands that happen at the begining of + # each script + # + + if {([lsearch $vars(steps) $step] == -1) && ($step != "debug")} { + puts " ERROR: Unknown Foundation Flow step \"$step\"." + exit 99 + } + +# if {([lsearch $vars(steps) $step] == -1) && ($step != "debug")} { +# puts " ERROR: Unknown Foundation Flow step \"$step\"." +# exit 99 +# } else { +# if {($vars(fix_hold) || (!$vars(fix_hold) && ![regexp "_hold" $step])) && +# !($vars(skip_cts) && (($step == "cts") || [regexp "postcts" $step]))} { +# puts " Generating step $step" +# } +# } + + # + # We need to ensure that we check the variable contents and + # initialize the flow at least once in a given run, no matter + # what step the user wants to execute + # + +# set header "\n#\n# Commands for $step\n#\n\n" + + if {![info exists vars(all)]} { + execute_flow check $format $abort + } + # BCL: Changed to tcl file mkdir + file mkdir $vars(script_dir)/INNOVUS + set commands "" +# set commands "post-10.10-b009\n" + if {!$vars(initialized)} { + set vars(step) $step + append commands [FF_NOVUS::initialize_flow] +# unset vars(step) + set vars(init_commands) $commands + set vars(initialized) 1 + if {![info exists vars(warning_count)]} { + set vars(warning_count) 0 + } + if {![info exists vars(error_count)]} { + set vars(error_count) 0 + } + } + + # + # Get the commands to execute the step. We also need to get the + # commands to load the database for that step, assuming that a + # database exists from a prior step. Those load commands are + # prepended to the execution commands. Save commands are + # appended + # + + if {[info commands ::FF_NOVUS::run_$step] ne ""} { + set temp_commands [FF_NOVUS::run_$step $format] + if {$temp_commands == ""} { + return "" + } else { + if {$vars(step) != "init"} { + set step_commands "\n#-------------------------------------------------------------\n" + if {$vars(report_run_time)} { + append step_commands "set vars(step) ${step}\n" + append step_commands "set vars(${step},start_time) \[clock seconds\]\n" + } + if {$vars(capture_metrics)} { + if {[lindex [split $vars(version) "."] 0] > 13} { + append step_commands "push_snapshot_stack\n" + } + } + append step_commands "#-------------------------------------------------------------\n\n" + } + append step_commands $temp_commands + append step_commands "#-------------------------------------------------------------\n\n" + puts " Generating step $step" + } + } elseif {[info exists vars(custom_step_dir)]} { + if {[file isfile $vars(custom_step_dir)/run_${step}.tcl]} { + puts " Generating step $step" + set fhr [open $vars(custom_step_dir)/run_$step.tcl r] + set step_commands "\n#-------------------------------------------------------------\n" + append step_commands "# Sourcing custom script ...\n" + append step_commands "#-------------------------------------------------------------\n" + if {$vars(report_run_time) && ($step != "init")} { + append step_commands "set vars(step) ${step}\n" + append step_commands "set vars(${step},start_time) \[clock seconds\]\n" + } + if {$vars(capture_metrics) && ($vars(step) != "init")} { + if {[lindex [split $vars(version) "."] 0] > 13} { + append step_commands "push_snapshot_stack\n" + } + } + append step_commands "#-------------------------------------------------------------\n\n" + while {[gets $fhr line]>=0} { + append step_commands "$line\n" + } +# append step_commands "source $vars(custom_step_dir)/run_$step.tcl\n" + append step_commands "#-------------------------------------------------------------\n\n" + } else { + puts " ERROR: Unable to generate step $step" + set errors($vars(error_count)) "Unable to generate step $step - procedure 'run_$step' must be defined or a \$vars(custom_step_dir)/run_$step.tcl file must be provided" + incr vars(error_count) + return "" + } + } else { + puts " ERROR: Unable to generate step $step" + set errors($vars(error_count)) "Unable to generate step $step - procedure 'run_$step' must be defined or a \$vars(custom_step_dir)/run_$step.tcl file must be provided" + incr vars(error_count) + return "" + } + set this_index [lsearch $vars(steps) $step] + set prior [lindex $vars(steps) [expr $this_index - 1]] +# if {!$vars(fix_hold) && [regexp _hold $prior]} { +# set prior [lindex $vars(steps) [expr $this_index - 2]] +# if {[regexp _hold $prior]} { +# set prior [lindex $vars(steps) [expr $this_index - 3]] +# } +# } + if {[regexp _hold $prior] && ([lsearch $vars(fix_hold) [regsub _hold $prior ""]]<0)} { + set prior [lindex $vars(steps) [expr $this_index - 2]] + if {[regexp _hold $prior] && ([lsearch $vars(fix_hold) [regsub _hold $prior ""]]<0)} { + set prior [lindex $vars(steps) [expr $this_index - 3]] + } + } + + if {($step == "cts") && $vars(place_opt_design)} { + set prior "place" + } + if {($step == "route") && $vars(skip_cts)} { + set prior "prects" + } +# if {($step == "route") && [regexp "^ccopt" [string tolower $vars(cts_engine)]]} { +# set prior "cts" +# } + if {[regexp "^ccopt" [string tolower $vars(cts_engine)]]} { + if {([string tolower $vars(fix_hold)] != "false")} { + if {($step == "postcts_hold") && [lsearch $vars(fix_hold) $step]} { + set prior cts + } else { + if {($step == "route")} { + set prior cts + } + } + } else { + if {($step == "route")} { + set prior cts + } + } + } + + set this_index [lsearch [FF::adjust_steps] $step] + set prior [lindex [FF::adjust_steps] [expr $this_index - 1]] + + set no_db_steps [list "init" "rebudget" "flexilm" "assemble" "assemble_flexilm" "debug"] + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + lappend no_db_steps "model_gen" + } else { + lappend no_db_steps "feedthrough" + } + if {([lsearch $no_db_steps $step] == -1) && ($prior != "")} { + set load_commands [FF_NOVUS::load_design $prior $step] +# set restore_commands [lindex [FF_NOVUS::load_design $format $prior] 1] + } else { + set load_commands "" +# set restore_commands "" + } + + if {!$vars(loaded)} { + set vars(loaded) 1 + append commands $load_commands + } + + # model_gen saves its database explicitly +# set no_save_steps [list "debug" "model_gen"] + set no_save_steps [list "debug"] + if {[lsearch $no_save_steps $step] == -1} { + set save_commands [FF_NOVUS::save_results $step $format] + } else { + set save_commands "" + } + + # + # Write the commands to a file, named for the step we are + # executing + # + +# if {!$vars(generate_flow_steps)} { + if {[regexp "^syn" $step]} { + file mkdir $vars(script_dir)/GENUS + set op [open $vars(script_dir)/GENUS/run_${step}.tcl w] + } else { + set op [open $vars(script_dir)/INNOVUS/run_${step}.tcl w] + } + + # if {$vars(debug)} { + # puts " Opening file: $vars(script_dir)/INNOVUS/run_${step}.tcl in [exec pwd] -> $op" + # } + + puts $op [string repeat "#" 68] + puts $op "# Innovus Foundation Flow Code Generator, [exec date]" + puts $op "# Version : 17.10-p003_1" + puts $op [string repeat "#" 68] + + if {[file tail [file dirname [pwd]]] != "$vars(partition_dir)"} { + set varsFile [FF::relPathTo [file normalize $vars(script_dir)/vars.tcl] [file normalize $vars(rundir)]] + } else { + set varsFile $vars(script_dir)/vars.tcl + } + puts $op "\nif {\[file exists $varsFile\]} {" + puts $op " source $varsFile" + puts $op "}" + #puts $op "if {\[file exists \$vars(script_dir)/vars.tcl\]} {" + #puts $op " source \$vars(script_dir)/vars.tcl" + #puts $op "}\n" + if {!$vars(freeze_vars)} { + if {([file tail [file dirname [pwd]]] != "$vars(partition_dir)") && ![regexp syn_ $step]} { + puts $op "foreach file \$vars(config_files) {" + puts $op " source \$file" + puts $op "}\n" + } + } + puts $op "source \$vars(script_dir)/procs.tcl" + puts $op "source $vars(script_dir)/procs.tcl" + if {!$format} { + puts $op $header + } + regsub -all "init," $vars(init_commands) "$step," commands + set of [open $vars(script_dir)/INNOVUS/.head w] + puts $of [FF::pretty_print $vars(init_commands) $format] + close $of + append commands $load_commands $step_commands $save_commands + # set commands "" + # if {($step != "partition") && ($step != "rebudget") && ($step != "flexilm")} { + # if {![regexp _hold $step]} { + # append commands $load_commands $step_commands $save_commands + # } else { + ## if {!([lsearch $vars(fix_hold) [regsub _hold $step ""]]<0)} { + ## append commands $step_commands + ## } else { + # append commands $load_commands $step_commands $save_commands + ## } + # } + ## if {$step == "debug"} { + ## set vars(step) debug + ## } + # } else { + # append commands $load_commands $step_commands + # } + lappend vars(bsteps) $step + set of [open $vars(script_dir)/INNOVUS/.load_$step w] + # puts $of [FF::pretty_print $restore_commands $format] + puts $of [FF::pretty_print $load_commands $format] + close $of + set of [open $vars(script_dir)/INNOVUS/.$step w] + puts $of [FF::pretty_print $step_commands $format] + puts $of [FF::pretty_print $save_commands $format] + close $of + # if {[regexp "postroute_si" $step] && $skip_commands != ""} { + # set commands $skip_commands + # } + if {!$format} { + set commands [FF::strip_lines $commands [list "puts" "#"]] + } + if {$vars(catch_errors) && ($step != "debug")} { + puts $op "\nif { \[catch {\n" + puts $op [FF::pretty_print $commands $format] + puts $op "} step_error\]} {\n" + puts $op " puts \" =========== STEP EXECUTION ERROR ============\"" + puts $op " puts \" ERROR RUNNING STEP '$step'\"" + if {$vars(save_on_catch)} { + if {[regexp "^syn" $vars(step)]} { + puts $op " write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/$vars(step).catch.db\n" + } else { + puts $op " puts \" ---------------------------------------------\"" + puts $op " puts \" ... SAVING DESIGN TO $vars(dbs_dir)/$vars(step).catch.enc\"" + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + puts $op " write_db -oa_lib_cell_view {$vars(oa_design_lib) $vars(design) $vars(step).catch}\n" + } else { + puts $op " saveOaDesign $vars(oa_design_lib) $vars(design) $vars(step).catch\n" + } + } else { + puts $op " write_db $vars(dbs_dir)/$vars(step).catch.enc\n" + } + } + } + puts $op " puts \" ---------------------------------------------\"" + puts $op " puts \" \$step_error\"" + puts $op " puts \" ------------------- DETAILS ------------------\"" + puts $op " puts \" \$errorInfo\"" + puts $op " puts \" ==============================================\"" + if {$vars(batch)} { + puts $op " exit -1" + } + puts $op "}" + } else { + puts $op [FF::pretty_print $commands $format] + } + if {$vars(batch) && ($step != "debug")} { + puts $op "if {!\[info exists vars(single)\]} {\n exit 0\n}\n" + } + close $op +# } + + set scommands [split $commands "\n"] + + if {$vars(generate_flow_steps)} { + append vars(flow_steps) "\ncreate_flow_step -name $step \{\n" + if {[info exists vars(hsteps)] && ([lsearch $vars(hsteps) $step] != -1)} { + append vars(flow_steps,hier) "\ncreate_flow_step -name $step \{\n" + } else { + append vars(flow_steps,flat) "\ncreate_flow_step -name $step \{\n" + } + set skip 0 + foreach line $scommands { + if {$skip != 0} { + set skip [expr $skip-1] + continue + } + if {[regexp ff_procs $line]} { continue } +# if {[regexp "#" $line]} { continue } + if {[regexp "ERROR LOADING DATABASE" $line]} { continue } + if {[regexp "Plugin ->" $line]} { continue } +# if {[regexp "Puts" $line]} { regsub Puts $line puts line } +# if {[regexp "Puts \"" $line]} { continue } + if {[regexp "VPATH" $line]} { continue } + if {[regexp "set vars" $line] && ![regexp ",post_cts_sdc" $line] && ![regexp "active_rc_corners" $line]} { continue } + if {($step == "init") && $vars(rc)} { +# if {[regexp "read_mmmc" $line]} { continue } +# if {[regexp "read_netlist" $line]} { continue } +# if {[regexp "read_physical" $line]} { continue } +# if {[regexp "init_design" $line]} { continue } + if {[regexp "read_mmmc" $line]} { regsub read_mmmc $line "#read_mmmc" line } + if {[regexp "read_netlist" $line]} { regsub read_netlist $line "#read_netlist" line } + if {[regexp "read_physical" $line]} { regsub read_physical $line "#read_physical" line } + if {[regexp "init_design" $line]} { regsub init_design $line "#init_design" line } + } + if {$step != "init"} { + if {[regexp "restore_design" $line]} { set skip 7; continue } + if {!(($step == "cts") && $vars(enable_flexilm))} { + if {[regexp "read_db" $line]} { continue } + } else { + if {[regexp "read_db" $line]} { +# set line [string trim [lindex $line 2]] + set line "read_db \[file tail \[pwd\]\]_post_eco.enc\n" + } + } + } + if {[regexp "write_db " $line]} { continue } + if {[regexp "metric" $line]} { continue } + if {[regexp "snapshot" $line]} { continue } + if {[regexp "report_metric" $line]} { continue } + if {$line == ""} { continue } +#if {$step == "init"} { puts $line } + append vars(flow_steps) "\t$line\n" + if {[info exists vars(hsteps)] && ([lsearch $vars(hsteps) $step] != -1)} { + append vars(flow_steps,hier) "\t$line\n" + } else { + append vars(flow_steps,flat) "\t$line\n" + } + } + append vars(flow_steps) "\}\n" + if {[info exists vars(hsteps)] && ([lsearch $vars(hsteps) $step] != -1)} { + if {$step == "partition"} { + foreach p $vars(partition_list) { + append vars(flow_steps,hier) "\n\tschedule_flow -flow block -directory $vars(partition_dir)/$p\n" + } + } + if {$step == "assemble_flexilm"} { + foreach p $vars(partition_list) { + append vars(flow_steps,hier) "\n\tschedule_flow -flow block -directory $vars(partition_dir)_PRECTS/$p\n" + } + } + if {($step == "assemble") || ($step == "partition")} { + append vars(flow_steps,hier) "\n\} \n" + } else { + append vars(flow_steps,hier) "\n\}\n" + } + } else { + if {([file tail [file dirname [pwd]]] == "$vars(partition_dir)")} { + if {$step == "signoff"} { + if {[lsearch $vars(partition_list) $vars(design)] == -1} { + append vars(flow_steps,flat) "\n\tschedule_flow -flow final_assembly -directory ../.. -no_db\n" + } else { + if {$vars(enable_flexilm)} { +# append vars(flow_steps,flat) "\n\tschedule_flow -flow top -directory $vars(partition_dir)_PRECTS/$vars(top_cell)\n" + append vars(flow_steps,flat) "\n\tschedule_flow -flow top -directory ../$vars(top_cell) -no_db -sync\n" + } else { +# append vars(flow_steps,flat) "\n\tschedule_flow -flow top -directory $vars(partition_dir)/$vars(top_cell)\n" + append vars(flow_steps,flat) "\n\tschedule_flow -flow top -directory ../$vars(top_cell) -no_db -sync\n" + } + } + } + if {$step == "prects" && $vars(enable_flexilm)} { + if {[lsearch $vars(partition_list) $vars(design)] == -1} { + append vars(flow_steps,flat) "\n\tschedule_flow -flow intermediate_assembly\n" + } else { + append vars(flow_steps,flat) "\n\tschedule_flow -flow top -directory $vars(partition_dir)/$vars(top_cell)\n" + } + } + } else { + if {[regexp syn_ $step]} { + if {$vars(rc)} { + if {$vars(enable_rcp) && ($step == "syn_place")} { + append vars(flow_steps,flat) "\n\tschedule_flow -flow innovus -db \"$vars(dbs_dir)/syn_place/syn_place.enc_setup.tcl\"\n" + } elseif {!$vars(enable_rcp) && ($vars(step) == "syn_incr")} { + append vars(flow_steps,flat) "\n\tschedule_flow -flow innovus -db \"$vars(dbs_dir)/syn_incr/syn_incr.enc_setup.tcl\"\n" + } + } +# append vars(flow_steps,flat) "\}\n" + } else { +# append vars(flow_steps,flat) "\}\n" + } + } + append vars(flow_steps,flat) "\}\n" + } + } + set action $step + } + } + + # + # Create a file that sets up all of the variable settings that were + # used in this invocation + # + + return $action + } + + proc insert_comments {} { + + global vars + + set comments "" + append comments "######################################################################\n" + append comments "# Variables affecting this step:\n" + append comments "#---------------------------------------------------------------------\n" + if {[info exists vars(comments)]} { + append comments $vars(comments) + unset vars(comments) + } else { + append comments "# No variables defined for this step ...\n" + } + append comments "######################################################################\n" + if {[info exists vars(ucomments)]} { + append comments "# Additional variables for this step:\n" + append comments "#---------------------------------------------------------------------\n" + append comments $vars(ucomments) + append comments "######################################################################\n" + unset vars(ucomments) + } + return $comments + } + + proc run_all {} { + + global vars + + set time 0 + set index 0 + set stop_step signoff + set vars(codegen) false + if {![info exists vars(vpath)]} { set vars(vpath) make } + + foreach step $vars(steps) { + if {[file exists $vars(vpath)/$step]} { + if {[file mtime $vars(vpath)/$step] > $time} { + if {[lindex $vars(steps) $index] == "signoff"} { + puts " STEP signoff COMPLETE ... NOTHING TO DO" + } else { + set start_step [lindex $vars(steps) [expr $index + 1]] + } + } + } else { + set start_step $step + break + } + incr index + } + + puts " -----------------------------------------------------" + if {$start_step == $stop_step} { + puts " RUNNING STEP $start_step ..." + } else { + puts " RUNNING STEP $start_step through $stop_step ..." + } + puts " -----------------------------------------------------" + sleep 5 + + # + # Emulate the functionality of the "make" program. If a file doesn't exist, + # or if it's predecessor step has executed more recently, run the current + # step and update the time/date stamps of the files we track progress with + # + + set vars(stop_step) $stop_step + + set last_step "" + set vars(restore_design) 1 + if {$vars(enable_qor_check)} { + set check_qor $vars(script_dir)/check_qor.tcl + } + exec mkdir -p make + foreach step $vars(steps) { + set vars(step) $step + puts " STEP $vars(step) ..." + set this_semaphore "$vars(vpath)/$step" + set last_semaphore "$vars(vpath)/$last_step" + + set run_step false + if {![file exists $this_semaphore]} { + set run_step true + } elseif {$last_step != ""} { + file stat $this_semaphore this_stat + file stat $last_semaphore last_stat + if {$this_stat(mtime) < $last_stat(mtime)} { + set run_step true + } + } + + # + # Check the quality of results from the last step. If the results aren't + # as expected, don't proceed to the next step + # + if {$vars(enable_qor_check)} { + if {$step != "init"} { + set qor [catch {exec $check_qor $last_semaphore} msg] + if {$qor} { + puts " ERROR: QOR RESULT CHECK INDICATES A PROBLEM IN STEP $last_step" + exit -111 + } + } + } + + set last_step $step + if {!$run_step} { + continue + } + + # + # Source the control file that runs the step. If it had an error, exit + # immediately. Otherwise, update the time/date stamp of the corresponding + # + # + + if {[catch {FF_NOVUS::run_$step} message]} { + puts $message + exit -111 + } + set vars(restore_design) 0 + + # + # If there is a QOR check file for this step, execute it and place the + # result into the make file. Otherwise just touch the file + # + + if {$vars(enable_qor_check)} { + if {[info exists vars($step,qor_tcl]} { + set qor_file $vars($step,qor_tcl) + if {[file exists $qor_file]} { + set qor [catch {exec $qor_file} msg] + set make_file [open $this_semaphore w] + puts $make_file "$qor" + close $make_file + } + } + } + exec /bin/touch $this_semaphore + + if {$step == $stop_step} { + puts " Done" + } + } + } + + proc load_power_intent {} { + + global vars + + set commands "" + + if {[info exists vars(cpf_file)]} { + if {[file extension $vars(cpf_file)] == ".cpfdb"} { + set command "read_power_intent -msvDB $vars(cpf_file)\n" + } else { + set command "read_power_intent -cpf $vars(cpf_file)\n" + } + append commands [FF::wrap_command $vars(step),read_power_intent $command] + set command "commit_power_intent" + if {$vars(cpf_power_domain)} { + append command " -power_domain" + } + if {[info exists vars(cpf_keep_rows)] && $vars(cpf_keep_rows)} { + if {$vars(novus)} { + append command " -keep_rows" + } else { + append command " -keepRows" + } + } + if {$vars(cpf_isolation)} { + append command " -isolation" + } + if {$vars(cpf_state_retention)} { + append command " -state_retention" + } + if {$vars(cpf_level_shifter)} { + append command " -level_shifter" + } + if {$vars(cpf_power_switch)} { + append command " -power_switch" + } + append command "\n" + append commands [FF::wrap_command $vars(step),commit_power_intent $command] + } elseif {[info exists vars(ieee1801_file)]} { + set command "read_power_intent $vars(ieee1801_file) -1801\n" + append commands [FF::wrap_command $vars(step),read_power_intent $command] + set command "commit_power_intent" + if {$vars(ieee1801_power_domain)} { + append command " -power_domain" + } + if {[info exists vars(ieee1801_keep_rows)] && $vars(ieee1801_keep_rows)} { + append command " -keepRows" + } + append command "\n" + append commands [FF::wrap_command $vars(step),commit_power_intent $command] + } + return $commands + } + + proc dump_novus_attributes {} { + + global vars + + set map(activity_file_format) "# read_activity_file -format" + set map(assign_buffer) defunct + set map(budget_mode) "set_db budget_virtual_opt_engine" + set map(capture_metrics) "# enable_metrics -on" + set map(ccopt_effort) defunct + set map(ccopt_integration) defunct + set map(cdb_file) defunct + set map(clk_leaf_bottom_layer) "# create_route_type -name leaf -bottom_preferred_layer -top_preferred_layer -shield_net -non_default_rule " + set map(clk_leaf_top_layer) "# create_route_type -name leaf -bottom_preferred_layer -top_preferred_layer -shield_net -non_default_rule " + set map(clk_max_skew) "set_db cts_target_skew" + set map(clk_max_slew) "set_db cts_target_max_transition_time" + set map(clk_tree_shield_net) "# create_route_type -name leaf -bottom_preferred_layer -top_preferred_layer -shield_net -non_default_rule " + set map(clk_tree_shield_thresh) "set_db cts_routing_top_min_fanout" + set map(clk_tree_bottom_layer) "# create_route_type -name top -bottom_preferred_layer -top_preferred_layer -shield_net -non_default_rule " + set map(clk_tree_top_layer) "# create_route_type -name top -bottom_preferred_layer -top_preferred_layer -shield_net -non_default_rule " + set map(clock_gate_aware) "set_db place_global_clock_gate_aware" + set map(congestion_effort) "set_db place_global_cong_effort" + set map(cpf_file) "# read_power_intent -cpf " + set map(cpf_isolation) defunct + set map(cpf_keep_rows) defunct + set map(cpf_level_shifter) defunct + set map(cpf_power_domain) defunct + set map(cpf_power_switch) defunct + set map(cpf_state_retention) defunct + set map(cpf_timing) defunct + set map(cpus_per_remote_host) "set_multi_cpu_usage -cpu_per_remote_host" + set map(flexmodel_as_ptn) "set_db proto_create_partition_as_flexmodel" + set map(create_flexfiller_blockage) "set_db proto_flexfiller_route_blockage" + set map(cts_buffer_cells) "set_db cts_buffer_cells" + set map(cts_engine) none + set map(cts_inverter_cells) "set_db cts_inverter_cells" + set map(cts_use_inverters) "set_db cts_use_inverters" + set map(dbs_dir) "set_db flow_database_directory" + set map(delta_delay_threshold) "set_db si_delay_delta_threshold" + set map(enable_aocv) "set_db timing_analysis_aocv" + set map(enable_socv) "set_db timing_analysis_socv" + set map(enable_cppr) "set_db timing_analysis_cppr" + set map(enable_flexilm) "# none : possible future hier flow option" + set map(enable_lvs) "# none : possible future flow option" + set map(enable_nrgr) defunct + set map(enable_ocv) "set_db timing_analysis_type ocv" + set map(enable_pac) defunct + set map(enable_pam) "# none : possible future flow option" + set map(enable_qor_check) defunct + set map(enable_rcp) "# none : current flow template option" + set map(enable_si_aware) "set_db delaycal_enable_si" + set map(enable_signoff_eco) "# none : possible future flow option" + set map(enable_ss) defunct + set map(filler_cells) "set_db add_fillers_cells" + set map(fix_fanout_load) "set_db opt_fix_fanout_load" + set map(fix_hold_ignore_ios) "set_db fix_hold_ignore_path_groups" + set map(fix_litho) "set_db route_design_detail_post_route_litho_repair" + set map(flow_effort) "set_db design_flow_effort" + set map(add_tracks) "# add_tracks" + set map(ground_nets) "set_db init_ground_nets" + set map(high_timing_effort) defunct + set map(ieee1801_file) "# read_power_intent -1801" + set map(ieee1801_isolation) defunct + set map(ieee1801_keep_rows) defunct + set map(ieee1801_level_shifter) defunct + set map(ieee1801_power_domain) defunct + set map(ieee1801_power_switch) defunct + set map(ieee1801_state_retention) defunct + set map(ieee1801_timing) defunct + set map(litho_driven_routing) "set_db route_design_with_litho_driven" + set map(local_cpus) "set_multi_cpu_usage -local_cpu" + set map(log_dir) "set_db flow_log_directory" + set map(max_route_layer) "set_db route_top_routing_layer" + set map(multi_cut_effort) "set_db route_design_detail_use_multi_cut_via_effort" + set map(oa_abstract_name) "set_db init_oa_abstract_views" + set map(oa_layout_name) "set_db init_oa_layout_views" + set map(oa_design_cell) "set_db init_oa_design_cell" + set map(oa_design_lib) "set_db init_oa_design_lib" + set map(oa_design_view) "set_db init_oa_design_view" + set map(place_io_pins) "set_db place_global_place_io_pins" + set map(power_analysis_view) "set_db power_view" + set map(power_effort) "set_db design_power_effort" + set map(power_nets) "set_db init_power_nets" + set map(postroute_extraction_effort) "set_db extract_rc_effort_level" + set map(process) "set_db design_process_node" + set map(remote_hosts) "set_multi_cpu_usage -remote_hosts" + set map(resize_shifter_and_iso_insts) "set_db opt_resize_level_shifter_and_iso_insts" + set map(route_clock_nets) none + set map(signoff_extraction_effort) "set_db extract_rc_effort_level" + set map(skew_buffers) "set_db opt_clock_skew_buffer_cells" + set map(superhosts) defunct + set map(superthreads) defunct + set map(threads) defunct + set map(tie_cells) "set_db add_tieoffs_cells" + set map(tie_cells,max_fanout) "set_db add_tieoffs_max_distance" + set map(top_cell) "# \[get_db designs .name\]" + set map(tquantus_file) defunct + set map(update_io_latency) "set_db cts_update_io_latency" + set map(use_proto_net_delay_model) "set_db proto_use_timing_net_delay_model" + + file mkdir $vars(script_dir) + file delete $vars(script_dir)/attributes.tcl + set op [open $vars(script_dir)/.attributes.tcl w] + + foreach var [array names vars] { + if {[info exists map($var)]} { + if {($map($var) == "none") || ($vars($var) == "")} { + continue + } + if {$map($var) == "defunct"} { +# puts $op "# vars($var) is $map($var)" + } else { + if {[llength $vars($var)] > 1} { + puts $op "$map($var) \[list $vars($var)\] ; # $var " + } elseif {[regexp "^#" $map($var)]} { +# puts $op "$map($var) ; # $var " + } else { + if {$var == "process"} { + set vars($var) [regsub "nm" $vars(process) ""] + } + if {$var == "enable_ocv"} { + set $vars($var) "" + } + puts $op "$map($var) $vars($var) ; # $var " + } + } + } + } + + close $op + + exec cat $vars(script_dir)/.attributes.tcl | sort > $vars(script_dir)/attributes.tcl + file delete $vars(script_dir)/.attributes.tcl + + } + + proc convert_plugins {} { + + global vars + global warnings + + set anchor(always_source_tcl) "before init_floorplan" + set anchor(final_always_source_tcl) "before block_finish" + set anchor(pre_init_tcl) "before init_design" + set anchor(post_init_tcl) "after add_tracks" + set anchor(pre_place_tcl) "before run_place_opt" + set anchor(post_place_tcl) "after run_place_opt" + if {[lindex [split $vars(version) "."] 0] > 16} { + set anchor(pre_cts_tcl) "before add_clock_spec" + set anchor(post_cts_tcl) "after add_clock_tree" + } else { + set anchor(pre_cts_tcl) "before build_clock_tree" + set anchor(post_cts_tcl) "after build_clock_tree" + } + set anchor(pre_route_tcl) "before run_route" + set anchor(post_route_tcl) "after run_route" + set anchor(pre_postroute_tcl) "before run_opt_postroute" + set anchor(post_postroute_tcl) "after run_opt_postroute" + #set anchor(pre_signoff_tcl) "before run_sta" + #set anchor(post_signoff_tcl) "after run_sta" + + set step(pre_init_tcl) "init" + set step(post_init_tcl) "init" + set step(pre_place_tcl) "place" + set step(post_place_tcl) "place" + set step(pre_cts_tcl) "cts" + set step(post_cts_tcl) "cts" + set step(pre_route_tcl) "route" + set step(post_route_tcl) "route" + set step(pre_postroute_tcl) "postroute" + set step(post_postroute_tcl) "postroute" + set step(pre_signoff_tcl) "signoff" + set step(post_signoff_tcl) "signoff" + + set cf [open convert_plugins.tcl w] + + #file delete -force .fftmp + #file mkdir .fftmp + + set new_plugs [list] + set old_plugs [list] + foreach plug $vars(plugins_defined) { + if {[file exists $vars(plug_dir)/$vars($plug)]} { + set plug_file [file normalize $vars(plug_dir)/$vars($plug)] + lappend old_plugs "$plug $vars(plug_dir)/$vars($plug)" + } else { + if {[file exists $vars($plug)]} { + set plug_file $vars($plug) + lappend old_plugs "$plug $vars($plug)" + } else { + continue + } + } + #puts $cf "convert_legacy_to_common_ui $plug_file .fftmp/[file tail $plug_file]" + #lappend new_plugs "$plug .fftmp/[file tail $plug_file]" + #puts $cf "convert_legacy_to_common_ui $plug_file [file dirname $plug_file]_cui/[file tail $plug_file]" + puts $cf "file mkdir converted_plugins" + puts $cf "convert_legacy_to_common_ui $plug_file converted_plugins/[file tail $plug_file]" + lappend new_plugs "$plug cui.$plug_file" + } + + puts $cf "exit" + close $cf + + if {![info exists vars(convert_plugins)] || ([info exists vars(convert_plugins)] && !$vars(convert_plugins))} { +# Puts " Converting [llength $vars(plugins_defined)] plugins ..." +# if {[catch {eval "exec innovus -nowin -novus_ui -files .convert_plugins.tcl"}]} { +# puts " WARNING: Cannot find Innovus in your path so plugins will not be converted" +# set warnings($vars(warning_count)) "Cannot find Innovus in your path so plugins will not be converted" +# incr vars(warning_count) +# return +# } + } + + file mkdir $vars(script_dir) + set of [open $vars(script_dir)/plug_steps.tcl w] + + set plug_dict [join $new_plugs] + set plug_dict [join $old_plugs] + foreach key [dict keys $plug_dict] { + #puts "$key -> [dict get $plug_dict $key]" + set ip [open [dict get $plug_dict $key] r] + if {[info exists vars(legacy_plugins)] && $vars(legacy_plugins)} { + puts $of "create_flow_step -name [regsub "_tcl" $key "_plug"] -legacy \{" + } else { + puts $of "create_flow_step -name [regsub "_tcl" $key "_plug"] \{" + } + foreach file $vars(config_files) { + puts $of "source $file" + } + if {[info exists step($key)]} { + puts $of "set vars(step) $step($key)" + } + while {[gets $ip line]>=0} { + puts $of " $line" + } + puts $of "\}" + if {[info exists anchor($key)]} { + puts $of "edit_flow -append flow_step:[regsub "_tcl" $key "_plug"] -[lindex $anchor($key) 0] flow_step:[lindex $anchor($key) 1]" + } else { +# puts " No anchor found for $plug" + set warnings($vars(warning_count)) "No anchor found for $key" + incr vars(warning_count) + } + close $ip + } + close $of + file delete -force .fftmp + if {[file exists scripts/flow_config.template]} { + file copy -force scripts/flow_config.template scripts/flow_config.tcl + } + if {[file exists $vars(script_dir)/view_definition.tcl]} { + file mkdir scripts + file copy -force $vars(script_dir)/view_definition.tcl scripts/mmmc_config.tcl + } else { + set warnings($vars(warning_count)) "File $vars(script_dir)/view_definition.tcl not found" + incr vars(warning_count) + } +# set op [open scripts/flow_config.tcl a] +# puts $op "source $vars(script_dir)/plug_steps.tcl" +# close $op + } +} + +namespace eval ff_novus:: { + proc run_init {} { + uplevel #0 eval [FF_NOVUS::run_init] + } + proc run_place {} { + uplevel #0 eval [FF_NOVUS::run_place] + } + proc run_prects {} { + uplevel #0 eval [FF_NOVUS::run_prects] + } + proc run_cts {} { + uplevel #0 eval [FF_NOVUS::run_cts] + } + proc run_postcts {} { + uplevel #0 eval [FF_NOVUS::run_postcts] + } + proc run_postcts_hold {} { + uplevel #0 eval [FF_NOVUS::run_postcts_hold] + } + proc run_route {} { + uplevel #0 eval [FF_NOVUS::run_route] + } + proc run_postroute {} { + uplevel #0 eval [FF_NOVUS::run_postroute] + } + proc run_postroute_hold {} { + uplevel #0 eval [FF_NOVUS::run_postroute_hold] + } + proc run_postroute_si_hold {} { + uplevel #0 eval [FF_NOVUS::run_postroute_si_hold] + } + proc run_postroute_si {} { + uplevel #0 eval [FF_NOVUS::run_postroute_si] + } + proc run_signoff {} { + uplevel #0 eval [FF_NOVUS::run_signoff] + } + proc run_assemble {} { + uplevel #0 eval [FF_NOVUS::run_assemble] + } + proc run_rebudget {} { + uplevel #0 eval [FF_NOVUS::run_rebudget] + } + proc run_flexilm {} { + uplevel #0 eval [FF_NOVUS::run_flexilm] + } + proc run_assemble_flexilm {} { + uplevel #0 eval [FF_NOVUS::run_assemble_flexilm] + } + proc run_partition {} { + uplevel #0 eval [FF_NOVUS::run_partition] + } + proc run_lec {} { + uplevel #0 eval [FF_NOVUS::run_lec] + } + proc run_all {} { + uplevel #0 FF_NOVUS::run_all + } +} + +namespace eval FF_EDI:: { + + ############################################################################### + # Procedure to seed certain flow variables to a known default value as well + # as data variables required to seed the generic configuration file + ############################################################################### + proc seed_variables {{force 0}} { + + global vars + global rda_defaults + global udm + global env + global infos + global warnings + global errors + global fargs + global dargs + + if {$force} { + if {[info exists vars(seed)]} { + unset vars(seed) + } + } + + if {![info exists vars(seed)]} { + + puts " Seeding variables ..." + + if {![info exists vars(warning_count)]} { + set vars(warning_count) 0 + } + if {![info exists vars(error_count)]} { + set vars(error_count) 0 + } + if {![info exists vars(info_count)]} { + set vars(info_count) 0 + } + + ############################################################################### + # Set vars(version) to "17.1.0" if not defined + ############################################################################### + if {![info exists vars(version)]} { + if {[info exists fargs(version)]} { +# puts " INFO: Variable vars(version) not defined - setting to '$fargs(version)'" + set vars(version) $fargs(version) + } else { + set vars(version) $dargs(version) + } + set vars(flow) mmmc + } else { + if {([lsearch $FF::valid_versions $vars(version)] < 0)} { + set msg "Version '$vars(version)' not supported - setting to '17.1.0'" + puts " WARNING: $msg" + append commands "# $msg\n" + set warnings($vars(warning_count)) $msg + incr vars(warning_count) + set vars(flow) mmmc + set vars(version) "17.1.0" + } else { + if {[lindex [split $vars(version) "."] 0] > 10} { + set vars(flow) mmmc + } + } + } + + if {$vars(mode) == "top_down"} { set vars(mode) hier } + + if {[regexp "9.1" $vars(version)]} { + set vars(enable_ldb) FALSE + } + if {[info exists vars(enable_ldb)] && $vars(enable_ldb)} { + if {![info exists vars(ran_compile)]} { + append commands [FF_EDI::run_compile] + } + } + + + ############################################################################### + # Set vars(flow) to "mmmc" if not defined + ############################################################################### + if {![info exists vars(flow)]} { + puts " INFO: Variable vars(flow) not defined - setting to 'mmmc'" + set vars(flow) mmmc + } else { + if {([lsearch [list "default" "pr_mmmc" "mmmc"] $vars(flow)] < 0)} { + puts " WARNING: Flow type '$vars(flow)' not supported - setting to 'mmmc'" + append commands "# WARNING: Flow type '$vars(flow)' not supported - setting to 'mmmc'\n" + set warnings($vars(warning_count)) "Flow type '$vars(flow)' not supported - setting to 'mmmc'" + incr vars(warning_count) + set vars(flow) mmmc + } + } + + ############################################################################### + # Make sure all scaling factors are either set or are 1.0 ... also + # support backwards compatibility of old names + ############################################################################### + set map(pre_route_res_factor) def_res_factor + set map(pre_route_clk_res_factor) def_clk_res_factor + set map(pre_route_cap_factor) def_cap_factor + set map(pre_route_clk_cap_factor) def_clk_cap_factor + set map(post_route_res_factor) det_res_factor + set map(post_route_clk_res_factor) det_clk_res_factor + set map(post_route_cap_factor) det_cap_factor + set map(post_route_clk_cap_factor) det_clk_cap_factor + set map(post_route_xcap_factor) xcap_factor + + if {[info exists vars(view_definition_tcl)] && ![info exists vars(parsed_view_definition_tcl)]} { + if {![file exists $vars(view_definition_tcl)]} { + puts " ERROR: View definition file $vars(view_definition_tcl) does not exist ... cannot continue" + exit + } + source $vars(script_path)/ETC/INNOVUS/overlay.tcl + puts " Parsing user view definition file ..." + set rc [catch {source $vars(view_definition_tcl)}] +# puts "-------------------------------------------------" + foreach var "library_sets rc_corners delay_corners setup_analysis_views hold_analysis_views power_domains" { + if {[info exists vars($var)]} { + set infos($vars(info_count)) "Variable vars($var) has been set to \"$vars($var)\"" + incr vars(info_count) + } + } +# puts $rc +# puts "-------------------------------------------------" + set vars(parsed_view_definition_tcl) true + } + +# if {![info exists vars(view_definition_tcl)]} { + + foreach rc_corner $vars(rc_corners) { + foreach option "pre_route_res_factor pre_route_clk_res_factor \ + post_route_res_factor post_route_clk_res_factor \ + pre_route_cap_factor pre_route_clk_cap_factor \ + post_route_cap_factor post_route_clk_cap_factor \ + post_route_xcap_factor" { + if {![info exists vars($rc_corner,$option)] && [info exists vars($rc_corner,$map($option))]} { + append commands "# INFO: Variable $map($option) has been changed to $option ... please update\n" + set infos($vars(info_count)) "Variable $map($option) has been changed to $option ... please update" + incr vars(info_count) + set vars($rc_corner,$option) $vars($rc_corner,$map($option)) + } + } + } + + ############################################################################### + # The following will be used to seed the config file + ############################################################################### + + if {![FF::is_lp_flow]} { + + set max_libs [list] + set min_libs [list] + + set count 0 + + if {[info exists vars($vars($vars(default_setup_view),delay_corner),library_set)]} { + foreach lib $vars($vars($vars($vars(default_setup_view),delay_corner),library_set),timing) { + if {[lsearch $max_libs $lib] == -1} { + lappend max_libs $lib + incr count + } + } + } else { + if {[info exists vars($vars($vars(default_setup_view),delay_corner),late_library_set)]} { + foreach lib $vars($vars($vars($vars(default_setup_view),delay_corner),late_library_set),timing) { + if {[lsearch $max_libs $lib] == -1} { + lappend max_libs $lib + incr count + } + } + } + } + + if {![info exists vars(timelib,max)]} { + set vars(timelib,max) $max_libs + } + + if {[info exists vars($vars($vars(default_hold_view),delay_corner),library_set)]} { + foreach lib $vars($vars($vars($vars(default_hold_view),delay_corner),library_set),timing) { + if {[lsearch $min_libs $lib] == -1} { + lappend min_libs $lib + incr count + } + } + } else { + if {[info exists vars($vars($vars(default_hold_view),delay_corner),early_library_set)]} { + foreach lib $vars($vars($vars($vars(default_hold_view),delay_corner),early_library_set),timing) { + if {[lsearch $min_libs $lib] == -1} { + lappend min_libs $lib + incr count + } + } + } + } + + if {![info exists vars(timelib,min)]} { + set vars(timelib,min) $min_libs + } + + if {![info exists vars(timelib)]} { + set vars(timelib) "" + } + + set vars(cdb_file) "" + set vars(cdb_file,min) "" + set vars(cdb_file,max) "" + + if {[info exists vars($vars($vars(default_setup_view),delay_corner),library_set)]} { + if {[info exists vars($vars($vars($vars(default_setup_view),delay_corner),library_set),si)]} { + set vars(cdb_file,max) $vars($vars($vars($vars(default_setup_view),delay_corner),library_set),si) + } + } elseif {[info exists vars($vars($vars(default_setup_view),delay_corner),late_library_set)]} { + if {[info exists ars($vars($vars($vars(default_setup_view),delay_corner),late_library_set),si)]} { + set vars(cdb_file,max) $vars($vars($vars($vars(default_setup_view),delay_corner),late_library_set),si) + } + } else { + set vars(cdb_file,max) "" + } + if {[info exists vars($vars($vars(default_hold_view),delay_corner),library_set)]} { + if {[info exists vars($vars($vars($vars(default_hold_view),delay_corner),library_set),si)]} { + set vars(cdb_file,min) $vars($vars($vars($vars(default_hold_view),delay_corner),library_set),si) + } + } elseif {[info exists vars($vars($vars(default_hold_view),delay_corner),early_library_set)]} { + if {[info exists vars($vars($vars($vars(default_hold_view),delay_corner),early_library_set),si)]} { + set vars(cdb_file,min) $vars($vars($vars($vars(default_hold_view),delay_corner),early_library_set),si) + } + } else { + set vars(cdb_file,min) "" + } + if {[info exists vars($vars($vars(default_setup_view),constraint_mode),pre_cts_sdc)]} { + if {$vars(flow) != "mmmc"} { + set vars(timingcon_file) $vars($vars($vars(default_setup_view),constraint_mode),pre_cts_sdc) + } + set vars(pre_cts_sdc) $vars($vars($vars(default_setup_view),constraint_mode),pre_cts_sdc) + } + if {[info exists vars($vars($vars(default_setup_view),constraint_mode),pre_cts_ilm_sdc)]} { + if {$vars(flow) != "mmmc"} { + set vars(timingcon_file,full) $vars($vars($vars(default_setup_view),constraint_mode),pre_cts_ilm_sdc) + } + } + if {[info exists vars($vars($vars(default_setup_view),constraint_mode),incr_cts_sdc)]} { + set vars(incr_cts_sdc) $vars($vars($vars(default_setup_view),constraint_mode),incr_cts_sdc) + } + if {[info exists vars($vars($vars(default_setup_view),constraint_mode),post_cts_sdc)]} { + set vars(post_cts_sdc) $vars($vars($vars(default_setup_view),constraint_mode),post_cts_sdc) + } + + if {[info exists vars($vars($vars($vars(default_hold_view),delay_corner),rc_corner),cap_table)] &&\ + [info exists vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table)]} { + set vars(captbl_file) [concat \ + "-best" $vars($vars($vars($vars(default_hold_view),delay_corner),rc_corner),cap_table) \ + "-worst" $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table) \ + ] + set vars(wc_cap_table) $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table) + } else { + if {[info exists vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table)]} { + set vars(captbl_file) [concat \ + "-best" $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table) \ + "-worst" $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table) \ + ] + set vars(wc_cap_table) $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),cap_table) + } else { + set vars(captbl_file) "" + } + } + } else { + set vars(timelib) "" + set vars(cdb_file) "" + set vars(timelib,max) "" + set vars(cdb_file,max) "" + set vars(timelib,min) "" + set vars(cdb_file,min) "" + set found_max 0 + set found_min 0 + + if {[info exists vars(setup_analysis_views)] && [info exists vars(hold_analysis_views)]} { + foreach view $vars(setup_analysis_views) { + if {[info exists vars($vars($view,delay_corner),library_set)]} { + if {[info exists vars($vars($vars($view,delay_corner),library_set),timing)]} { + foreach file $vars($vars($vars($view,delay_corner),library_set),timing) { + if {[lsearch $vars(timelib,max) $file] == -1} { + lappend vars(timelib,max) $file + } + set found_max 1 + } + } else { + puts " WARNING: Variable vars($vars($vars($view,delay_corner),library_set),timing) not defined" + set warnings($vars(warning_count)) "Variable vars($vars($vars($view,delay_corner),library_set),timing) not defined" + incr vars(warning_count) + } + } else { + if {![info exists vars($vars($view,delay_corner),early_library_set)]} { + puts " WARNING: Variable vars($vars($view,delay_corner),library_set) not defined" + set warnings($vars(warning_count)) "Variable vars($vars($view,delay_corner),library_set) not defined" + incr vars(warning_count) + } + } + } + foreach view $vars(hold_analysis_views) { + if {[info exists vars($vars($view,delay_corner),library_set)]} { + if {[info exists vars($vars($vars($view,delay_corner),library_set),timing)]} { + foreach file $vars($vars($vars($view,delay_corner),library_set),timing) { + if {[lsearch $vars(timelib,min) $file] == -1} { + lappend vars(timelib,min) $file + } + set found_min 1 + } + } else { + puts " WARNING: vars($vars($vars($view,delay_corner),library_set),timing) not defined" + set warnings($vars(warning_count)) "Variable vars($vars($vars($view,delay_corner),library_set),timing) not defined" + incr vars(warning_count) + } + } else { + if {![info exists vars($vars($view,delay_corner),early_library_set)]} { + puts " WARNING: vars($vars($view,delay_corner),early_library_set) not defined" + set warnings($vars(warning_count)) "Variable vars($vars($view,delay_corner),early_library_set) not defined" + incr vars(warning_count) + } + } + } + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + set view $vars(power_analysis_view) + if {[info exists vars($vars($view,delay_corner),library_set)]} { + if {![info exists vars($vars($vars($view,delay_corner),library_set),timing)]} { + puts " WARNING: vars($vars($vars($view,delay_corner),library_set),timing) not defined" + set warnings($vars(warning_count)) "Variable vars($vars($vars($view,delay_corner),library_set),timing) not defined" + incr vars(warning_count) + } + } else { + if {![info exists vars($vars($view,delay_corner),early_library_set)]} { + puts " WARNING: vars($vars($view,delay_corner),early_library_set) not defined" + set warnings($vars(warning_count)) "Variable vars($vars($view,delay_corner),early_library_set) not defined" + incr vars(warning_count) + } + } + } + } + + if {!$found_min || !$found_max} { + append commands "# WARNING: Either setup or hold analysis views inadequately defined" + set warnings($vars(warning_count)) "Either setup or hold analysis views inadequately defined" + incr vars(warning_count) + set vars(timelib,min) "" + set vars(timelib,max) "" + foreach library_set $vars(library_sets) { + if {[info exists vars($library_set,timing)]} { + set vars(timelib) [concat $vars(timelib) $vars($library_set,timing)] + } + if {[info exists vars($library_set,si)]} { + set vars(cdb_file) [concat $vars(cdb_file) $vars($library_set,si)] + } + } + } + set vars(captbl_file) "" + set vars(timingcon_file) "" + # set vars(pre_route_res_factor) 1.0 + # set vars(post_route_res_factor) 1.0 + # set vars(pre_route_cap_factor) 1.0 + # set vars(post_route_cap_factor) 1.0 + # set vars(pre_route_clk_res_factor) 1.0 + # set vars(post_route_clk_res_factor) 1.0 + # set vars(pre_route_clk_cap_factor) 1.0 + # set vars(post_route_clk_cap_factor) 1.0 + # set vars(post_route_xcap_factor) 1.0 + # set vars(qxtech_file) "" + # set vars(qxconf_file) "" + # set vars(qxlib_file) "" + # set vars(qxlayermap_file) "" + } + + set map(qx_tech_file) qxtech_file + set map(qx_conf_file) qxconf_file + set map(qx_lib_file) qxlib_file + + foreach option "qx_tech_file qx_conf_file qx_lib_file" { + if {[info exists vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),$option)]} { + set vars($map($option)) $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),$option) + } else { + set vars($map($option)) "" + } + } + if {![info exists vars(qx_layermap_file)]} { + if {[info exists vars(qrc_layer_map)]} { + set vars(qxlayermap_file) $vars(qrc_layer_map) + } else { + set vars(qxlayermap_file) "" + } + } else { + set vars(qxlayermap_file) $vars(qx_layermap_file) + set vars(qrc_layer_map) $vars(qx_layermap_file) + } +# } + + ############################################################################### + # Backwards compatibility + ############################################################################### + if {[info exists vars(leakage_effort)] && ![info exists vars(leakage_power_effort)]} { + set vars(leakage_power_effort) $vars(leakage_effort) + } + if {[info exists vars(enable_cppr)] && (($vars(enable_cppr) == 0) || ($vars(enable_cppr) == false))} { + set vars(enable_cppr) none + } + if {[info exists vars(enable_cppr)] && (($vars(enable_cppr) == 1) || ($vars(enable_cppr) == true))} { + set vars(enable_cppr) both + } + if {[info exists vars(def_file)]} { + append commands "# WARNING: Variable def_file has been changed to def_files ... please update\n" + set warnings($vars(warning_count)) "Variable def_file has been changed to def_files ... please update" + incr vars(warning_count) + set vars(def_files) $vars(def_file) + } + + ############################################################################### + # Seed the rest of the config variables allowing user overrides ... + # Default values for all variables are in defaults.tcl + ############################################################################### + + if {![info exists vars(script_path)]} { + if {[info exists vars(script_root)]} { + set vars(script_path) $vars(script_root) + } else { + puts " ERROR: Variable vars(script_root) not defined" + exit 1 + } + } else { + if {![info exists vars(script_root)]} { + set vars(script_root) $vars(script_path) + } + } + if {![info exists vars(setup_path)]} { + set vars(setup_path) "." + } + if {[info command FFF::get_tool] ne "" && [FFF::get_tool] eq "rc"} { + tcl_source $vars(script_path)/ETC/INNOVUS/rda_defaults.tcl + } else { + source $vars(script_path)/ETC/common_defaults.tcl + source $vars(script_path)/ETC/INNOVUS/defaults.tcl + source $vars(script_path)/ETC/INNOVUS/rda_defaults.tcl + } + + foreach option [array names rda_defaults] { + if {![info exists vars($option)]} { + set vars($option) $rda_defaults($option) + } else { + if {$vars($option) != $rda_defaults($option)} { +# puts "# INFO: User override of $option to $vars($option)" + } + } + } + + if {![info exists vars(cpus_per_remote_host)] && [info exists vars(cpu_per_remote_host)]} { + Puts " INFO: Setting 'vars(cpus_per_remote_host)' to 'vars(cpu_per_remote_host)'" + Puts " INFO: ^" + Puts " INFO: Please update your setup to cpus_per_remote ..." + set vars(cpus_per_remote_host) $vars(cpu_per_remote_host) + } + + if {![info exists vars(flexmodel_art_based)]} { + if {[info exists vars(flexmodel_as_ptn)] && $vars(flexmodel_as_ptn)} { + set flow_defaults(flexmodel_art_based) 1 + } + } + if {![info exists vars(high_timing_effort)]} { + set vars(high_timing_effort) $flow_defaults(high_timing_effort) + } + if {[info exists vars(clock_eco)] && ($vars(clock_eco) == "postcts")} { + set vars(clock_eco) "post_cts" + } + if {[info exists vars(clock_eco)] && ($vars(clock_eco) == "postroute")} { + set vars(clock_eco) "post_route" + } + if {[regexp "9.1" $vars(version)]} { + if {$vars(high_timing_effort)} { + if {[info exists vars(critical_range)] && ($vars(critical_range) != 1.0)} { + Puts " High timing effort enabled but critical_range overridden by user settings" + } + if {[info exists vars(clock_eco)] && ($vars(clock_eco) != "post_cts")} { + Puts " High timing effort enabled but clock_eco overridden by user settings" + } + if {[info exists vars(in_place_opt)] && !$vars(in_place_opt)} { + Puts " High timing effort enabled but in_place_opt overridden by user settings" + } + } + } + + if {[info exists vars(cts_engine)] && ([string tolower $vars(cts_engine)] == "cts")} { + set flow_defaults(update_io_latency) false +# set vars(cts,update_timing,skip) true + } + + foreach option [array names flow_defaults] { + if {![info exists vars($option)]} { + set vars($option) $flow_defaults($option) + if {$vars(high_timing_effort) && [regexp "9.1" $vars(version)]} { + set vars(in_place_opt) true + set vars(critical_range) 1.0 +# set vars(useful_skew) true + set vars(clock_eco) post_cts + } +# if {$vars(cts_engine) == "ccopt_design"} { +# set vars(ccopt_effort) low +# } + } + } + + if {![info exists vars(time_info_db)]} { + set flow_defaults(time_info_db) $vars(rpt_dir)/time_info.db + } + if {![info exists vars(time_info_full_rpt)]} { + set flow_defaults(time_info_full_rpt) $vars(rpt_dir)/time_info_full.rpt + } + if {![info exists vars(html_summary)]} { + set flow_defaults(html_summary) $vars(rpt_dir)/summary.html + } + + if {![info exists vars(enable_si_aware)]} { +# if {[regsub "nm" $vars(process) ""] <= 65} { +# set vars(enable_si_aware) true +# } else { + set vars(enable_si_aware) false +# } + } + + + if {![info exists vars(dbs_format)]} { + if {[string compare -nocase $vars(netlist_type) "verilog"]>=0} { + set vars(dbs_format) fe + } else { + set vars(dbs_format) oa + } + } + if {![info exists vars(partition_dir)]} { + set vars(partition_dir) PARTITION + } + if {![info exists vars(partition_dir_pass2)]} { + if {$vars(enable_flexilm)} { + set vars(partition_dir_pass2) $vars(partition_dir)_PRECTS + } else { + set vars(partition_dir_pass2) $vars(partition_dir)_CTS + } + } + if {$vars(user_mode) == "hier"} { + FF_EDI::normalize_files + if {$vars(enable_flexilm)} { +# set vars(cts,starting_dbs) "\[glob *_postECO.enc\]" +# # DLM is a two pass flow but user doesn't need to specify it + set vars(hier_flow_type) "2pass" +# set vars(place_opt_design) false + } else { + if {$vars(hier_flow_type) == "2pass"} { + set vars(postcts,starting_dbs) . + } +# } + } + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {![info exists vars(oa_abstract_name)]} { set vars(oa_abstract_name) abstract} + if {![info exists vars(oa_layout_name)]} { set vars(oa_layout_name) layout} + if {![info exists vars(oa_design_cell)]} { set vars(oa_design_cell) $vars(design)} + if {![info exists vars(oa_design_view)]} { set vars(oa_design_view) ""} + if {![info exists vars(oa_partition_lib)]} { set vars(oa_partition_lib) OA_PTN_LIB} + } else { + if {![info exists vars(oa_abstract_name)]} { set vars(oa_abstract_name) ""} + if {![info exists vars(oa_layout_name)]} { set vars(oa_layout_name) ""} + if {![info exists vars(oa_design_cell)]} { set vars(oa_design_cell) ""} + if {![info exists vars(oa_design_view)]} { set vars(oa_design_view) ""} + if {![info exists vars(oa_design_lib)]} { set vars(oa_design_lib) ""} + } + + if {([string tolower $vars(fix_hold)] == "true") || ($vars(fix_hold) == 1)} { + set infos($vars(info_count)) "Changing vars(fix_hold) from $vars(fix_hold) to \"$flow_defaults(fix_hold)\"" + incr vars(info_count) + set vars(fix_hold) $flow_defaults(fix_hold) + } + if {([string tolower $vars(enable_ocv)] == "true") || ($vars(enable_ocv) == 1)} { + set infos($vars(info_count)) "Changing vars(enable_ocv) from \"$vars(enable_ss)\" to \"pre_postroute\"" + incr vars(info_count) + set vars(enable_ocv) pre_cts + } elseif {($vars(enable_ocv) == "none") || ($vars(enable_ocv) == 0)} { + set infos($vars(info_count)) "Changing vars(enable_ocv) from \"$vars(enable_ocv)\" to \"false\"" + incr vars(info_count) + set vars(enable_ocv) false + } + if {[lindex [split $vars(version) "."] 0] > 11} { + if {[string tolower $vars(enable_ocv)] == "false"} { + if {[lindex [split $vars(version) "."] 0] < 15} { + set infos($vars(info_count)) "Changing vars(enable_ocv) from \"$vars(enable_ocv)\" to \"pre_postroute\"" + incr vars(info_count) + set vars(enable_ocv) "pre_postroute" + } else { + set infos($vars(info_count)) "Changing vars(enable_ocv) from \"$vars(enable_ocv)\" to \"pre_cts\"" + incr vars(info_count) + set vars(enable_ocv) "pre_cts" + } + } + } + if {([string tolower $vars(enable_ss)] == "true") || ($vars(enable_ss) == 1)} { + set infos($vars(info_count)) "Changing vars(enable_ss) from $vars(enable_ss) to \"pre_postroute\"" + incr vars(info_count) + set vars(enable_ss) pre_postroute + } elseif {($vars(enable_ss) == "none") || ($vars(enable_ss) == 0)} { + set infos($vars(info_count)) "Changing vars(enable_ss) from $vars(enable_ss) to \"false\"" + incr vars(info_count) + set vars(enable_ss) false + } + if {([string tolower $vars(metalfill)] == "none") || ([string tolower $vars(metalfill)] == "false" && $vars(metalfill) != "false") || ($vars(metalfill) == 0)} { + set infos($vars(info_count)) "Changing vars(metalfill) from $vars(metalfill) to \"false\"" + incr vars(info_count) + set vars(metalfill) false + } + if {[info exists vars(clock_eco)]} { + if {($vars(clock_eco) == "true") || ($vars(clock_eco) == 1)} { + set infos($vars(info_count)) "Changing vars(clock_eco) from $vars(clock_eco) to \"post_cts\"" + incr vars(info_count) + set vars(clock_eco) post_cts + } elseif {($vars(clock_eco) == "false") || ($vars(clock_eco) == 0)} { + set infos($vars(info_count)) "Changing vars(clock_eco) from $vars(clock_eco) to \"none\"" + incr vars(info_count) + set vars(clock_eco) none + } elseif {($vars(clock_eco) == "preroute") || ($vars(clock_eco) == "pre_route")} { + set infos($vars(info_count)) "Changing vars(clock_eco) from $vars(clock_eco) to \"post_cts\"" + incr vars(info_count) + set vars(clock_eco) post_cts + } elseif {$vars(clock_eco) == "postroute"} { + set infos($vars(info_count)) "Changing vars(clock_eco) from $vars(clock_eco) to \"post_route\"" + incr vars(info_count) + set vars(clock_eco) post_route + } + } + if {([string tolower $vars(use_flexmodels)] == "true") || ($vars(use_flexmodels) == 1)} { + set vars(use_flexmodels) 1 + } else { + set vars(use_flexmodels) 0 + } +# if {$vars(use_flexmodels) && $vars(place_opt_design)} { +# set warnings($vars(warning_count)) "Setting vars(place_opt_design) to 'false' as vars(use_flexmodels) is true" +# incr vars(warning_count) +# set vars(place_opt_design) false +# } + if {([string tolower $vars(flexmodel_as_ptn)] == "true") || ($vars(flexmodel_as_ptn) == 1)} { + set vars(flexmodel_as_ptn) 1 + } else { + set vars(flexmodel_as_ptn) 0 + } + if {([string tolower $vars(placement_based_ptn)] == "true") || ($vars(placement_based_ptn) == 1)} { + set vars(placement_based_ptn) 1 + } else { + set vars(placement_based_ptn) 0 + } + if {([string tolower $vars(abutted_design)] == "true") || ($vars(abutted_design) == 1)} { + set vars(abutted_design) 1 + } else { + set vars(abutted_design) 0 + } + if {([string tolower $vars(insert_feedthrough)] == "true") || ($vars(insert_feedthrough) == 1)} { + set vars(insert_feedthrough) 1 + } else { + set vars(insert_feedthrough) 0 + } + if {![info exists vars(resize_shifter_and_iso_insts)] || $vars(resize_shifter_and_iso_insts) == ""} { + set vars(resize_shifter_and_iso_insts) true + } + if {![info exists vars(activity_file_format)] || $vars(activity_file_format) == ""} { + set vars(activity_file_format) TCF + } + if {![info exists vars(power_nets)]} { + if {[info exists vars(pwrnet)]} { + append commands "# INFO: Variable pwrnet has been changed to power_nets ... please update\n" + set infos($vars(info_count)) "Variable pwrnet has been changed to power_nets ... please update" + incr vars(info_count) + set vars(power_nets) $vars(pwrnet) + } else { + set vars(power_nets) "" + } + } + if {![info exists vars(ground_nets)]} { + if {[info exists vars(gndnet)]} { + append commands "# INFO: Variable gndnet has been changed to ground_nets ... please update\n" + set infos($vars(info_count)) "Variable gndnet has been changed to ground_nets ... please update" + incr vars(info_count) + set vars(ground_nets) $vars(gndnet) + } else { + set vars(ground_nets) "" + } + } + if {![info exists vars(superhosts)]} { + set vars(superhosts) 0 + } + + if {![info exists vars(superthreads)]} { + set vars(superthreads) 1 + } else { + if {($vars(threads) > 1) && ($vars(superthreads) == 1)} { + set vars(superthreads) $vars(threads) + } + } + if {![info exists vars(makefile)]} { + set vars(makefile) 1 + } + if {![info exists vars(flat)]} { + set vars(flat) none + } + if {![info exists vars(abort)]} { + set vars(abort) 0 + } + if {![info exists vars(catch_errors)]} { + set vars(catch_errors) 1 + } + if {![info exists vars(restore_design)]} { + set vars(restore_design) 1 + } + if {$vars(catch_errors)} { + if {![info exists vars(save_on_catch)]} { + set vars(save_on_catch) 1 + } + if {![info exists vars(exit_on_error)]} { + set vars(exit_on_error) 1 + } + } + if {![info exists env(VPATH)]} { + set env(VPATH) $flow_defaults(vpath) + Puts " INFO: Setting env(VPATH) to $flow_defaults(vpath)" + } + if {[info exists vars(cpf_file)]} { + if {![info exists vars(cpf_timing)]} { + set vars(cpf_timing) true +# set vars(flat) true + } + } else { + set vars(cpf_timing) false + } + + if {!$vars(codegen)} { + if {[FF::is_lp_flow]} { + catch {alias ff_modify_power_domains FF_EDI::modify_power_domains} + catch {alias ff_add_power_switches FF_EDI::add_power_switches} + catch {alias ff_route_secondary_pg_nets FF_EDI::route_secondary_pg_nets} + catch {alias ff_get_power_domains FF_EDI::get_power_domains} + catch {alias ff_buffer_always_on_nets FF_EDI::buffer_always_on_nets} + catch {alias ff_insert_welltaps_endcaps FF_EDI::insert_welltaps_endcaps} + } + set flow_defaults(script_dir) "." + } + +# Remember these for step based reporting ... + set vars(orig_rpt_dir) $vars(rpt_dir) + set vars(orig_log_dir) $vars(log_dir) + set vars(orig_dbs_dir) $vars(dbs_dir) + +# Add these for get metric + if {![info exists vars(html_summary)]} { + set vars(html_summary) $vars(rpt_dir)/summary.html + } + if {![info exists vars(time_info_db)]} { + set vars(time_info_db) $vars(rpt_dir)/time_info.db + } + if {![info exists vars(time_info_rpt)]} { + set vars(time_info_rpt) $vars(rpt_dir)/time_info.rpt + } + + if {[info command FFF::get_tool] ne "" && [FFF::get_tool] eq "rc"} { + tcl_source $vars(script_path)/ETC/INNOVUS/udm.tcl + } else { + source $vars(script_path)/ETC/INNOVUS/udm.tcl + } + if {!$vars(rc) || ($vars(rc) && ![info exists vars(rc_steps)])} { + set vars(seed) 1 + } + } + +# if {![info exists vars(view_definition_tcl)]} { + FF_EDI::normalize_constraints +# } + + # Disable this for 14.20 + set vars(generate_flow_steps) 0 + + if {$vars(generate_flow_steps)} { + set vars(skip_signoff_checks) true + FF_EDI::normalize_files + } + +# if {[info exists vars(view_definition_tcl)]} { +# set vars(skip_signoff_checks) false +# } + # RC Stuff ... + # ------------------------------------------------------------------------------ + if {$vars(rc)} { + if {![info exists vars(ovf_dir)]} { set vars(ovf_dir) OVF } + if {![info exists vars(lec_dir)]} { set vars(lec_dir) LEC } + if {![info exists vars(enable_rcp)]} { set vars(enable_rcp) 0 } + if {![info exists vars(enable_pam)]} { set vars(enable_pam) 0 } + set vars(syn_map,set_misc_attributes,skip) false + set vars(syn_map,set_lib_attributes,skip) false + set vars(syn_map,set_hdl_attributes,skip) false + set vars(syn_map,set_icg_attributes,skip) true + set vars(syn_map,set_dft_attributes,skip) true + set vars(syn_incr,set_opt_attributes,skip) true + + ############################################################################### + # Set netlist and def variables when RC / RCP enabled + ############################################################################### + if {$vars(enable_rcp)} { + set vars(netlist) $vars(dbs_dir)/syn_place/syn_place.v.gz + set vars(def_files) $vars(dbs_dir)/syn_place/syn_place.def.gz + } else { + set vars(netlist) $vars(dbs_dir)/syn_incr/syn_incr.v.gz +# set vars(def_files) $vars(dbs_dir)/syn_incr/syn_incr.def.gz + } + } + + } + + ############################################################################### + # Procedure to check the flow variables defined in the setup.tcl + ############################################################################### + proc check_setup {} { + + global vars + global tvars + global errors + global warnings + global infos + global check + + if {[info exists vars(check_setup)] && !$vars(check_setup)} { + return + } + + if {[info exists vars(warning_count)]} { + set warning_count $vars(warning_count) + } else { + set warning_count 0 + } + if {[info exists vars(error_count)]} { + set error_count $vars(error_count) + } else { + set error_count 0 + } + if {[info exists vars(info_count)]} { + set info_count $vars(info_count) + } else { + set info_count 0 + } + + if {$vars(place_opt_design) && $vars(enable_flexilm)} { + set warnings($warning_count) "Feature vars(place_opt_design) not support for top level implementation when vars(enable_flexilm) is true" + incr warning_count + } + + if {[info exists vars(power_analysis_view)]} { + if {[lsearch [concat $vars(setup_analysis_views) $vars(hold_analysis_views)] $vars(power_analysis_view)] == -1} { + append commands "# ERROR: Power analysis view $vars(power_analysis_view) is not a defined view\n" + set errors($error_count) "Power analysis view $vars(power_analysis_view) is not a defined view" + incr error_count + } + } + + set valid [list trial_ipo giga_opt proto_net_delay_model] + if {[lsearch $valid [string tolower $vars(budget_mode)]] == -1} { + append commands "# ERROR: Variable vars(budget_mode) has illegal value $vars(budget_mode)\n" + set errors($error_count) "Variable vars(budget_mode) has illegal value $vars(budget_mode)" + incr error_count + append commands "# Must be one of '$valid'\n" + } + if {[info exists vars(cts_engine)]} { + if {[string tolower $vars(cts_engine)] == "ccoptdesign"} { + set vars(cts_engine) ccopt + } + if {[string tolower $vars(cts_engine)] == "clockdesign"} { + set vars(cts_engine) cts + } + set valid [list cts ccopt ccopt_cts] + if {[lsearch $valid [string tolower $vars(cts_engine)]] == -1} { + append commands "# ERROR: Variable vars(cts_engine) has illegal value $vars(cts_engine)\n" + set errors($error_count) "Variable vars(cts_engine) has illegal value $vars(cts_engine)" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } + +# if {[info exists vars(cts_spec)]} { +# append commands "# INFO: Variable cts_spec defined so set cts_engine to cts\n" +# set infos($info_count) "Variable cts_spec defined so set cts_engine to cts" +# incr info_count +# set vars(cts_engine) cts +# foreach file $vars(cts_spec) { +# lappend check(files) $file +# } +# append commands "# INFO: cts_spec = $vars(cts_spec)\n" +# } + + if {[info exists vars(ccopt_integration)]} { + set valid {scripted native} + if {[lsearch $valid $vars(ccopt_integration)] == -1} { + append commands "# ERROR: Variable vars(cts_engine) has illegal value $vars(cts_engine)\n" + set errors($error_count) "Variable vars(cts_engine) has illegal value $vars(cts_engine)" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } else { + # Default to native integration + set vars(ccopt_integration) "native" + } + if {[lindex [split $vars(version) "."] 0] > 10} { + foreach var [array names vars] { + set save_vars($var) $vars($var) + if {[info exists tvars($var)]} { + set vars($var) $tvars($var) + } + } + } + + set commands "" + + set check(files) [list] + set check(integers) [list] + + + if {![info exists vars(abort)]} { + set vars(abort) 0 + } + + if {[info exists vars(check_vars)] && $vars(check_vars)} { + source $vars(script_root)/ETC/INNOVUS/check_vars.tcl + } + + append commands "# ==============================================\n" + append commands "# Required Variables\n" + append commands "# ==============================================\n" + set count 0 + foreach required "fp_tcl_file fp_file def_files" { + if {!$vars(rc)} { + # BCL: Only check for vars(def_files) if not in RC mode + if {[info exists vars($required)] && ($vars($required) != "")} { + if {$required == "def_files"} { + set first 1 + # BCL: Added subst around vars(def_files) to resolve vars(rundir) + foreach file [subst $vars(def_files)] { + if {$first == 1} { + append commands "# INFO: $required = $file\n" + set first 0 + } else { + append commands "# INFO: $file" + } + if {!$vars(rc)} { + lappend check(files) $file + } + } + } else { + lappend check(files) $vars($required) + append commands "# INFO: $required = $vars($required)\n" + } + incr count + } + } + } + if {[info exists vars(fp_tcl_proc)]} { + append commands "# INFO: fp_tcl_proc = $vars(fp_tcl_proc)\n" + incr count + } + + if {[info exists vars(oa_fp)]} { + if {[llength $vars(oa_fp)] == 3} { + append commands "# INFO: oa_fp = $vars(oa_fp)\n" + incr count + } else { + append commands "# ERROR: OA floorplan variable (oa_fp) should be 'lib cell view'" + set errors($error_count) "OA floorplan variable (oa_fp) should be 'lib cell view'" + incr error_count + } + } else { + if {$count == 0} { + append commands "# WARNING: Neither fp_file, def_files, fp_tcl_file, fp_tcl_proc are defined\n" + set warnings($warning_count) "Either fp_file, def_files, fp_tcl_file, fp_tcl_proc should be defined" + incr warning_count + } + } + + if {[string compare -nocase $vars(netlist_type) "verilog"]>=0} { + # BCL: Note - This code removed as the RC Foundation Flow will set vars(def_netlist) when it + # isn't defined in the user's setup.tcl + #if {$vars(rc) && ![info exists vars(netlist)]} { + # set vars(netlist) $vars(dbs_dir)/$vars(design).syn_placed.v.gz + #} + if {!$vars(rc)} { + # BCL: Only check for vars(netlist) if not in RC mode + if {[info exists vars(netlist)]} { + # BCL: Added subst around vars(netlist) + foreach file [subst $vars(netlist)] { + if {!$vars(rc)} { + lappend check(files) $file + } + } + append commands "# INFO: netlist = $vars(netlist)\n" + } else { + if {($vars(netlist_type) == "Verilog")} { + append commands "# ERROR: A verilog netlist file must be defined\n" + set errors($error_count) "A verilog netlist file must be defined" + incr error_count + } + } + } + } elseif {[string compare -nocase $vars(netlist_type) "oa"]==0} { + append commands "# INFO: netlist_type = $vars(netlist_type)\n" + foreach required "oa_ref_lib oa_design_lib oa_design_cell oa_design_view" { + if {[info exists vars($required)] && ($vars($required) != "")} { + append commands "# INFO: $required = $vars($required)\n" + } else { + append commands "# ERROR: Variable $required must be defined when netlist_type is open access" + set errors($error_count) "Variable $required must be defined when netlist_type is open access" + incr error_count + } + } + } + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append commands "# INFO: dbs_format = $vars(dbs_format)\n" + foreach required "oa_ref_lib oa_design_lib oa_abstract_name oa_layout_name" { + if {[info exists vars($required)] && ($vars($required) != "")} { + append commands "# INFO: $required = $vars($required)\n" + } else { + append commands "# ERROR: Variable $required must be defined when dbs_format is open access" + set errors($error_count) "Variable $required must be defined when dbs_format is open access" + incr error_count + } + } + } + if {[info exists vars(enable_lvs)] && $vars(enable_lvs)} { + if {[string compare -nocase $vars(dbs_format) "oa"]!=0} { + append commands "# WARNING: Variable enable_lvs is only allowed when dbs_format is open access" + set warnings($warning_count) "Variable enable_lvs is only allowed when dbs_format is open access" + incr warning_count + set vars(enable_lvs) false + } + } +# if {[info exists vars(netlist)]} { +# foreach file $vars(netlist) { +# lappend check(files) $file +# } +# } else { +# if {$vars(netlist_type) == "Verilog"} { +# append commands "# ERROR: A verilog netlist file must be defined\n" +# set errors($error_count) "A verilog netlist file must be defined" +# incr error_count +# +# } +# } + + if {[info exists vars(cts_spec)] && ($vars(cts_engine) == "ccopt")} { + append commands "# ERROR: Variable cts_spec defined and cts_engine is set to ccopt\n" + set errors($error_count) "Variable cts_spec defined and cts_engine is set to ccopt" + incr error_count + foreach file $vars(cts_spec) { + lappend check(files) $file + } + } + +# if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { +# set required_list "flow process library_sets rc_corners delay_corners" +# } else { + set required_list "flow process library_sets rc_corners delay_corners setup_analysis_views \ + hold_analysis_views active_setup_views active_hold_views default_setup_view default_hold_view" +# } + + foreach required $required_list { + if {[info exists vars($required)] && ($vars($required) != "")} { + append commands "# INFO: $required = $vars($required)\n" + if {$required == "flow"} { + if {([info exists vars(partition_list)] || ($vars(ilm_list) != "")) && ($vars(flow) != "mmmc")} { + append commands "# ERROR: Flow variable vars(flow) must be \"mmmc\" when ILMs are defined\n" + set errors($error_count) "# ERROR: Flow variable vars(flow) must be \"mmmc\" when ILMs are defined" + incr error_count + } + } + } + } + +# if {![info exists vars(view_definition_tcl)]} { + append commands "# ==============================================\n" + append commands "# Library Sets\n" + append commands "# ==============================================\n" + foreach library_set $vars(library_sets) { + append commands "# INFO: $library_set:\n" + foreach required "timing" { + if {[info exists vars($library_set,$required)] && ($vars($library_set,$required) != "")} { + append commands "# INFO: $required = \n" + foreach lib $vars($library_set,$required) { + # lappend check(files) $lib + append commands "# INFO: $lib\n" + } + } else { + if {[FF::is_lp_flow]} { + append commands "# WARNING: Variable vars($library_set,$required) not defined\n" + set warnings($warning_count) "Variable vars($library_set,$required) not defined" + incr warning_count + } else { + append commands "# ERROR: Required variable vars($library_set,$required) not defined or empty\n" + set errors($error_count) "Required variable vars($library_set,$required) not defined or empty" + incr error_count + } + } + } + if {[info exists vars($library_set,aocv)]} { + foreach file $vars($library_set,aocv) { + if {![file exists $file]} { + append commands "# WARNING: AOCV table file does not exist ($file)\n" + set warnings($warning_count) "AOCV table file does not exist ($file)" + incr warning_count + } + } + } else { + if {$vars(enable_aocv)} { + append commands "# WARNING: AOCV enabled, but table not provided for $library_set\n" + set warnings($warning_count) "AOCV enabled, but table not provided for $library_set" + incr warning_count + + } + } + if {[info exists vars($library_set,socv)]} { + foreach file $vars($library_set,socv) { + if {![file exists $file]} { + append commands "# WARNING: SOCV table file does not exist ($file)\n" + set warnings($warning_count) "SOCV table file does not exist ($file)" + incr warning_count + } + } + } else { + if {$vars(enable_socv)} { + append commands "# WARNING: SOCV enabled, but table not provided for $library_set\n" + set warnings($warning_count) "SOCV enabled, but table not provided for $library_set" + incr warning_count + + } + } + if {[info exists vars($library_set,si)]} { + foreach file $vars($library_set,si) { + if {![file exists $file]} { + append commands "# WARNING: CDB file does not exist ($file)\n" + set warnings($warning_count) "CDB file does not exist ($file)" + incr warning_count + } + } + } + } +# } + + append commands "# ==============================================\n" + append commands "# LEF Files\n" + append commands "# ==============================================\n" + if {[info exists vars(lef_files)]} { + foreach file $vars(lef_files) { + # lappend check(files) $file + append commands "# INFO: $file\n" + } + } else { + if {([string tolower $vars(netlist_type)] == "verilog") && (![info exists vars(oa_ref_lib)])} { + append commands "# ERROR: Required variable vars(lef_files) not defined\n" + set errors($error_count) "Required variable vars(lef_files) not defined" + incr error_count + } + } + + if {[info exists vars(partition_list)]} { + append commands "# ==============================================\n" + append commands "# Hierarchical \n" + append commands "# ==============================================\n" + append commands "# INFO: partitions = $vars(partition_list)\n" + set cts_spec [FF::get_by_suffix vars ",cts_spec"] + if {$cts_spec != ""} { + append commands "# CTS Specs : \n" + foreach partition $cts_spec { + lappend check(files) $vars($partition,cts_spec) + append commands "# $partition -> $vars($partition,cts_spec)\n" + } + } + set latency_sdc [FF::get_by_suffix vars ",latency_sdc"] + if {$latency_sdc != ""} { + append commands "# Latency SDCs :\n" + foreach partition $latency_sdc { + lappend check(files) $vars($partition,latency_sdc) + if {[llength [split $partition ","]] == 1} { + append commands "# $partition -> $vars($partition,latency_sdc)\n" + } else { + append commands "# [lindex [split $partition ","] 0] ([lindex [split $partition ","] 1]) -> $vars($partition,latency_sdc)\n" + } + } + } + } + if {[info exists vars(enable_pac)] && $vars(enable_pac)} { + append commands "# WARNING: PAC is obsolete and will be removed in a future version. Consider using Sign-off ECO." + set warnings($warning_count) "PAC is obsolete and will be removed in a future version. Consider using Sign-off ECO." + incr warning_count + set pac_mode [FF::get_by_suffix vars ",pac_mode"] + if {$pac_mode != ""} { + set pac_list [list "read_only" "interface" "ilm" "all"] + foreach pac $pac_mode { + if {[lsearch $pac_list $vars($pac,pac_mode)] == -1} { + append commands "# ERROR: $pac pac_mode invalid value; must be one of \'$pac_list\'\n" + set errors($error_count) "$pac pac_mode invalid value; must be one of \'$pac_list\'" + incr error_count + + } + } + } + } + if {[FF::is_lp_flow]} { + append commands "# ==============================================\n" + append commands "# Low Power \n" + append commands "# ==============================================\n" + if {[info exists vars(ieee1801_file)]} { + set warnings($warning_count) "Using vars(ieee1801_file) requires the following limited access feature : mvsSupportIEEE1801" + incr warning_count + } + set num_power_intent_files 0 + foreach v {cpf_file ieee1801_file} { + if {[info exists vars($v)]} { + append commands "# INFO: $v = $vars($v)\n" + lappend check(files) $vars($v) + incr num_power_intent_files + } + } + if {$num_power_intent_files > 1} { + set errors($error_count) "vars(cpf_file) and vars(ieee1801_file) may not both be specified." + append commands "# ERROR: $errors($error_count)\n" + incr error_count + } + + if {[info exists vars(power_domains)] && ($vars(power_domains) != "")} { + append commands "# INFO: power_domains = $vars(power_domains)\n" + foreach domain $vars(power_domains) { + set print($domain) 1 + foreach optional "filler_cells tie_cells endcaps welltaps" { + if {[info exists vars($domain,$optional)] && ($vars($domain,$optional) != "")} { + if {$print($domain)} { + append commands "# INFO: $domain:\n" + set print($domain) 0 + } + append commands "# INFO: $optional = $vars($domain,$optional)\n" + } +# if {$optional == "filler_cells} { +# set process [regsub "nm" $vars(process) ""] +# if {[expr $process <= 28)] && [info exists vars(filler_cells,min_gap)]} { +# append commands "# ERROR: For process node < 28nm, variable vars(filler_cells,min_gap) is required\n" +# set errors($error_count) "For process node < 28nm, variable vars(filler_cells,min_gap) is required" +# incr error_count +# } +# } + } + } + } else { + append commands "# WARNING: Recommended variable vars(power_domains) not defined\n" + set warnings($warning_count) "Recommended variable vars(power_domains) not defined" + incr warning_count + } + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + append commands "# INFO: power_analysis_view = $vars(power_analysis_view)\n" + } else { + append commands "# WARNING: Recommended variable vars(power_analysis_view) not defined\n" + append commands "# Will default to the default setup analysis view\n" + set warnings($warning_count) "Recommended variable vars(power_analysis_view) not defined" + incr warning_count + } + } + +# if {![info exists vars(view_definition_tcl)]} { + append commands "# ==============================================\n" + append commands "# RC Corners\n" + append commands "# ==============================================\n" + set check(rc_corners) [list] + foreach rc_corner $vars(rc_corners) { + append commands "# INFO: $rc_corner:\n" + if {[info exists vars($rc_corner,cap_table)] && ($vars($rc_corner,cap_table) != "")} { + append commands "# INFO: cap_table = $vars($rc_corner,cap_table)\n" + lappend check(rc_corners) $vars($rc_corner,cap_table) + } else { + if {![info exists vars($rc_corner,qx_tech_file)]} { + append commands "# ERROR: Variable vars($rc_corner,cap_table) or vars($rc_corner,qx_tech_file) must be defined\n" + set errors($error_count) "Variable vars($rc_corner,cap_table) or vars($rc_corner,qx_tech_file) must be defined" + incr error_count + } else { + if {[lindex [split $vars(version) "."] 0] < 15} { + append commands "# INFO: Variable vars($rc_corner,cap_table) not defined\n" + set infos($info_count) "Variable vars($rc_corner,cap_table) not defined" + incr info_count + } + } + } +# if {$vars(cts_engine) != "cts"} { +# if {[info exists vars($rc_corner,atf_file)] && ($vars($rc_corner,atf_file) != "")} { +# append commands "# INFO: atf_file = $vars($rc_corner,atf_file)\n" +# lappend check(rc_corners) $vars($rc_corner,atf_file) +# } else { +# append commands "# WARNING: Recommended variable vars($rc_corner,atf_file) not defined\n" +# set warnings($warning_count) "Recommended variable vars($rc_corner,atf_file) not defined" +# incr warning_count +# } +# } + if {[info exists vars($rc_corner,T)] && ($vars($rc_corner,T) != "")} { + append commands "# INFO: temperature = $vars($rc_corner,T)\n" + lappend check(integers) "$rc_corner,T" + } else { + append commands "# WARNING: Recommended variable vars($rc_corner,T) not defined\n" + set warnings($warning_count) "Recommended variable vars($rc_corner,T) not defined" + incr warning_count + } + if {[info exists vars($rc_corner,qx_tech_file)] && ($vars($rc_corner,qx_tech_file) != "")} { + append commands "# INFO: qx_tech_file = $vars($rc_corner,qx_tech_file)\n" + lappend check(rc_corners) $vars($rc_corner,qx_tech_file) + } else { + if {[info exists vars(postroute_extraction_effort)] && ($vars(postroute_extraction_effort) != "low")} { + append commands "# ERROR: qx_tech_file not defined for $rc_corner and postroute_extraction_effort is set to $vars(postroute_extraction_effort)\n" + set errors($error_count) "qx_tech_file not defined for $rc_corner and postroute_extraction_effort is set to $vars(postroute_extraction_effort)" + incr error_count + } + if {[info exists vars(signoff_extraction_effort)] && ($vars(signoff_extraction_effort) != "low")} { + append commands "# ERROR: qx_tech_file not defined for $rc_corner and signoff_extraction_effort is set to $vars(signoff_extraction_effort)\n" + set errors($error_count) "qx_tech_file not defined for $rc_corner and signoff_extraction_effort is set to $vars(signoff_extraction_effort)" + # set errors($error_count) "Required variable vars($rc_corner,cap_table) not defined" + incr error_count + } + } + } + + if {[info exists vars(opconds)]} { + append commands "# ==============================================\n" + append commands "# Operating Conditions\n" + append commands "# ==============================================\n" + foreach opcond $vars(opconds) { + append commands "# INFO: $opcond:\n" + foreach required "library_file P V T" { + if {[info exists vars($opcond,$required)] && ($vars($opcond,$required) != "")} { + append commands "# INFO: $required = $vars($opcond,$required)\n" + } else { + append commands "# ERROR: Required variable vars($opcond,$required) not defined\n" + set errors($error_count) "Required variable vars($opcond,$required) not defined" + incr error_count + } + } + } + } + + append commands "# ==============================================\n" + append commands "# Delay Corners\n" + append commands "# ==============================================\n" + set good_corners [list] + foreach delay_corner $vars(delay_corners) { + set args 0 + append commands "# INFO: $delay_corner:\n" + if {[info exists vars($delay_corner,rc_corner)] && ($vars($delay_corner,rc_corner) != "")} { + append commands "# INFO: rc_corner = $vars($delay_corner,rc_corner)\n" + incr args + } else { + append commands "# ERROR: Required variable vars($delay_corner,rc_corner) not defined\n" + set errors($error_count) "Required variable vars($delay_corner,rc_corner) not defined" + incr error_count + } + + if {(![FF::is_lp_flow]) || ([FF::is_lp_flow] && !$vars(cpf_timing))} { + if {[info exists vars($delay_corner,library_set)] && ($vars($delay_corner,library_set) != "")} { + append commands "# INFO: library_set = $vars($delay_corner,library_set)\n" + incr args + } else { + foreach additional "early_library_set late_library_set" { + if {[info exists vars($delay_corner,$additional)] && ($vars($delay_corner,$additional) != "")} { + append commands "# INFO: $additional = $vars($delay_corner,$additional)\n" + incr args + } else { + append commands "# ERROR: Required variable vars($delay_corner,library_set) and vars($delay_corner,$additional) not defined\n" + set errors($error_count) "Required variable vars($delay_corner,library_set) and vars($delay_corner,$additional) not defined\n" + incr error_count + } + } + } + } + foreach optional "opcond opcond_library early_opcond_library late_opcond_library" { + if {[info exists vars($delay_corner,$optional)] && ($vars($delay_corner,$optional) != "")} { + incr args + append commands "# INFO: $optional = $vars($delay_corner,$optional)\n" + } + } + foreach optional "power_domains" { + if {[info exists vars($delay_corner,$optional)] && ($vars($delay_corner,$optional) != "")} { + append commands "# INFO: $optional = $vars($delay_corner,$optional)\n" + } + } + if {!$vars(cpf_timing) && ($args > 1)} { + lappend good_corners $delay_corner + } else { + if {$args > 0} { + lappend good_corners $delay_corner + } + } + } + + set vars(good_corners) $good_corners + + set check(constraint_modes) [list] + if {[FF::is_lp_flow]} { + append commands "# ==============================================\n" + append commands "# Constraint Modes\n" + append commands "# ==============================================\n" + if {[info exists vars(constraint_modes)]} { + foreach mode $vars(constraint_modes) { + append commands "# INFO: $mode:\n" + foreach other "pre_cts_sdc incr_cts_sdc post_cts_sdc" { + if {[info exists vars($mode,$other)] && ($vars($mode,$other) != "")} { + append commands "# INFO: $other = $vars($mode,$other)\n" + lappend check(constraint_modes) $vars($mode,$other) + } else { + if {!$vars(cpf_timing)} { + if {($other == "pre_cts_sdc") && $vars(rc)} { + set vars($mode,$other) $vars(dbs_dir)/$vars(design).syn_placed.$mode.sdc + } elseif {($other == "pre_cts_sdc") && !$vars(rc)} { + append commands "# ERROR: Variable vars($mode,$other) not defined\n" + set errors($error_count) "Variable vars($mode,$other) not defined" + incr error_count + } else { + if {($other == "pre_cts_sdc") || (($other == "post_cts_sdc") && ![info exists vars($mode,incr_cts_sdc)])} { + append commands "# INFO: Variable vars($mode,$other) not defined\n" + } + + } + } else { + append commands "# INFO: Variable vars($mode,$other) not defined\n" + } + } + } + } + } else { + append commands "# INFO: No constraint mode information defined\n" + append commands "# Post CTS latency adjustment must be\n" + append commands "# managed by the user via plug-ins\n" + } + } else { + append commands "# ==============================================\n" + append commands "# Constraint Modes\n" + append commands "# ==============================================\n" + if {$vars(rc)} { + set required_list "synth_sdc pre_cts_sdc" + } else { + set required_list "pre_cts_sdc" + } + foreach mode $vars(constraint_modes) { + set found 0 + append commands "# INFO: $mode:\n" + foreach required $required_list { + if {[info exists vars($mode,$required)] && ($vars($mode,$required) != "")} { + append commands "# INFO: $required = $vars($mode,$required)\n" + lappend check(constraint_modes) $vars($mode,$required) + incr found + } else { + if {[llength $required_list] == 1} { + append commands "# ERROR: Required variable vars($mode,$required) not defined\n" + set errors($error_count) "Required variable vars($mode,$required) not defined" + incr error_count + } + } + } + if {([llength $required_list] > 1) && ($found == 0)} { + append commands "# ERROR: One of the required variables ($required_list) not defined\n" + set errors($error_count) "One of the required variables ($required_list) not defined" + incr error_count + } + foreach other "post_cts_sdc incr_cts_sdc" { + if {$other == "post_cts_sdc" && ![info exists vars($other)]} { + if {![info exists vars($mode,$other)]} { + append commands "# INFO: Variable vars($mode,$other) not defined\n" + } else { + append commands "# INFO: $other = $vars($mode,$other)\n" + } + } else { + if {[info exists vars($mode,$other)] && ($vars($mode,$other) != "")} { + append commands "# INFO: $other = $vars($mode,$other)\n" + lappend check(constraint_modes) $vars($mode,$other) + } else { + append commands "# INFO: Variable vars($mode,$other) not defined\n" + } + } + } + } + } + + if {![info exists vars(hold_analysis_views)]} { + set vars(hold_analysis_views) "" + } + if {![info exists vars(power_analysis_view)]} { + set vars(power_analysis_view) "" + } + append commands "# ==============================================\n" + append commands "# Analysis Views\n" + append commands "# ==============================================\n" + if {[FF::is_lp_flow]} { + foreach analysis_view [concat $vars(setup_analysis_views) $vars(hold_analysis_views) $vars(power_analysis_view)] { + append commands "# INFO: $analysis_view:\n" + foreach other "delay_corner constraint_mode" { + if {[info exists vars($analysis_view,$other)] && ($vars($analysis_view,$other) != "")} { + append commands "# INFO: $other = $vars($analysis_view,$other)\n" + lappend check(analysis_view) $vars($analysis_view,$other) + } + } + } + } else { + set check(analysis_views) [list] + foreach analysis_view [concat $vars(setup_analysis_views) $vars(hold_analysis_views) $vars(power_analysis_view)] { + append commands "# INFO: $analysis_view:\n" + foreach required "delay_corner constraint_mode" { + if {[info exists vars($analysis_view,$required)] && ($vars($analysis_view,$required) != "")} { + append commands "# INFO: $required = $vars($analysis_view,$required)\n" + lappend check(analysis_view) $vars($analysis_view,$required) + } else { + append commands "# ERROR: Required variable vars($analysis_view,$required) not defined\n" + set errors($error_count) "Required variable vars($analysis_view,$required) not defined" + incr error_count + } + } + } + } +# } + + append commands "# ==============================================\n" + append commands "# Recommended Variables\n" + append commands "# ==============================================\n" + foreach recommended "scan_def gds_layer_map" { + if {[info exists vars($recommended)] && ($vars($recommended) != "")} { + lappend check(files) $vars($recommended) + append commands "# INFO: $recommended = $vars($recommended)\n" + } + } + if {[info exists vars(gds_files)] && ($vars(gds_files) != "")} { + append commands "# INFO: gds_files = $vars(gds_files)\n" + foreach file $vars(gds_files) { + lappend check(files) $file + } + } + + foreach recommended "max_route_layer filler_cells tie_cells dont_use_list antenna_diode" { + if {[info exists vars($recommended)] && ($vars($recommended) != "")} { + append commands "# INFO: $recommended = $vars($recommended)\n" + if {$recommended == "tie_cells"} { + if {[llength $vars(tie_cells)] > 2} { + append commands "# ERROR: Recommended variable vars($recommended) has more than two cells\n" + set errors($error_count) "Recommended variable vars($recommended) has more than two cells" + incr error_count + } + } + if {$recommended == "antenna_diode"} { + if {[llength $vars(antenna_diode)] > 1} { + append commands "# ERROR: Recommended variable vars($recommended) has more than one cells\n" + set errors($error_count) "Recommended variable vars($recommended) has more than one cells" + incr error_count + } + } + if {$recommended == "max_route_layer"} { + lappend check(integers) "$recommended" + } + } else { + if {($recommended == "dont_use_list")} { + if {![info exists vars(dont_use_file)]} { + append commands "# WARNING: Recommended variables dont_use_list and dont_use_file not defined\n" + set warnings($warning_count) "Recommended variables dont_use_list and dont_use_file not defined" + incr warning_count + } + } else { + append commands "# WARNING: Recommended variable vars($recommended) not defined\n" + set warnings($warning_count) "Recommended variable vars($recommended) not defined" + incr warning_count + } + } + } + foreach optional "size_only_file dont_use_file" { + if {[info exists vars($optional)]} { + lappend check(files) $vars($optional) + } + } + + append commands "# ==============================================\n" + append commands "# Other Variables\n" + append commands "# ==============================================\n" + foreach other "jtag_cells jtag_rows spare_cells" { + if {[info exists vars($other)] && ($vars($other) != "")} { + append commands "# INFO: $other = $vars($other)\n" + } else { + append commands "# INFO: Variable vars($other) not defined\n" + } + } + +# if {![info exists vars(view_definition_tcl)]} { + append commands "# ==============================================\n" + append commands "# Scale Factors\n" + append commands "# ==============================================\n" + foreach rc_corner $vars(rc_corners) { + set i 0 + append commands "# INFO: $rc_corner:\n" + if {[info exists vars($rc_corner,scale_tcl)]} { + if {[file exists $vars($rc_corner,scale_tcl)]} { + incr i + append commands "# INFO: scaling file = $vars($rc_corner,scale_tcl)\n" + } else { + puts " ERROR: Scaling file $vars($rc_corner,scale_tcl) for rc corner $rc_corner defined but does not exist" + set errors($error_count) "Scaling file $vars($rc_corner,scale_tcl) for rc corner $rc_corner defined but does not exist" + incr error_count + } + } else { + foreach other "pre_route_res_factor post_route_res_factor \ + pre_route_cap_factor post_route_cap_factor \ + pre_route_clk_res_factor post_route_clk_res_factor \ + pre_route_clk_cap_factor post_route_clk_cap_factor \ + post_route_xcap_factor" { + if {[info exists vars($rc_corner,$other)]} { + append commands "# INFO: $other = $vars($rc_corner,$other)\n" + incr i + } + } + } + if {$i == 0} { + append commands "# WARNING: No scale factors set for rc corner ($rc_corner)\n" + set warnings($warning_count) "No scale factors set for rc corner ($rc_corner)" + incr warning_count + } + } + + append commands "# ==============================================\n" + append commands "# Derating Factors\n" + append commands "# ==============================================\n" + set i 0 + if {[info exists vars(derate_tcl)]} { + append commands "# INFO: derate file = $vars(derate_tcl)\n" + lappend check(files) $vars(derate_tcl) + incr i + } else { + foreach delay_corner $vars(delay_corners) { + append commands "# INFO: $delay_corner:\n" + if {[info exists vars($delay_corner,derate_tcl)]} { + append commands "# INFO: derate file = $vars($delay_corner,derate_tcl)\n" + lappend check(files) $vars($delay_corner,derate_tcl) + incr i + } else { + if {[info exists vars(derate_tcl)]} { + append commands "# INFO: derate file = $vars(derate_tcl)\n" + lappend check(files) $vars(derate_tcl) + } else { + foreach other "early_data_cell early_clock_cell early_cell_check \ + late_data_cell late_clock_cell late_cell_check \ + data_cell_early clock_cell_early cell_check_early \ + data_cell_late clock_cell_late cell_check_late" { + if {[info exists vars($delay_corner,$other)]} { + append commands "# INFO: $other = $vars($delay_corner,$other)\n" + incr i + } + } + } + } + if {$i == 0} { + append commands "# WARNING: No derating factors set for delay corner ($delay_corner)\n" + set warnings($warning_count) "No derating factors set for delay corner ($delay_corner)" + incr warning_count + } + } + } +# } + if {![regexp "9.1" $vars(version)]} { + + set valid "TRUE FALSE true false auto" + + if {[info exists vars(enable_si_aware)]} { + if {[lsearch $valid $vars(enable_si_aware)] == -1} { + append commands "# ERROR: Variable vars(enable_si_aware) has illegal value\n" + set errors($error_count) "Variable vars(enable_si_aware) has illegal value" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } + } + +# set valid "postcts postroute postroute_si true false" +# foreach var "fix_hold" { +# if {[lsearch $valid [string tolower $vars($var)]] == -1} { +# append commands "# ERROR: Variable vars($var) has illegal value $vars($var)\n" +# set errors($error_count) "Variable vars($var) has illegal value $vars($var)" +# incr error_count +# append commands "# Must be one of '$valid'\n" +# } +# } + + + set valid [list true false] + foreach var "fix_hold_ignore_ios fix_hold_allow_tns_degradation" { + if {![info exists vars($var)]} { + continue + } + if {[lsearch $valid [string tolower $vars($var)]] == -1} { + append commands "# ERROR: Variable vars($var) has illegal value $vars($var)\n" + set errors($error_count) "Variable vars($var) has illegal value $vars($var)" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } + + set valid "pre_place pre_prects pre_cts pre_postcts pre_postroute pre_postroute_si pre_signoff true false" + foreach option "metalfill enable_ocv enable_ss" { + if {[info exists vars($option)]} { + if {[lsearch $valid $vars($option)] == -1} { + append commands "# ERROR: Variable vars($option) has illegal value ($vars($option))\n" + set errors($error_count) "Variable vars($option) has illegal value ($vars($option))" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } + } + + set pacs [FF::get_by_suffix vars ",pac_mode"] + set valid "read_only interface all" + + foreach pac $pacs { + if {[info exists vars(pac_mode)]} { + if {[lsearch $valid $vars(pac_mode)] == -1} { + append commands "# ERROR: Variable vars(pac_mode) has illegal value\n" + set errors($error_count) "Variable vars(pac_mode) has illegal value" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } + } + + set valid "default pessimistic" + + if {[info exists vars(si_analysis_type)]} { + if {[lsearch $valid $vars(si_analysis_type)] == -1} { + append commands "# ERROR: Variable vars(si_analysis_type) has illegal value\n" + set errors($error_count) "Variable vars(si_analysis_type) has illegal value" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } + + set valid "post_cts post_route both none" + + if {[info exists vars(clock_eco)]} { + if {[lsearch $valid $vars(clock_eco)] == -1} { + append commands "# ERROR: Variable vars(clock_eco) has illegal value\n" + set errors($error_count) "Variable vars(clock_eco) has illegal value" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } +# if {$vars(enable_flexilm)} { +# set warnings($warning_count) "Using vars(enable_flexilm) requires the following limited access feature : encFlexILM" +# incr warning_count +# if {$vars(place_opt_design)} { +# set warnings($warning_count) "Variable vars(place_opt_design) not supported when vars(enable_flexilm) is true" +# incr warning_count +# } +# } + if {$vars(use_flexmodels) && $vars(flexmodel_prototype)} { + set valid [list flat multi_level top_to_bottom] + if {[info exists vars(flexmodel_prototype_flow_style)]} { + if {[lsearch $valid $vars(flexmodel_prototype_flow_style)] == -1} { + append commands "# ERROR: Variable vars(flexmodel_prototype_flow_style) has illegal value ($vars(flexmodel_prototype_flow_style))\n" + set errors($error_count) "Variable vars(flexmodel_prototype_flow_style) has illegal value ($vars(flexmodel_prototype_flow_style))" + incr error_count + append commands "# Must be one of '$valid'\n" + } + } + } + + set check(plugins) [list] + if {[info exists vars(metalfill)] && ($vars(metalfill) != false)} { + set check(plugins) metalfill_tcl + } + append commands "# ==============================================\n" + append commands "# Plug-ins\n" + append commands "# ==============================================\n" + set rc_plugins "syn_init_tcl syn_load_rtl_tcl pre_syn_load_lib_tcl post_syn_load_lib_tcl \ + pre_syn_elab_tcl post_syn_elab_tcl syn_dft_setup_tcl pre_syn_gen_tcl \ + post_syn_gen_tcl pre_syn_map_tcl post_syn_map_tcl post_syn_dft_tcl \ + pre_syn_incr_tcl post_syn_incr_tcl pre_syn_place_tcl postload_syn_place_tcl \ + preexport_syn_place_tcl preannotation_syn_place_tcl post_syn_place_tcl pre_syn_exit_tcl" + set edi_plugins "always_source_tcl pre_init_tcl post_init_tcl \ + pre_place_tcl place_tcl post_place_tcl pre_cts_tcl cts_tcl post_cts_tcl \ + pre_prects_tcl post_prects_tcl pre_postcts_tcl post_postcts_tcl \ + pre_postcts_hold_tcl post_postcts_hold_tcl pre_route_tcl post_route_tcl \ + pre_postroute_tcl post_postroute_tcl pre_postroute_hold_tcl post_postroute_hold_tcl \ + pre_postroute_si_tcl post_postroute_si_tcl pre_postroute_si_hold_tcl + post_postroute_si_hold_tcl pre_signoff_tcl post_signoff_tcl \ + pre_rebudget_tcl post_rebudget_tcl pre_flexilm_tcl post_flexilm_tcl \ + pre_assemble_tcl post_assemble_tcl pre_prototype_tcl post_prototype_tcl pre_model_gen_tcl post_model_gen_tcl \ + pre_partition_place_tcl post_partition_place_tcl pre_assemble_flex_ilm_tcl post_assemble_flexilm_tcl" + + if {$vars(rc)} { + set plugin_list [join [concat $rc_plugins $edi_plugins]] + } else { + set plugin_list $edi_plugins + } + foreach plugin $plugin_list { + if {[info exists vars($plugin)] && ($vars($plugin) != "")} { + append commands "# INFO: Plug-in $plugin = $vars($plugin)\n" + lappend check(plugins) $plugin + lappend vars(plugins_defined) $plugin + } + } + + set dist(lsf) "queue resource args" + set dist(custom) "script" + set dist(rsh) "host_list" + set dist(local) "" + + if {[info exists vars(distribute)]} { + if {[info exists dist($vars(distribute))]} { + append commands "# ==============================================\n" + append commands "# Distribution Setup\n" + append commands "# ==============================================\n" + append commands "# INFO: Mode = $vars(distribute)\n" + foreach option $dist($vars(distribute)) { + if {![info exists vars($vars(distribute),$option)]} { + append commands "# ERROR: Required variable vars($vars(distribute),$option) not defined\n" + set errors($error_count) "Required variable vars($vars(distribute),$option) not defined" + incr error_count + } else { + append commands "# INFO: $option = $vars($vars(distribute),$option)\n" + } + } + } else { + append commands "# ERROR: Distribution mode $vars(distribute) not supported\n" + set errors($error_count) "Distribution mode $vars(distribute) not supported" + incr error_count + } + } else { + if {[info exists vars(hosts)] && ($vars(hosts) > 1)} { + append commands "#WARNING: Variable vars(hosts) > 1 but vars(distribute) not defined\n" + set warnings($warning_count) "Variable vars(hosts) > 1 but vars(distribute) not defined" + incr warning_count + } + } + + append commands "# ==============================================\n" + append commands "# Type Check\n" + append commands "# ==============================================\n" + foreach integer $check(integers) { + if {![string is integer -strict $vars($integer)]} { + append commands "# ERROR: Variables is not an integer ($integer) ...\n" + set errors($error_count) "Variables is not an integer ($integer) ..." + incr error_count + } + } + append commands "# ==============================================\n" + append commands "# File Check\n" + append commands "# ==============================================\n" + set files 0 + append commands "# INFO: Checking design files ...\n" + foreach file $check(files) { + # append commands "# INFO: $file ...\n" + if {![file exists $file]} { + append commands "# ERROR: File does not exist ($file) ...\n" + set errors($error_count) "File does not exist ($file)" + incr error_count + } else { + incr files + } + } + append commands "# INFO: ... found $files files\n" + set files 0 + append commands "# INFO: Checking LEF files ...\n" + if {[info exists vars(lef_files)]} { + foreach file $vars(lef_files) { + if {![file exists $file]} { + append commands "# ERROR: File does not exist ($file)\n" + set errors($error_count) "File does not exist ($file)" + incr error_count + } else { + incr files + } + } + append commands "# INFO: ... found ($files/[llength $vars(lef_files)]) lef files\n" + } + set files 0 + set total 0 +# if {![info exists vars(view_definition_tcl)]} { +# if {![info exists vars(cpf_file)]} { + append commands "# INFO: Checking library sets ...\n" + foreach library_set $vars(library_sets) { +# if {[info exists vars(enable_ldb)] && $vars(enable_ldb)} { +# set temp_list $vars($library_set,timing,orig) +# } else { + set temp_list $vars($library_set,timing) +# } + foreach file $temp_list { + incr total + if {![file exists $file]} { + append commands "# ERROR: File does not exist ($file)\n" +# set errors($error_count) "File does not exist ($file)" +# incr error_count + } else { + incr files + } + } + if {[info exists vars($library_set,si)]} { + foreach file $vars($library_set,si) { + incr total + if {![file exists $file]} { + append commands "# WARNING: CDB file does not exist ($file)\n" +# set warnings($warning_count) "CDB file does not exist ($file)" +# incr warning_count + } else { + incr files + } + } + } else { + if {!$vars(enable_si_aware)} { + append commands "# WARNING: CDB libraries not defined for $library_set library set\n" + set warnings($warning_count) "CDB libraries not defined for $library_set library set" + incr warning_count + } + } + } + append commands "# INFO: ... found ($files/$total) library files\n" + if {$total != $files} { + set errors($error_count) "[expr $total - $files] timing library files were not found " + incr error_count + } + set files 0 +# } + append commands "# INFO: Checking rc corners ...\n" + foreach file $check(rc_corners) { + if {![file exists $file]} { + append commands "# ERROR: File does not exist ($file)\n" + set errors($error_count) "File does not exist ($file)" + incr error_count + } else { + incr files + } + } + append commands "# INFO: ... found $files files\n" + set files 0 + append commands "# INFO: Checking constraint modes ...\n" + foreach file_list $check(constraint_modes) { + foreach file $file_list { + if {![file exists $file]} { + if {![info exists vars(cpf_file)] || ([info exists vars(cpf_file)] && !$vars(cpf_timing))} { + append commands "# ERROR: File does not exist ($file)\n" + set errors($error_count) "File does not exist ($file)" + incr error_count + } + } else { + incr files + } + } + } +# } + append commands "# INFO: ... found $files files\n" + set files 0 + append commands "# INFO: Checking plugin files ...\n" + foreach plug $check(plugins) { + set file $vars($plug) + if {![file exists $file] && ![file exists $vars(plug_dir)/$file]} { + append commands "# WARNING: File does not exist ($file) ... continuing\n" + lappend vars(missing_plugins) $plug + } else { + lappend vars(plugins_found) $plug + incr files + if {!$vars(enable_celtic_steps)} { + if {[regexp "postroute_si" $plug]} { + append warnings($warning_count) "Plug-in $plug will be skipped for siAware flow" + incr warning_count + append commands "# WARNING: Plug-in $plug will be skipped for siAware flow\n" + append commands "# To enable celtic based SI flow, use vars(enable_celtic_steps)\n" + } + } + } + } + append commands "# INFO: ... found $files files\n" + + append commands "# =====================================================\n" + append commands "# Flow Options\n" + append commands "# =====================================================\n" + if {[info exists vars(partition_list)]} { + set flow hierarchical + } else { + set flow flat + } + set valid [list none default standard express extreme] + if {[lsearch $valid [string tolower $vars(flow_effort)]] == -1} { + append commands "# ERROR: Variable vars(flow_effort) has illegal value $vars(flow_effort)\n" + set errors($error_count) "Variable vars(flow_effort) has illegal value $vars(flow_effort)" + incr error_count + append commands "# Must be one of '$valid'\n" + } else { + if {([string tolower $vars(flow_effort)] == "none") || ([string tolower $vars(flow_effort)] == "default")} { + append warnings($warning_count) "Changing vars(flow_effort) from '$vars(flow_effort)' to 'standard'" + incr warning_count + set vars(flow_effort) standard + } + } + set valid [list none low high] + if {[lsearch $valid [string tolower $vars(power_effort)]] == -1} { + append commands "# ERROR: Variable vars(power_effort) has illegal value $vars(power_effort)\n" + set errors($error_count) "Variable vars(power_effort) has illegal value $vars(power_effort)" + incr error_count + append commands "# Must be one of '$valid'\n" + } + append commands "# Flow = $flow\n" + append commands "# Power = $vars(power_effort)\n" + append commands "# Flavor = $vars(flow)\n" + append commands "# Effort = $vars(flow_effort)\n" + append commands "# -----------------------------------------------------\n" + append commands "# Placement Options\n" + append commands "# -----------------------------------------------------\n" + if {[info exists vars(place_opt_design)]} { + append commands "# Place Opt Design = $vars(place_opt_design)\n" + } + if {[info exists vars(in_place_opt)]} { + append commands "# In Place Opt = $vars(in_place_opt)\n" + } + if {[info exists vars(no_pre_place_opt)]} { + append commands "# No PrePlace Opt = $vars(no_pre_place_opt)\n" + } + if {[info exists vars(place_io_pins)]} { + append commands "# Place IO Pins = $vars(place_io_pins)\n" + } + if {[info exists vars(clock_gate_aware)]} { + append commands "# Clock Gate Aware = $vars(clock_gate_aware)\n" + } + if {[info exists vars(congestion_effort)]} { + if {$vars(congestion_effort) == "none"} { + unset vars(congestion_effort) + } else { + append commands "# Congestion Effort = $vars(congestion_effort)\n" + } + } + append commands "# -----------------------------------------------------\n" + append commands "# Clock Tree Options\n" + append commands "# -----------------------------------------------------\n" + append commands "# Route Clock Nets = $vars(route_clock_nets)\n" + if {[info exists vars(clock_eco)]} { + append commands "# Clock ECO = $vars(clock_eco)\n" + } + append commands "# -----------------------------------------------------\n" + append commands "# Optimization Options\n" + append commands "# -----------------------------------------------------\n" + if {[info exists vars(leakage_effort)]} { + append commands "# Leakage Effort = $vars(leakage_effort)\n" + } + if {[info exists vars(preserve_assertions)]} { + append commands "# Preserve Assertions = $vars(preserve_assertions)\n" + } + if {[info exists vars(useful_skew)]} { + append commands "# Useful Skew = $vars(useful_skew)\n" + } + if {[info exists vars(critical_range)]} { + append commands "# Critical Range = $vars(critical_range)\n" + } + if {[info exists vars(all_end_points)]} { + append commands "# All End Points = $vars(all_end_points)\n" + } + if {[info exists vars(size_only_file)]} { + append commands "# Size Only File = $vars(size_only_file)\n" + } + if {[info exists vars(dont_use_file)]} { + append commands "# Don't Use File = $vars(dont_use_file)\n" + } + if {[info exists vars(skew_buffers)]} { + append commands "# Skew Buffers = $vars(skew_buffers)\n" + } + if {[info exists vars(enable_pac)]} { + append commands "# Enable PAC = $vars(enable_pac)\n" + if {[info exists vars(partition_list)]} { + foreach pac $vars(partition_list) { + if {[info exists vars($pac,pac_mode)]} { + append commands "# $pac -> $vars($pac,pac_mode)\n" + } + } + } + } + append commands "# -----------------------------------------------------\n" + append commands "# Hold Fixing Options\n" + append commands "# -----------------------------------------------------\n" + append commands "# Fix Hold = $vars(fix_hold)\n" + if {[info exists vars(fix_hold_effort)]} { + append commands "# Fix Hold Effort = $vars(fix_hold_effort)\n" + } + if {[info exists vars(fix_hold_ignore_ios)]} { + append commands "# Ignore IOs = $vars(fix_hold_ignore_ios)\n" + } + if {[info exists vars(fix_hold_allow_tns_degradation)]} { + append commands "# Allow TNS Degradation = $vars(fix_hold_allow_tns_degradation)\n" + } + append commands "# -----------------------------------------------------\n" + append commands "# Timing Options\n" + append commands "# -----------------------------------------------------\n" + append commands "# Enable CPPR = $vars(enable_cppr)\n" + append commands "# Enable OCV = $vars(enable_ocv)\n" + append commands "# Enable AOCV = $vars(enable_aocv)\n" + append commands "# Enable SOCV = $vars(enable_socv)\n" + append commands "# Enable SS = $vars(enable_ss)\n" + append commands "# -----------------------------------------------------\n" + append commands "# Routing Options\n" + append commands "# -----------------------------------------------------\n" + if {[info exists vars(track_opt)]} { + append commands "# In Route Optimization = $vars(track_opt)\n" +# if {$vars(track_opt)} { +# set vars(enable_si_aware) true +# if {![info exists vars(tquantus_file)]} { +# set errors($error_count) "tQuantus file - vars(tquantus_file) - required when vars(track_opt) set to true" +# incr error_count +# } +# } + } + if {[info exists vars(multi_cut_effort)]} { + append commands "# Multi-Cut Effort = $vars(multi_cut_effort)\n" + } + if {[info exists vars(litho_driven_routing)]} { + append commands "# Litho Driven Routing = $vars(litho_driven_routing)\n" + } + if {[info exists vars(antenna_diode)] && ($vars(antenna_diode) != "")} { + append commands "# Antenna Diode = $vars(antenna_diode)\n" + } + if {[info exists vars(relative_c_thresh)] || \ + [info exists vars(total_c_thresh)] || \ + [info exists vars(coupling_c_thresh)] ||\ + [info exists vars(postroute_extraction_effort)] ||\ + [info exists vars(signoff_extraction_effort)]} { + append commands "# -----------------------------------------------------\n" + append commands "# Extraction Options\n" + append commands "# -----------------------------------------------------\n" + } + if {[info exists vars(relative_c_thresh)]} { + append commands "# Relative C Threshold = $vars(relative_c_thresh)\n" + } + if {[info exists vars(total_c_thresh)]} { + append commands "# Total C Threshold = $vars(total_c_thresh)\n" + } + if {[info exists vars(coupling_c_thresh)]} { + append commands "# Coupling C Threshold = $vars(coupling_c_thresh)\n" + } + if {[info exists vars(postroute_extraction_effort)]} { + append commands "# Postroute Effort Level = $vars(postroute_extraction_effort)\n" + } + if {[info exists vars(signoff_extraction_effort)]} { + append commands "# Signoff Effort Level = $vars(signoff_extraction_effort)\n" + } + + append commands "# -----------------------------------------------------\n" + append commands "# DFM Options\n" + append commands "# -----------------------------------------------------\n" + set check_lpa_tech 0 + set check_lpa_conf 0 + if {[info exists vars(fix_litho)] && $vars(fix_litho)} { + append commands "# Fix Litho = $vars(fix_litho)\n" + set check_lpa_conf 1 + set vars(verify_litho) true + } + if {[info exists vars(verify_litho)] && $vars(verify_litho)} { + append commands "# Verify Litho = $vars(verify_litho)\n" + set check_lpa_tech 1 + } + if {[info exists vars(lpa_tech_file)]} { + append commands "# LPA Tech File = $vars(lpa_tech_file)\n" + } + if {$check_lpa_tech} { + if {![info exists vars(lpa_tech_file)]} { + set errors($error_count) "LPA tech file not defined ..." + incr error_count + } + } + if {[info exists vars(lpa_conf_file)]} { + append commands "# LPA Conf File = $vars(lpa_conf_file)\n" + } + if {$check_lpa_conf} { + if {![info exists vars(lpa_conf_file)]} { + set errors($error_count) "LPA conf file not defined ..." + incr error_count + } + } + append commands "# -----------------------------------------------------\n" + append commands "# Signal Integrity Options\n" + append commands "# -----------------------------------------------------\n" + append commands "# Process = $vars(process)\n" + if {[info exists vars(delta_delay_threshold)]} { + append commands "# Delta Delay Threshold = $vars(delta_delay_threshold)\n" + } + if {[info exists vars(celtic_settings)]} { + append commands "# Celtic Settings = $vars(celtic_settings)\n" + } + if {[info exists vars(si_analysis_type)]} { + append commands "# Analysis Type = $vars(si_analysis_type)\n" + } + if {[info exists vars(acceptable_wns)]} { + append commands "# Analysis Type = $vars(acceptable_wns)\n" + } + + if {[info exists vars(distribute)]} { + if {[info exists dist($vars(distribute))]} { + append commands "# -----------------------------------------------------\n" + append commands "# Multiple CPUs\n" + append commands "# -----------------------------------------------------\n" + append commands "# Mode = $vars(distribute)\n" + if {[info exists vars(local_cpus)]} { + append commands "# CPUs On Local Host = $vars(local_cpus)\n" + } + if {[info exists vars(remote_hosts)]} { + append commands "# Number of Remote Hosts = $vars(remote_hosts)\n" + } + if {[info exists vars(cpus_per_remote_host)]} { + append commands "# CPUs Per Remote Host = $vars(cpus_per_remote_host)\n" + } + } + } else { + if {[info exists vars(local_cpus)]} { + append commands "# -----------------------------------------------------\n" + append commands "# Multiple CPUs\n" + append commands "# -----------------------------------------------------\n" + append commands "# CPUs On Local Host = $vars(local_cpus)\n" + } + } + if {$vars(high_timing_effort)} { + if {[lindex [split $vars(version) "."] 0] < 15} { + append commands "# -----------------------------------------------------\n" + append commands "# <<< HIGH EFFORT FLOW ENABLED >>>\n" + append commands "# -----------------------------------------------------\n" + } else { + append commands "# WARNING: Variable vars(high_timing_effort) not supported anymore. Please use vars(flow_effort).\n" + set warnings($warning_count) "Variable vars(high_timing_effort) not supported anymore. Please use vars(flow_effort)." + incr warning_count + } + } + + append commands "# =====================================================\n" + append commands "# Abort on Setup Error = $vars(abort)\n" + append commands "# =====================================================\n" + + if {[lindex [split $vars(version) "."] 0] > 10} { + foreach var [array names save_vars] { + set vars($var) $save_vars($var) + } + } + + set command "" + set vars(info_count) $info_count + if {$info_count > 0} { + append command "# -----------------------------------------------------\n" + append command "# Info Summary\n" + append command "# -----------------------------------------------------\n" + + for {set i 0} {$i<$info_count} {incr i} { + append command "# ([expr $i + 1]) $infos($i)\n" + } + append command "# -----------------------------------------------------\n" + + append commands $command + } + set vars(warning_count) $warning_count + if {$warning_count > 0} { + append command "# -----------------------------------------------------\n" + append command "# Warning Summary\n" + append command "# -----------------------------------------------------\n" + + for {set i 0} {$i<$warning_count} {incr i} { + append command "# ([expr $i + 1]) $warnings($i)\n" + } + append command "# -----------------------------------------------------\n" + + append commands $command + } + set vars(error_count) $error_count + if {$error_count > 0} { + append command "# -----------------------------------------------------\n" + append command "# Error Summary\n" + append command "# -----------------------------------------------------\n" + + for {set i 0} {$i<$error_count} {incr i} { + append command "# ([expr $i + 1]) $errors($i)\n" + } + append command "# -----------------------------------------------------\n" + + append commands $command + + } else { + append commands "# SETUP CHECK PASSED\n" + append commands "# =====================================================\n" + } + + file mkdir $vars(script_dir) + set op [open $vars(script_dir)/check.rpt w] + + puts $op $commands + + close $op + + if {$vars(abort) && ($error_count > 0)} { + puts " Aborting due to previous errors ..." + puts " See $vars(script_dir)/check.rpt for details" + puts "" + puts " Error Summary" + puts " -------------" + + for {set i 0} {$i<$error_count} {incr i} { + puts " ([expr $i + 1]) $errors($i)" + } + puts "-------------------------------------------------" + exit -1 + } + + if {!$vars(codegen)} { + if {![FF::is_lp_flow]} { + return + } + set vars(required_procs) "get_clock_ports get_power_domains modify_power_domains add_power_switches \ + route_secondary_pg_nets buffer_always_on_nets insert_welltaps_endcaps" + } + + set vars(check_setup) 0 + + # Record errors for later processing + set vars(check_setup_errors) {} + for {set i 0} {$i<$error_count} {incr i} { + lappend vars(check_setup_errors) $errors($i) + } + } + + ############################################################################### + # Procedure to determine flow flavor, check for ilms, etc. + ############################################################################### + + proc check_flow {} { + + global vars + + set vars(ilm) 0 + set vars(top) 0 + + if {![info exists vars(partition_list)] || ([info exists vars(partition_list)] && \ + ([file tail [file dirname [pwd]]] != "$vars(partition_dir)"))} { + + if {![info exists vars(partition_list)]} { + set vars(flavor) flat + if {![info exists vars(mode)]} { + set vars(mode) "flat" + } + } else { + set vars(flavor) hier + if {![info exists vars(mode)]} { + set vars(mode) "top_down" + } + } + + if {[info exists vars(partition_list)] && ($vars(mode) == "bottom_up")} { + set vars(ilm) 1 + } + + if {[info exists vars(ilm_list)] && ($vars(ilm_list) != "")} { + set vars(ilm) 1 + } else { + set vars(ilm) 0 + } + + } else { + if {[info exists vars(partition_list)]} { + set ptn [file tail [pwd]] + set vars(ptn) $ptn + if {([file tail [file dirname [pwd]]] == "$vars(partition_dir)") && + ([lsearch $vars(partition_list) $ptn] == -1)} { + set vars(ilm) 1 + set vars(top) 1 +# FF_EDI::normalize_constraints + } + } + } + if {$vars(debug)} { + puts " Flow -> $vars(flavor) : Step -> $vars(step) : ILM -> $vars(ilm)" + } + } + + proc run_compile {} { + + global vars + + file mkdir $vars(script_dir)/INNOVUS + set op [open $vars(script_dir)/INNOVUS/run_compile.tcl w] + + set commands "" + + if {![info exists vars(ldb_dir)]} { + set vars(ldb_dir) LDB + } + file mkdir $vars(ldb_dir) + set done_list [list] + + foreach set $vars(library_sets) { + set file_list [list] + foreach file $vars($set,timing) { + if {[lsearch $done_list $file] == -1} { + append commands "write_ldb -library $file -outfile $vars(ldb_dir)/[file tail $file.ldb]\n" + lappend done_list $file + } + lappend file_list $vars(ldb_dir)/[file tail $file].ldb + } + set vars($set,timing,orig) $vars($set,timing) + set vars($set,timing) $file_list + } + + puts $op "$commands\nexit\n" + close $op + + set vars(ran_compile) 1 + } + + + # Generate the command to verify geometry. This is verifyGeometry + # for traditional processes, verify_drc for 20nm and below. + proc verify_geometry_command {} { + global vars + set process [regsub "nm" $vars(process) ""] + if {([lindex [split $vars(version) "."] 0] > 16) || (([lindex [split $vars(version) "."] 0] == 16) && ([lindex [split $vars(version) "."] 1] > 1))} { + return "verify_drc" + } else { + if {$process > 28} { + return "verifyGeometry" + } else { + return "verify_drc" + } + } + } + + ############################################################################### + # Procedure to initialize the foundation flow + ############################################################################### + + proc initialize_flow {} { + global vars + global env + + set commands "" + + FF_EDI::seed_variables 1 + FF_EDI::check_setup + + if {[info exist env(VPATH)]} { + file mkdir $env(VPATH) + } + + if {[info exists vars(capture_metrics)] && $vars(capture_metrics)} { + if {[lindex [split $vars(version) "."] 0] < 14} { + append commands "\n#-------------------------------------------------------------\n" + append commands "# Loading applets for metrics capture ...\n" + append commands "#-------------------------------------------------------------\n" + if {[file tail [file dirname [exec pwd]]] == $vars(partition_dir)} { + append commands "source $vars(norm_script_path)/ETC/applet.tcl\n" + append commands "source $vars(norm_script_path)/ETC/compatibility.tcl\n" + append commands "set_attribute applet_search_path $vars(norm_script_path)/ETC/applets /\n" + } else { + append commands "source \$vars(script_path)/ETC/applet.tcl\n" + append commands "source \$vars(script_path)/ETC/compatibility.tcl\n" + append commands "set_attribute applet_search_path \$vars(script_path)/ETC/applets /\n" + } + append commands "applet load measure\n" + append commands "applet load time_info\n" + append commands "#-------------------------------------------------------------\n\n" + append commands "if {\[file exists $vars(time_info_db)\]} {\n" + append commands " time_info -quiet -table ff_ext -load $vars(time_info_db)\n" + append commands "}\n" + append commands "#-------------------------------------------------------------\n\n" + } + } + + +# append commands "#---------------------------------------------------------------------\n" +# append commands "# RUN SCRIPT FOR STEP '[string toupper $vars(step)]'\n" +# append commands "#---------------------------------------------------------------------\n" + if {$vars(report_system_info)} { + append commands "ff_procs::system_info\n" + } + append commands [FF_EDI::initialize_multicpu] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc load_design {step {current_step ""} {format 1}} { + + global env + global vars + global errors + + global warnings + + if {[info exists vars(hier)]} { + set hier true + } else { + set hier false + } + + if {$current_step == ""} { + set current_step $step + } + +# if {$step ==""} { +# set step $vars(step) +# } +# if {![info exists vars(step)]} { +# set vars(step) $step +# } + if {!$vars(codegen)} { + set restore_design true + } + set design $vars(design) + + if {[regexp "^syn" $current_step]} { + return "\nread_db $vars(dbs_dir)/$step.db\n" + } + + # Build restore_design command string + # ... check first for starting_dbs + # ... if not we need to know the design name as this may be a + # recursive call in a hierarhical flow + if {[info exists vars($current_step,starting_dbs)]} { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + # Interpret the starting DBS as an OA triple + set restore_command "[list restoreDesign -cellview $vars($current_step,starting_dbs)]\n" + } else { + if {[file isdirectory $vars($current_step,starting_dbs)]} { + set restore_command "restoreDesign $vars($current_step,starting_dbs) $design\n" + } elseif {[file exists $vars($current_step,starting_dbs)]} { + set restore_command "restoreDesign $vars($current_step,starting_dbs).dat $design\n" + } else { + puts " Starting DBS ($vars($current_step,starting_dbs)) defined but does not exist" + set restore_command "restoreDesign $vars($current_step,starting_dbs).dat $design\n" + set warnings($vars(warning_count)) "Starting DBS ($vars($current_step,starting_dbs)) defined but does not exist" + incr vars(warning_count) + } + } + } else { + # BCL: Added subst around vars(dbs_dir) to resolve vars(rundir) + set dir [subst $vars(dbs_dir)] + # Adding this for PV ... + if {!$vars(codegen)} { + if {[file exists $dir/$step.enc]} { + # BCL: Changed "DBS" to $dir + if {![catch {set foo [glob $dir/$step.enc.dat/*.conf]}]} { + # BCL: Changed "DBS" to $dir + regsub "\\\.conf" [glob $dir/$step.enc.dat/*.conf] "" temp + } else { + # BCL: Changed "DBS" to $dir + if {![catch {set foo [glob $dir/$step.enc.dat/*.globals]}]} { + # BCL: Changed "DBS" to $dir + regsub "\\\.globals" [glob $dir/$step.enc.dat/*.globals] "" temp + } + } + if {$design != [file tail $temp]} { + set vars(design) [file tail $temp] + Puts " Updating design name to $design" + if {[info exists vars(partition_list)]} { + if {[lsearch $vars(partition_list) [file tail [pwd]]] != -1} { + set design [file tail [pwd]] + } + } + } + } else { + Puts " Starting DBS $dir/$step.enc defined but does not exist" + exit -1 + } + } + + # Of course, the command will depend on the database format ... and the version + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + if {$hier} { + set restore_command "restoreDesign -cellview \[list $vars(oa_partition_lib) $design $step\]\n" + } else { + set restore_command "restoreDesign -cellview \[list $vars(oa_design_lib) $design $step\]\n" + } + } else { + set restore_command "restoreOaDesign $vars(oa_design_lib) $design $step\n" + } + } else { + if {$vars(user_mode) == "hier" && ($vars(hier_flow_type) == "2pass")} { + if {$vars(step) == "cts" && $vars(enable_flexilm)} { + if {([lsearch $vars(partition_list) $vars(design)] != -1)} { + set restore_command "restoreDesign ${design}_postECO.enc.dat $design\n" + } else { + set restore_command "restoreDesign . $design\n" + } + } elseif {([lsearch [FF::adjust_steps] $vars(step)] == [expr [lsearch [FF::adjust_steps] cts]+1]) && !$vars(enable_flexilm)} { + set restore_command "restoreDesign . $design\n" + } else { + set restore_command "restoreDesign $dir/$step.enc.dat $design\n" + } + } else { + if {$vars(step) != "partition_place"} { + set restore_command "restoreDesign $dir/$step.enc.dat $design\n" + } else { + if {$vars(use_flexmodels)} { + set restore_command "restoreDesign $dir/$step.enc.dat $design\n" + } else { + return "" + } + } + } + } + } + # Pass the command through the wrapper and then make it conditional so it can + # be disabled in a single process flow + set restore_command [FF::wrap_command $current_step,restore_design $restore_command] + set cond_restore_command "if {\$vars(restore_design)} { $restore_command }" + + if {!$format} { + if {$vars(codegen)} { + return $cond_restore_command + } else { + eval $cond_restore_command + } + } else { + if {$vars(catch_errors)} { + append commands "\nif {\$vars(restore_design)} {\n" + append commands " if {\[catch {\n$restore_command}\]} {\n" + append commands " Puts \" ERROR LOADING DATABASE FROM STEP $step ... EXITING\"\n" + append commands " exit -1\n" + append commands " }\n" + append commands "}\n" + } else { + append commands "\nif {\$vars(restore_design)} { [string trim $restore_command] }\n" + } + + if {$vars(capture_metrics)} { + append commands "\num::enable_metrics -on\n" +# if {![info exists vars(pushed)] || ([info exists vars(pushed)] && !$vars(pushed)) } { +# # GG1 +# append commands "um::push_snapshot_stack\n" +# set vars(pushed) true +# } + } + + append commands [FF::source_plug always_source_tcl] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + } + + ############################################################################ + # Setup procedure for run* steps + ############################################################################ + + proc initialize_step {step} { + + global vars + global env + global errors + global warnings + + if {![info exists step]} { + set step $vars(step) + } + + if {[info exists vars($step,rpt_dir)]} { + set vars(rpt_dir) $vars($step,rpt_dir) + file mkdir $vars($step,rpt_dir) + } else { + set vars(rpt_dir) $vars(orig_rpt_dir) + } + + set vars($step,commands) "" + + if {![info exists vars(warning_count)]} { + set vars(warning_count) 0 + } + if {![info exists vars(error_count)]} { + set vars(error_count) 0 + } + + set commands "" + if {$vars(verbose)} { + append commands "#\n" + append commands "# STEP $step\n" + append commands "#\n" + } + +# if {$vars(enable_qor_check)} { +# set qor [catch {exec $check_qor $env(VPATH)/$last_step} msg] +# if {$qor} { +# puts " ERROR: QOR RESULT CHECK INDICATES A PROBLEM IN STEP $last_step" +# exit -111 +# } +# } + set update_setup 0 + set update_hold 0 + + set command "" + if {[info exists vars($step,active_setup_views)] && ([llength $vars($step,active_setup_views)]>0)} { + append command "set setup_analysis_views \"$vars($step,active_setup_views)\"\n" + set update_setup 1 + } + if {[info exists vars($step,active_hold_views)] && ([llength $vars($step,active_hold_views)]>0)} { + append command "set hold_analysis_views \"$vars($step,active_hold_views)\"\n" + set update_hold 1 + } + + set comments "" + append comments "# The active analysis views are controlled by the following variables:\n" + append comments "#---------------------------------------------------------------------\n" + append comments "# - vars($step,active_setup_views)\n" + append comments "# - vars($step,active_hold_views)\n" + append comments "#\n" + append comments "######################################################################\n" + if {$update_setup || $update_hold} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# UPDATING ANALYSIS VIEWS ...\n" + append commands "#\n" + } + if {!$update_setup && $update_hold} { +# append command "set_analysis_view -setup \[all_setup_analysis_views\] -hold \[list \$hold_analysis_views\]\n" + append command "set_analysis_view -setup \[all_setup_analysis_views\] -hold \$hold_analysis_views\n" + } + if {$update_setup && !$update_hold} { + append command "set_analysis_view -setup \$setup_analysis_views -hold \[all_hold_analysis_views\]\n" + } + if {$update_setup && $update_hold} { +# append command "set_analysis_view -setup \[list \$setup_analysis_views\] -hold \[list \$hold_analysis_views\]\n" + append command "set_analysis_view -setup \$setup_analysis_views -hold \$hold_analysis_views\n" + } + append commands $comments + append commands "$command\n" + } else { + append comments "# set_analysis_view -setup \$vars($step,active_setup_views) -hold \$vars($step,active_hold_views)\n" + append comments "#\n" + append commands $comments + } + + ######################################################################### + # Check if in top level partition (ilm) flow + ######################################################################### + + FF_EDI::check_flow + +# if {$vars(report_run_time)} { +# append commands "set vars($step,start_time) \[clock seconds\]\n" +# } + + ######################################################################### + # Load the recommended command mode settings for step + ######################################################################### + +# append commands "#\n" +# append commands "# DEFINING MODE SETTINGS\n" +# append commands "#\n" + + set comments "" + set ucomments "" + + switch $step { + + "place" { + ################################################################### + # Set placement options ... + # - Set optimization options if inPlaceOpt is enabled + # - Load the CTS spec for clock gate aware placement + # - Place JTAG cells if requested + ################################################################### + + append commands [lindex [FF_EDI::set_design_mode] 0] + append comments [lindex [FF_EDI::set_design_mode] 1] + append ucomments [lindex [FF_EDI::set_design_mode] 2] + + set args "" + if {$vars(flow) == "mmmc"} { + if {($vars(enable_ocv) == "pre_place") || (($vars(enable_ocv) == "pre_prects") && ($vars(place_opt_design) || $vars(preroute_opt_design)))} { + append comments "# - vars(enable_ocv)\n" + append args "-analysisType onChipVariation " + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "-aocv true " + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "-socv true " + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"$vars(enable_ocv)\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + } + if {$args != ""} { + set command "setAnalysisMode $args\n" + append commands [FF::wrap_command prects,set_analysis_mode $command] + } + if {$vars(enable_ss) == "pre_place"} { + append comments "# - vars(enable_ss)\n" + set command "setDelayCalMode -engine signalStorm\n" + append commands [FF::wrap_command place,set_delay_cal_mode $command] + } else { + append ucomments "# - vars(enable_ss) \"pre_place\"\n" + } + + set args "" + if {![catch {set arg $vars(congestion_effort)}]} { + append args " -place_global_cong_effort $arg" + append comments "# - vars(congestion_effort)\n" + } else { + append ucomments "# - vars(congestion_effort) \"auto low medium high\"\n" + } +# if {[info exists vars(clock_gate_aware)] && $vars(clock_gate_aware)} { +# append comments "# - vars(clock_gate_aware)\n" +# append args " -place_global_clock_gate_aware true" +# } + if {![catch {set arg $vars(clock_gate_aware)}]} { + append comments "# - vars(clock_gate_aware)\n" + append args " -place_global_clock_gate_aware $arg" + } else { + append ucomments "# - vars(clock_gate_aware) \"true\"\n" + } + if {![catch {set arg $vars(place_io_pins)}]} { + append comments "# - vars(place_io_pins)\n" + append args " -place_global_place_io_pins $arg" + } else { + append ucomments "# - vars(place_io_pins) \"true\"\n" + } +# set process [regsub "nm" $vars(process) ""] +# if {[expr $process < 28] && [info exists vars(filler_cells,min_gap)]} { +# append comments "# - vars(filler_cells,min_gap)\n" +# append args " -fillerGapMinGap $vars(filler_cells,min_gap) -fillerGapEffort high\n" +# } else { +# append ucomments "# - vars(filler_cells,min_gap) \"\"\n" +# append ucomments "# - vars(filler_cells,gap_effort) \" \"\n" +# } + + if {$args != ""} { + set command "setPlaceMode $args\n" + append commands [FF::wrap_command place,set_place_mode $command] + } + + set args "" +# if {![catch {set arg $vars(size_only_file)}]} { +# append comments "# - vars(size_only_file)\n" +# append args " -sizeOnlyFile $arg" +# } else { +# append ucomments "# - vars(size_only_file) \"\"\n" +# } + if {([info exists vars(in_place_opt)] && $vars(in_place_opt)) || $vars(place_opt_design)} { + if {![catch {set arg $vars(size_only_file)}]} { + append comments "# - vars(size_only_file)\n" + append args " -sizeOnlyFile $arg" + } else { + append ucomments "# - vars(size_only_file) \"\"\n" + } + append comments "# - vars(in_place_opt)\n" +# set args "" + if {[lindex [split $vars(version) "."] 0] < 17} { + if {![catch {set arg $vars(preserve_assertions)}]} { + append comments "# - vars(preserve_assertions)\n" + append args " -preserveAssertions $arg" + } else { + append ucomments "# - vars(preserve_assertions) \"true\"\n" + } + } + if {![catch {set arg $vars(leakage_power_effort)}]} { + append comments "# - vars(leakage_power_effort)\n" + append args " -leakagePowerEffort $arg" + } else { + append ucomments "# - vars(leakage_power_effort) \"low or high\"\n" + } + if {![catch {set arg $vars(dynamic_power_effort)}]} { + append comments "# - vars(dynamic_power_effort)\n" + append args " -dynamicPowerEffort $arg" + } else { + append ucomments "# - vars(dynamic_power_effort) \"low or high\"\n" + } + if {![catch {set arg $vars(clock_gate_aware_opt)}]} { + append comments "# - vars(clock_gate_aware_opt)\n" + append args " -clkGateAware $arg" + } else { + append ucomments "# - vars(clock_gate_aware_opt) \"true\"\n" + } + if {![catch {set arg $vars(critical_range)}]} { + append comments "# - vars(critical_range)\n" + append args " -criticalRange $arg" + } + if {[info exists vars(all_end_points)] && $vars(all_end_points)} { + append comments "# - vars(all_end_points)\n" + append args " -allEndPoints true" + } else { + append ucomments "# - vars(all_end_points) \"true\"\n" + } + if {![catch {set arg $vars(fix_fanout_load)}]} { + append comments "# - vars(fix_fanout_load)\n" + append args " -fixFanoutLoad $arg" + } else { + append ucomments "# - vars(fix_fanout_load) \"\"\n" + } + if {![catch {set arg $vars(useful_skew)}]} { + if {$vars(ccopt_effort) == "low"} { + append comments "# - vars(useful_skew)\n" + append args " -usefulSkew $arg" + if {$vars(useful_skew) && ![catch {set arg $vars(skew_buffers)}]} { + append comments "# - vars(skew_buffers)\n" + set command "setUsefulSkewMode -delayPreCTS true -useCells \[list $arg\]\n" + append commands [FF::wrap_command prects,set_useful_skew_mode $command] + } + } else { + append commands "# Variable vars(useful_skew) ignored when vars(ccopt_effort) is $vars(ccopt_effort)\n" + set warnings($vars(warning_count)) "Variable vars(useful_skew) ignored when vars(ccopt_effort) is $vars(ccopt_effort)\n" + incr vars(warning_count) + } + } else { + append ucomments "# - vars(useful_skew) \"true\"\n" + append ucomments "# - vars(skew_buffers) \"\"\n" + } + } + if {$args != ""} { + set command "setOptMode $args\n" + append commands [FF::wrap_command place,set_opt_mode $command] + } + +# set command [FF_EDI::add_tie_cells true false] +# append commands [FF::wrap_command place,add_tie_cells $command] + + if {[info exists vars(cts_spec)]} { + set command "cleanupSpecifyClockTree\n" + append commands [FF::wrap_command place,cleanup_specify_clock_tree $command] + set command "" + foreach spec $vars(cts_spec) { + append command "specifyClockTree -file $spec\n" + } + append commands [FF::wrap_command place,specify_clock_tree $command] + } + + if {[info exists vars(jtag_cells)] && + [info exists vars(jtag_rows)]} { + append comments "# - vars(jtag_cells), vars(jtag_rows)\n" +# append commands "# PLACING JTAG CELLS\n" + set command "" + foreach inst $vars(jtag_cells) { + append command "specifyJtag -inst $inst\n" + } + append commands [FF::wrap_command place,specify_jtag $command] + set command "placeJtag -nrRow $vars(jtag_rows)\n" + append commands [FF::wrap_command place,place_jtag $command] + } + } + + "prects" { + ################################################################### + # Set optimization options ... + # Enable signalStorm if requested (required for ECSM/CCS flows) + # For low power flows, make sure always-on buffers are enabled + ################################################################### + + append commands [lindex [FF_EDI::set_design_mode] 0] + append comments [lindex [FF_EDI::set_design_mode] 1] + append ucomments [lindex [FF_EDI::set_design_mode] 2] + + set args "" + if {$vars(flow) == "mmmc"} { + if {$vars(enable_ocv) == "pre_prects"} { + append comments "# - vars(enable_ocv)\n" + append args "-analysisType onChipVariation " + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "-aocv true " + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "-socv true " + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_prects\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + } + if {$args != ""} { + set command "setAnalysisMode $args\n" + append commands [FF::wrap_command prects,set_analysis_mode $command] + } + if {[info exists vars(clock_gate_clone)] && $vars(clock_gate_clone)} { + if {([info exists vars(partition_list)])} { + if {[file tail [file dirname [pwd]]] == "$vars(partition_dir)"} { + set ptn [file tail [pwd]] + if {[info exists vars($ptn,cts_spec)]} { + set vars(cts_spec) $vars($ptn,cts_spec) + } + } + } + + set scommand "" + if {[info exists vars(cts_spec)]} { + set command "cleanupSpecifyClockTree\n" + append commands [FF::wrap_command prects,cleanup_specify_clock_tree $command] + foreach spec $vars(cts_spec) { + append scommand "specifyClockTree -file $spec\n" + } + } else { + set command "createClockTreeSpec\n" + append commands [FF::wrap_command prects,create_clock_tree_spec $command] + if {[info exists vars(cts_cells)]} { + append scommand "specifyClockTree -update \"AutoCTSRootPin * Buffer $vars(cts_cells)\"\n" + } + } + if {[info exists vars(route_clock_nets)] && $vars(route_clock_nets)} { + append scommand "specifyClockTree -update \"AutoCTSRootPin * RouteClkNet YES\"\n" + } + if {!$vars(ilm)} { + append commands [FF::wrap_command prects,specify_clock_tree $scommand] + } +# if {![info exists vars(cts_spec)]} { +# append commands "clockDesign -genSpecOnly \[pid\].ctstch\n" +# append commands "specifyClockTree -file \[pid\].ctstch\n" +# } else { +# foreach spec $vars(cts_spec) { +# append commands "specifyClockTree -file $spec\n" +# } +# } + } + + set args "" + if {[lindex [split $vars(version) "."] 0] < 17} { + if {![catch {set arg $vars(preserve_assertions)}]} { + append comments "# - vars(preserve_assertions)\n" + append args " -preserveAssertions $arg" + } else { + append ucomments "# - vars(preserve_assertions) \"true\"\n" + } + } + if {![catch {set arg $vars(leakage_power_effort)}]} { + append comments "# - vars(leakage_power_effort)\n" + append args " -leakagePowerEffort $arg" + } else { + append ucomments "# - vars(leakage_power_effort) \"low or high\"\n" + } + if {![catch {set arg $vars(dynamic_power_effort)}]} { + append comments "# - vars(dynamic_power_effort)\n" + append args " -dynamicPowerEffort $arg" + } else { + append ucomments "# - vars(dynamic_power_effort) \"low or high\"\n" + } + if {![catch {set arg $vars(clock_gate_aware_opt)}]} { + append comments "# - vars(clock_gate_aware_opt)\n" + append args " -clkGateAware $arg" + } else { + append ucomments "# - vars(clock_gate_aware_opt) \"true\"\n" + } + if {![catch {set arg $vars(critical_range)}]} { + append comments "# - vars(critical_range)\n" + append args " -criticalRange $arg" + } + if {[info exists vars(all_end_points)] && $vars(all_end_points)} { + append comments "# - vars(all_end_points)\n" + append args " -allEndPoints true" + } else { + append ucomments "# - vars(all_end_points) \"true\"\n" + } + if {![catch {set arg $vars(size_only_file)}]} { + append comments "# - vars(size_only_file)\n" + append args " -sizeOnlyFile $arg" + } else { + append ucomments "# - vars(size_only_file) \"\"\n" + } + if {![catch {set arg $vars(fix_fanout_load)}]} { + append comments "# - vars(fix_fanout_load)\n" + append args " -fixFanoutLoad $arg" + } else { + append ucomments "# - vars(fix_fanout_load) \"\"\n" + } + if {![catch {set arg $vars(useful_skew)}]} { + if {$vars(ccopt_effort) == "low"} { + append comments "# - vars(useful_skew)\n" + append args " -usefulSkew $arg" + if {$vars(useful_skew) && ![catch {set arg $vars(skew_buffers)}]} { + append comments "# - vars(skew_buffers)\n" + set command "setUsefulSkewMode -delayPreCTS true -useCells \[list $arg\]\n" + append commands [FF::wrap_command prects,set_useful_skew_mode $command] + } + } else { + append commands "# Variable vars(useful_skew) ignored when vars(ccopt_effort) is $vars(ccopt_effort)\n" + set warnings($vars(warning_count)) "Variable vars(useful_skew) ignored when vars(ccopt_effort) is $vars(ccopt_effort)\n" + incr vars(warning_count) + } + } else { + append ucomments "# - vars(useful_skew) \"true\"\n" + append ucomments "# - vars(skew_buffers) \"\"\n" + } + if {[FF::is_lp_flow]} { + if {![catch {set arg $vars(resize_shifter_and_iso_insts)}]} { + append comments "# - vars(resize_shifter_and_iso_insts)\n" + append args " -resizeShifterAndIsoInsts $arg" + } + } + if {$args != ""} { + set command "setOptMode $args\n" + append commands [FF::wrap_command prects,set_opt_mode $command] + } + + if {$vars(enable_ss) == "pre_prects"} { + append comments "# - vars(enable_ss)\n" + set command "setDelayCalMode -engine signalStorm\n" + append commands [FF::wrap_command prects,set_delay_cal_mode $command] + } else { + append ucomments "# - vars(enable_ss) \"pre_prects\"\n" + } + if {[FF::is_lp_flow]} { + set command "" + if {[info exists vars(always_on_buffers)]} { + append comments "# - vars(always_on_buffers)\n" + foreach buffer $vars(always_on_buffers) { + append command "setDontUse $buffer false\n" + } + } + foreach domain [FF::get_by_suffix vars ",always_on_buffers"] { + if {[info exists vars($domain,always_on_buffers)]} { + foreach buffer $vars($domain,always_on_buffers) { + append command "setDontUse $buffer false\n" + } + } + } + if {$command != ""} { + append commands [FF::wrap_command prects,set_dont_use $command] + } + } + } + + "cts" { + ################################################################### + # Set CTS options ... this includes nanoroute options as the clock + # net is typically routed during CTS. For hierarchical flows, the + # clock tree spec is defined per partition . + ################################################################### + + append commands [lindex [FF_EDI::set_design_mode] 0] + append comments [lindex [FF_EDI::set_design_mode] 1] + append ucomments [lindex [FF_EDI::set_design_mode] 2] + + set args "" + if {$vars(enable_ocv) == "pre_cts"} { + append comments "# - vars(enable_ocv)\n" + append args "-analysisType onChipVariation " + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "-aocv true " + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "-socv true " + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_cts\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + if {$args != ""} { + set command "setAnalysisMode $args\n" + append commands [FF::wrap_command cts,set_analysis_mode $command] + } + + set args "" + if {$vars(enable_cppr) != "false"} { + append comments "# - vars(enable_cppr)\n" + append args "-cppr $vars(enable_cppr) " + } else { + append ucomments "# - vars(enable_cppr)\n" + } + if {$args != ""} { + set command "setAnalysisMode $args\n" + append commands [FF::wrap_command cts,set_analysis_mode $command] + } + + set command "setCTSMode " + if {$vars(cts_engine) == "cts"} { + append comments "# - vars(cts_engine)\n" + append command " -engine ck" + } + if {![catch {set arg $vars(route_clock_nets)}]} { + append comments "# - vars(route_clock_nets)\n" + if {!$vars(route_clock_nets)} { + append command " -routeClkNet $arg" + } + } else { + append ucomments "# - vars(route_clock_nets)\n" + } + if {[info exists vars(clk_tree_top_layer)] && $vars(clk_tree_top_layer) != {}} { + append comments "# - vars(clk_tree_top_layer)\n" + append command " -routeTopPreferredLayer $vars(clk_tree_top_layer)" + } else { + append ucomments "# - vars(clk_tree_top_layer)\n" + } + if {[info exists vars(clk_leaf_top_layer)] && $vars(clk_leaf_top_layer) != {}} { + append comments "# - vars(clk_leaf_top_layer)\n" + append command " -routeLeafTopPreferredLayer $vars(clk_leaf_top_layer)" + } else { + append ucomments "# - vars(clk_leaf_top_layer)\n" + } + if {[info exists vars(clk_tree_bottom_layer)] && $vars(clk_tree_bottom_layer) != {}} { + append comments "# - vars(clk_tree_bottom_layer)\n" + append command " -routeBottomPreferredLayer $vars(clk_tree_bottom_layer)" + } else { + append ucomments "# - vars(clk_tree_bottom_layer)\n" + } + if {[info exists vars(clk_leaf_bottom_layer)] && $vars(clk_leaf_bottom_layer) != {}} { + append comments "# - vars(clk_leaf_bottom_layer)\n" + append command " -routeLeafBottomPreferredLayer $vars(clk_leaf_bottom_layer)" + } else { + append ucomments "# - vars(clk_leaf_bottom_layer)\n" + } + if {[info exists vars(clk_tree_ndr)] && $vars(clk_tree_ndr) != {}} { + append comments "# - vars(clk_tree_ndr)\n" + append command " -routeNonDefaultRule $vars(clk_tree_ndr)" + } else { + append ucomments "# - vars(clk_tree_ndr)\n" + } + if {[info exists vars(clk_tree_extra_space)] && $vars(clk_tree_extra_space) != {}} { + append comments "# - vars(clk_tree_extra_space)\n" + append command " -routePreferredExtraSpace $vars(clk_tree_extra_space)" + } else { + append ucomments "# - vars(clk_tree_extra_space)\n" + } + if {[info exists vars(clk_leaf_ndr)] && $vars(clk_leaf_ndr) != {}} { + append comments "# - vars(clk_leaf_ndr)\n" + append command " -routeLeafNonDefaultRule $vars(clk_leaf_ndr)" + } else { + append ucomments "# - vars(clk_leaf_ndr)\n" + } + if {[info exists vars(clk_leaf_extra_space)] && $vars(clk_leaf_extra_space) != {}} { + append comments "# - vars(clk_leaf_extra_space)\n" + append command " -routeLeafPreferredExtraSpace $vars(clk_leaf_extra_space)" + } else { + append ucomments "# - vars(clk_leaf_extra_space)\n" + } + if {$command != "setCTSMode "} { + append command "\n" + append commands [FF::wrap_command cts,set_cts_mode $command] + } + set command "" + if {[string tolower $vars(cts_engine)] != "cts"} { +# FF_EDI::assign_cts_cells +# foreach corner $vars(rc_corners) { +# if {[info exists vars($corner,atf_file)]} { +# append command "update_ccopt_rc_corner -name $corner -atf $vars($corner,atf_file)\n" +# } +# } +# if {$command != ""} { +# append command "\n" +# append commands [FF::wrap_command cts,update_ccopt_rc_corner $command] +# } + set command "set_ccopt_mode " + if {[info exists vars(ccopt_integration)]} { + append comments "# - vars(ccopt_integration)\n" + append command " -integration \"$vars(ccopt_integration)\"" + } else { + append ucomments "# - vars(ccopt_integration)\n" + } + if {[info exists vars(cts_inverter_cells)]} { + append comments "# - vars(cts_inverter_cells)\n" + append command " -cts_inverter_cells \"$vars(cts_inverter_cells)\"" + } else { + append ucomments "# - vars(cts_inverter_cells)\n" + } + if {[info exists vars(cts_buffer_cells)]} { + append comments "# - vars(cts_buffer_cells)\n" + append command " -cts_buffer_cells \"$vars(cts_buffer_cells)\"" + } else { + append ucomments "# - vars(cts_buffer_cells)\n" + } + if {[info exists vars(clock_gate_cells)]} { + append comments "# - vars(clock_gate_cells)\n" + append command " -cts_clock_gating_cells \"$vars(clock_gate_cells)\"" + } else { + append ucomments "# - vars(clock_gate_cells)\n" + } + if {[info exists vars(cts_use_inverters)]} { + append comments "# - vars(cts_use_inverters)\n" + append command " -cts_use_inverters [string tolower $vars(cts_use_inverters)]" + } else { + append ucomments "# - vars(cts_use_inverters)\n" + } + if {[info exists vars(update_io_latency)]} { + append comments "# - vars(update_io_latency)\n" + append command " -ccopt_modify_clock_latency $vars(update_io_latency)" + } else { + append ucomments "# - vars(update_io_latency)\n" + } + if {[info exists vars(cts_io_opt)]} { + append comments "# - vars(cts_io_opt)\n" + append command " -io_opt [string tolower $vars(cts_io_opt)]" + } else { + append ucomments "# - vars(cts_io_opt)\n" + } + if {[info exists vars(ccopt_effort)]} { + append comments "# - vars(ccopt_effort)\n" +# if {$vars(ccopt_effort) != "low"} { +# append command " -effort $vars(ccopt_effort)" +# } + } else { + append ucomments "# - vars(ccopt_effort)\n" + } + if {[info exists vars(cts_target_skew)]} { + append comments "# - vars(cts_target_skew)\n" + append command " -cts_target_skew $vars(cts_target_skew)" + } else { + append ucomments "# - vars(cts_target_skew)\n" + } + if {[info exists vars(cts_target_slew)]} { + append comments "# - vars(cts_target_slew)\n" + append command " -cts_target_slew $vars(cts_target_slew)" + } else { + append ucomments "# - vars(cts_target_slew)\n" + } + if {[info exists vars(pre_ccopt_tcl)]} { + append comments "# - vars(pre_ccopt_tcl)\n" + append command " -pre_tcl \{ source $vars(pre_ccopt_tcl) \}" + } + if {[info exists vars(post_ccopt_tcl)]} { + append comments "# - vars(post_ccopt_tcl)\n" + append command " -post_tcl \{ source $vars(post_ccopt_tcl) \}" + } + if {[info exists vars(ccopt_executable)]} { + append comments "# - vars(ccopt_executable)\n" + append command " -envAdvancedIntegrationLink $vars(ccopt_executable)" + } else { + append ucomments "# - vars(ccopt_executable)\n" + } + if {[info exists vars(clk_tree_ndr)]} { + append command " -route_top_non_default_rule $vars(clk_tree_ndr)" + } + if {[info exists vars(clk_tree_shield_net)]} { + append comments "# - vars(clk_tree_shield_net)\n" + append command " -route_top_shielding_net $vars(clk_tree_shield_net)" + } else { + append ucomments "# - vars(clk_tree_shield_net)\n" + } + if {[info exists vars(clk_tree_top_layer)]} { + append command " -route_top_top_preferred_layer $vars(clk_tree_top_layer)" + } + if {[info exists vars(clk_tree_bottom_layer)]} { + append command " -route_top_bottom_preferred_layer $vars(clk_tree_bottom_layer)" + } + append command "\n" + append commands [FF::wrap_command cts,set_ccopt_mode $command] + } + set args "" + if {![catch {set arg $vars(multi_cut_effort)}]} { + append comments "# - vars(multi_cut_effort)\n" + append args " -drouteUseMultiCutViaEffort $arg" + } else { + append ucomments "# - vars(multi_cut_effort)\n" + } + if {![catch {set arg $vars(litho_driven_routing)}]} { + append comments "# - vars(litho_driven_routing)\n" + append args " -routeWithLithoDriven $arg" + } else { + append ucomments "# - vars(litho_driven_routing)\n" + } + if {$args != ""} { + set command "\nsetNanoRouteMode $args\n" + append commands [FF::wrap_command cts,set_nanoroute_mode $command] + } + + if {([info exists vars(partition_list)]) && + ([file tail [file dirname [pwd]]] == "$vars(partition_dir)")} { + set ptn [file tail [pwd]] + if {[info exists vars($ptn,cts_spec)]} { + set vars(cts_spec) $vars($ptn,cts_spec) + } else { + if {$ptn != $vars(design)} { + if {[info exists vars(cts_spec)]} { + unset vars(cts_spec) + } + } + } + } + } + + "postcts" { + ################################################################### + # Optionally enable cppr, signalStorm, and onChipVariation (if + # MMMC) + ################################################################### + + append commands [lindex [FF_EDI::set_design_mode] 0] + append comments [lindex [FF_EDI::set_design_mode] 1] + append ucomments [lindex [FF_EDI::set_design_mode] 2] + + if {$vars(enable_ss) == "pre_postcts"} { + append comments "# - vars(enable_ss)\n" + set command "setDelayCalMode -engine signalStorm\n" + append commands [FF::wrap_command postcts,set_delay_cal_mode $command] + } else { + append ucomments "# - vars(enable_ss) \"pre_postcts\"\n" + } + set args "" + if {$vars(enable_cppr) != "false"} { + append comments "# - vars(enable_cppr)\n" + append args "-cppr $vars(enable_cppr) " + } else { + append ucomments "# - vars(enable_cppr)\n" + } + if {$vars(flow) == "mmmc"} { + if {$vars(enable_ocv) == "pre_postcts"} { + append comments "# - vars(enable_ocv)\n" + append args "-analysisType onChipVariation " + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "-aocv true " + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "-socv true " + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_postcts\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + } + if {$args != ""} { + set command "setAnalysisMode $args\n" + append commands [FF::wrap_command postcts,set_analysis_mode $command] + } + + if {[info exists vars(cts_spec)]} { + if {![catch {set arg $vars(clock_gate_clone)}]} { + append comments "# - vars(clock_gate_clone)\n" + set command "setOptMode -postCtsClkGateCloning $arg\n" + append commands [FF::wrap_command postcts,set_opt_mode $command] + } + } + } + + "postcts_hold" { + ################################################################### + # Set hold fixing options ... + ################################################################### + + append commands [lindex [FF_EDI::set_design_mode] 0] + append comments [lindex [FF_EDI::set_design_mode] 1] + append ucomments [lindex [FF_EDI::set_design_mode] 2] + + if {[info exists vars(delay_cells)]} { + append comments "# - vars(delay_cells)\n" + set command "" + foreach delay_cell $vars(delay_cells) { + append command "setDontUse $delay_cell false\n" + } + if {$command != ""} { + append commands [FF::wrap_command postcts_hold,set_dont_use $command] + } + } else { + append ucomments "# - vars(delay_cells)\n" + } + set args "" + if {![catch {set arg $vars(fix_hold_allow_tns_degradation)}]} { + append comments "# - vars(fix_hold_allow_tns_degradation)\n" + append args " -fixHoldAllowSetupTnsDegrade $arg" + } else { + append ucomments "# - vars(fix_hold_allow_tns_degradation)\n" + } + if {$vars(fix_hold_ignore_ios)} { + #append commands "setAnalysisMode -honorClockDomains true\n" + append comments "# - vars(fix_hold_ignore_ios)\n" +# append args " -ignorePathGroupsForHold {in2reg reg2out in2out}" + append args " -ignorePathGroupsForHold {default}" + } else { + append ucomments "# - vars(fix_hold_ignore_ios)\n" + } + if {$args != ""} { + set command "setOptMode $args\n" + append commands [FF::wrap_command postcts_hold,set_opt_mode $command] + } + } + + "route" { + ################################################################### + # Set routing options ... + # Recommendations for multicut via insertion and litho driven + # routing. These all incur runtime penalties but have yield + # advantages so are included here. The routeWithLithoDriven option + # is recommended for 45nm but may also be used at 65nm. The + # -drouteUseMultiCutViaEffort can be set to high if needed; + # expect an average of 5% coverage improvement with an average 10% + # runtime hit versus medium + ################################################################### + + if {($vars(enable_cppr) != "false") || $vars(track_opt)} { + append comments "# - vars(enable_cppr)\n" + append comments "# - vars(track_opt)\n" + set command "setAnalysisMode -cppr both\n" + append commands [FF::wrap_command route,set_analysis_mode $command] + } else { + append ucomments "# - vars(track_opt)\n" + } + + if {$vars(enable_si_aware)} { + set command "setDelayCalMode -siAware true -engine aae\n " + append commands [FF::wrap_command postroute,set_delay_cal_mode $command] + append comments "# - vars(enable_si_aware)\n" + if {$vars(enable_ss) == "pre_postroute"} { + append commands "# Variable vars(enable_ss) ignored when vars(enable_si_aware) is set\n" + set warnings($vars(warning_count)) "Variable vars(enable_ss) ignored when vars(enable_si_aware) is set\n" + incr vars(warning_count) + } + } else { + append ucomments "# - vars(enable_si_aware)\n" + if {$vars(enable_ss) == "pre_postroute"} { + append comments "# - vars(enable_ss)\n" + set command "setDelayCalMode -engine signalStorm -signoff true -siAware false\n" + append commands [FF::wrap_command postroute,set_delay_cal_mode $command] + } else { + set command "setDelayCalMode -siAware false\n" + append commands [FF::wrap_command postroute,set_delay_cal_mode $command] + append ucomments "# - vars(enable_ss) \"pre_postroute\"\n" + } + } + set args "" + if {![catch {set arg $vars(multi_cut_effort)}]} { + append comments "# - vars(multi_cut_effort)\n" + append args " -drouteUseMultiCutViaEffort $arg" + } else { + append ucomments "# - vars(multi_cut_effort)\n" + } + if {![catch {set arg $vars(litho_driven_routing)}]} { + append comments "# - vars(litho_driven_routing)\n" + append args " -routeWithLithoDriven $arg" + } else { + append ucomments "# - vars(litho_driven_routing)\n" + } + if {![catch {set arg $vars(antenna_diode)}]} { + if {$vars(antenna_diode) != ""} { + append comments "# - vars(antenna_diode)\n" + append args " -routeAntennaCellName $arg" + append args " -routeInsertAntennaDiode true" + } else { + append ucomments "# - vars(antenna_diode)\n" + } + } else { + append ucomments "# - vars(antenna_diode)\n" + } + if {$args != ""} { + set command "\nsetNanoRouteMode $args\n" + append commands [FF::wrap_command route,set_nanoroute_mode $command] + } + if {$vars(track_opt)} { + append comments "# - vars(track_opt)\n" + set command "setExtractRCMode -engine postRoute" + if {![catch {set arg $vars(tquantus_file)}]} { + append comments "# - vars(tquantus_file)\n" + append command " -tQuantusModelFile $arg" + } else { + append ucomments "# - vars(tquantus_file)\n" + } + append command " -effortLevel medium" + if {![catch {set arg $vars(total_c_thresh)}]} { + append comments "# - vars(total_c_thresh)\n" + append command " -total_c_th $arg" + } else { + append ucomments "# - vars(total_c_thresh)\n" + } + if {![catch {set arg $vars(relative_c_thresh)}]} { + append comments "# - vars(relative_c_thresh)\n" + append command " -relative_c_th $arg" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(coupling_c_thresh)}]} { + append comments "# - vars(coupling_c_thresh)\n" + append command " -coupling_c_th $arg" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(qrc_layer_map)}]} { + append comments "# - vars(qrc_layer_map)\n" + append command " -lefTechFileMap $arg" + } else { + append ucomments "# - vars(qrc_layer_map)\n" + } + append command "\n" + append commands [FF::wrap_command postroute,set_extract_rc_mode $command] + } + } + + "postroute" { + ################################################################### + # Set extraction effort for postroute optimization + # Enable signalStorm if requested + ################################################################### + + set process [regsub "nm" $vars(process) ""] + append comments "# - vars(process)\n" + if {[lindex [split $vars(version) "."] 0] < 15} { + if {$vars(high_timing_effort)} { + append comments "# - vars(high_timing_effort)\n" + if {![regexp "9.1" $vars(version)]} { + set command "setDesignMode -process $process -flowEffort high\n" + } else { + set command "setDesignMode -process $process\n" + append commands [FF::wrap_command postroute,set_design_mode $command] + append commands "setOptMode -unfixClkInstForOpt true\n" + } + } else { + set command "setDesignMode -process $process\n" + append commands [FF::wrap_command postroute,set_design_mode $command] + } + } else { + append commands [lindex [FF_EDI::set_design_mode] 0] + append comments [lindex [FF_EDI::set_design_mode] 1] + append ucomments [lindex [FF_EDI::set_design_mode] 2] + } + + set command "setExtractRCMode -engine postRoute" + if {![catch {set arg $vars(postroute_extraction_effort)}]} { + append comments "# - vars(postroute_extraction_effort)\n" + append command " -effortLevel $arg" + } else { + append ucomments "# - vars(postroute_extraction_effort)\n" + } + if {![catch {set arg $vars(total_c_thresh)}]} { + append comments "# - vars(total_c_thresh)\n" + append command " -total_c_th $arg" + } else { + append ucomments "# - vars(total_c_thresh)\n" + } + if {![catch {set arg $vars(relative_c_thresh)}]} { + append comments "# - vars(relative_c_thresh)\n" + append command " -relative_c_th $arg" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(coupling_c_thresh)}]} { + append comments "# - vars(coupling_c_thresh)\n" + append command " -coupling_c_th $arg" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(qrc_layer_map)}]} { + append comments "# - vars(qrc_layer_map)\n" + append command " -lefTechFileMap $arg" + } else { + append ucomments "# - vars(qrc_layer_map)\n" + } + append command "\n" + append commands [FF::wrap_command postroute,set_extract_rc_mode $command] + + + set args "" + if {($vars(enable_ocv) == "pre_postroute") || ($vars(enable_ocv) == "pre_postcts")} { + if {$vars(flow) != "default"} { + append comments "# - vars(enable_ocv)\n" + append args "-analysisType onChipVariation " + } + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "-aocv true " + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "-socv true " + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_postroute\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + if {$vars(enable_cppr) != "false"} { + append comments "# - vars(enable_cppr)\n" + append args "-cppr $vars(enable_cppr) " + } else { + append ucomments "# - vars(enable_cppr)\n" + } + if {$args != ""} { + set command "setAnalysisMode $args\n" + append commands [FF::wrap_command postroute,set_analysis_mode $command] + } + + if {[regexp "9.1" $vars(version)]} { + if {$vars(enable_ss) == "pre_postroute"} { + append comments "# - vars(enable_ss)\n" + set command "setDelayCalMode -engine signalStorm -signoff true " + append commands [FF::wrap_command postroute,set_delay_cal_mode $command] + } else { + append ucomments "# - vars(enable_ss) \"pre_postroute\"\n" + } + } else { + if {$vars(enable_si_aware)} { + set command "setDelayCalMode -siAware true -engine aae\n " + append commands [FF::wrap_command postroute,set_delay_cal_mode $command] + append comments "# - vars(enable_si_aware)\n" + if {$vars(enable_ss) == "pre_postroute"} { + append commands "# Variable vars(enable_ss) ignored when vars(enable_si_aware) is set\n" + set warnings($vars(warning_count)) "Variable vars(enable_ss) ignored when vars(enable_si_aware) is set\n" + incr vars(warning_count) + } + } else { + append ucomments "# - vars(enable_si_aware)\n" + if {$vars(enable_ss) == "pre_postroute"} { + append comments "# - vars(enable_ss)\n" + set command "setDelayCalMode -engine signalStorm -signoff true -siAware false\n" + append commands [FF::wrap_command postroute,set_delay_cal_mode $command] + } else { + set command "setDelayCalMode -siAware false\n" + append commands [FF::wrap_command postroute,set_delay_cal_mode $command] + append ucomments "# - vars(enable_ss) \"pre_postroute\"\n" + } + } + } + } + + "postroute_hold" { + ################################################################### + # Set hold fixing options ... + ################################################################### + + append commands [lindex [FF_EDI::set_design_mode] 0] + append comments [lindex [FF_EDI::set_design_mode] 1] + append ucomments [lindex [FF_EDI::set_design_mode] 2] + + set command "setExtractRCMode -engine postRoute" + if {![catch {set arg $vars(postroute_extraction_effort)}]} { + append comments "# - vars(postroute_extraction_effort)\n" + append command " -effortLevel $arg" + } else { + append ucomments "# - vars(postroute_extraction_effort)\n" + } + if {![catch {set arg $vars(total_c_thresh)}]} { + append comments "# - vars(total_c_thresh)\n" + append command " -total_c_th $arg" + } else { + append ucomments "# - vars(total_c_thresh)\n" + } + if {![catch {set arg $vars(relative_c_thresh)}]} { + append comments "# - vars(relative_c_thresh)\n" + append command " -relative_c_th $arg" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(coupling_c_thresh)}]} { + append comments "# - vars(coupling_c_thresh)\n" + append command " -coupling_c_th $arg" + } else { + append ucomments "# - vars(coupling_c_thresh)\n" + } + if {![catch {set arg $vars(qrc_layer_map)}]} { + append comments "# - vars(qrc_layer_map)\n" + append command " -lefTechFileMap $arg" + } else { + append ucomments "# - vars(qrc_layer_map)\n" + } + append command "\n" + append commands [FF::wrap_command postroute_hold,set_extract_rc_mode $command] + set command "" + if {[info exists vars(delay_cells)]} { + append comments "# - vars(delay_cells)\n" + foreach delay_cell $vars(delay_cells) { + append command "setDontUse $delay_cell false\n" + } + } else { + append ucomments "# - vars(delay_cells)\n" + } + if {$command != ""} { + append commands [FF::wrap_command postroute_hold,set_dont_use_mode $command] + } + + set args "" + if {![catch {set arg $vars(fix_hold_allow_tns_degradation)}]} { + append comments "# - vars(fix_hold_allow_tns_degradation)\n" + append args " -fixHoldAllowSetupTnsDegrade $arg" + } else { + append ucomments "# - vars(fix_hold_allow_tns_degradation)\n" + } + if {$vars(fix_hold_ignore_ios)} { + #append commands "setAnalysisMode -honorClockDomains true\n" + append comments "# - vars(fix_hold_ignore_ios)\n" +# append args " -ignorePathGroupsForHold {in2reg reg2out in2out}" + append args " -ignorePathGroupsForHold {default}" + } else { + append ucomments "# - vars(fix_hold_ignore_ios)\n" + } + if {$args != ""} { + set command "setOptMode $args\n" + append commands [FF::wrap_command postroute_hold,set_opt_mode $command] + } + } + + "postroute_si" { + ################################################################### + # Set noise, extraction, and SI options ... + # Enable signalStorm if requested + # Enable onChipVariation (if MMMC) + ################################################################### + + set process [regsub "nm" $vars(process) ""] + append comments "# - vars(process)\n" + if {$vars(high_timing_effort)} { + append comments "# - vars(high_timing_effort)\n" + if {![regexp "9.1" $vars(version)]} { + set command "setDesignMode -process $process -flowEffort high\n" + } else { + set command "setDesignMode -process $process\n" + } + } else { + set command "setDesignMode -process $process\n" + } + append commands [FF::wrap_command postroute_si,set_design_mode $command] + + set command "setExtractRCMode -coupled true" + if {![catch {set arg $vars(total_c_thresh)}]} { + append comments "# - vars(total_c_thresh)\n" + append command " -total_c_th $arg" + } else { + append ucomments "# - vars(total_c_thresh)\n" + } + if {![catch {set arg $vars(relative_c_thresh)}]} { + append comments "# - vars(relative_c_thresh)\n" + append command " -relative_c_th $arg" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(coupling_c_thresh)}]} { + append comments "# - vars(coupling_c_thresh)\n" + append command " -coupling_c_th $arg" + } else { + append ucomments "# - vars(coupling_c_thresh)\n" + } + if {![catch {set arg $vars(qrc_layer_map)}]} { + append comments "# - vars(qrc_layer_map)\n" + append command " -lefTechFileMap $arg" + } else { + append ucomments "# - vars(qrc_layer_map)\n" + } + append command "\n" + append commands [FF::wrap_command postroute_si,set_extract_rc_mode $command] + + set args "" + if {![catch {set arg $vars(delta_delay_threshold)}]} { + append comments "# - vars(delta_delay_threshold)\n" + append args " -deltaDelayThreshold $arg" + } else { + append ucomments "# - vars(delta_delay_threshold)\n" + } + if {![catch {set arg $vars(celtic_settings)}]} { + append comments "# - vars(celtic_settings)\n" + append args " -insCeltICPreTcl \"$arg\"" + } else { + append ucomments "# - vars(celtic_settings)\n" + } + if {![catch {set arg $vars(si_analysis_type)}]} { + append comments "# - vars(si_analysis_type)\n" + append args " -analysisType $arg" + } else { + append ucomments "# - vars(si_analysis_type)\n" + } + if {$vars(high_timing_effort) && [regexp "9.1" $vars(version)]} { +# append comments "# - vars(high_timing_effort)\n" + append args " -acceptableWNS 0" + } elseif {[info exists vars(acceptable_wns)]} { + append args " -acceptableWNS $vars(acceptable_wns)" + } + if {$args != ""} { + set command "setSIMode $args\n" + append commands [FF::wrap_command postroute_si,set_si_mode $command] + } + + set args "" + if {$vars(enable_ocv) == "pre_postroute_si"} { + if {$vars(flow) != "default"} { + append comments "# - vars(enable_ocv)\n" + append args "-analysisType onChipVariation " + } + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "-aocv true " + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "-socv true " + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_postroute_si\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + if {$vars(enable_cppr) != "false"} { + append comments "# - vars(enable_cppr)\n" + append args "-cppr $vars(enable_cppr) " + } else { + append ucomments "# - vars(enable_cppr)\n" + } + if {$args != ""} { + set command "setAnalysisMode $args\n" + append commands [FF::wrap_command postroute_si,set_analysis_mode $command] + } + + if {$vars(enable_ss) == "pre_postroute_si"} { + append comments "# - vars(enable_ss)\n" + set command "setDelayCalMode -engine signalStorm\n" + append commands [FF::wrap_command postroute_si,set_delay_cal_mode $command] + } else { + append ucomments "# - vars(enable_ss) \"pre_postroute_si\"\n" + } + } + + "postroute_si_hold" { + ################################################################### + # Set hold fixing options ... + ################################################################### + + set process [regsub "nm" $vars(process) ""] + append comments "# - vars(process)\n" + if {[lindex [split $vars(version) "."] 0] < 15} { + if {$vars(high_timing_effort)} { + append comments "# - vars(high_timing_effort)\n" + if {![regexp "9.1" $vars(version)]} { + set command "setDesignMode -process $process -flowEffort high\n" + } else { + set command "setDesignMode -process $process\n" + } + } else { + set command "setDesignMode -process $process\n" + } + } else { + if {[string tolower $vars(flow_effort)] != "standard"} { + set command "setDesignMode -process $process -flowEffort [string tolower $vars(flow_effort)]\n" + append comments "# - vars(flow_effort)\n" + } else { + set command "setDesignMode -process $process\n" + } + } + append commands [FF::wrap_command postroute_si_hold,set_design_mode $command] + + set command "" + if {[info exists vars(delay_cells)]} { + append comments "# - vars(delay_cells)\n" + foreach delay_cell $vars(delay_cells) { + append command "setDontUse $delay_cell false\n" + } + } else { + append ucomments "# - vars(delay_cells)\n" + } + if {$command != ""} { + append commands [FF::wrap_command postroute_si_hold,set_dont_use $command] + } + + set args "" + if {![catch {set arg $vars(fix_hold_allow_tns_degradation)}]} { + append comments "# - vars(fix_hold_allow_tns_degradation)\n" + append args " -fixHoldAllowSetupTnsDegrade $arg" + } else { + append ucomments "# - vars(fix_hold_allow_tns_degradation)\n" + } + if {$vars(fix_hold_ignore_ios)} { + #append commands "setAnalysisMode -honorClockDomains true\n" + append comments "# - vars(fix_hold_ignore_ios)\n" +# append args " -ignorePathGroupsForHold {in2reg reg2out in2out}" + append args " -ignorePathGroupsForHold {default}" + } else { + append ucomments "# - vars(fix_hold_ignore_ios)\n" + } + if {$args != ""} { + set command "setOptMode $args\n" + append commands [FF::wrap_command postroute_si_hold,set_opt_mode $command] + } + + ################################################################### + # Set noise, extraction, and SI options ... + # Enable signalStorm if requested + # Enable onChipVariation (if MMMC) + ################################################################### + + set command "setExtractRCMode -coupled true" + if {![catch {set arg $vars(total_c_thresh)}]} { + append comments "# - vars(total_c_thresh)\n" + append command " -total_c_th $arg" + } else { + append ucomments "# - vars(total_c_thresh)\n" + } + if {![catch {set arg $vars(relative_c_thresh)}]} { + append comments "# - vars(relative_c_thresh)\n" + append command " -relative_c_th $arg" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(coupling_c_thresh)}]} { + append comments "# - vars(coupling_c_thresh)\n" + append command " -coupling_c_th $arg" + } else { + append ucomments "# - vars(coupling_c_thresh)\n" + } + if {![catch {set arg $vars(qrc_layer_map)}]} { + append comments "# - vars(qrc_layer_map)\n" + append command " -lefTechFileMap $arg" + } else { + append ucomments "# - vars(qrc_layer_map)\n" + } + append command "\n" + append commands [FF::wrap_command postroute_si_hold,set_extract_rc_mode $command] + + set args "" + if {![catch {set arg $vars(delta_delay_threshold)}]} { + append comments "# - vars(delta_delay_threshold)\n" + append args " -deltaDelayThreshold $arg" + } else { + append ucomments "# - vars(delta_delay_threshold)\n" + } + if {![catch {set arg $vars(celtic_settings)}]} { + append comments "# - vars(celtic_settings)\n" + append args " -insCeltICPreTcl \"$arg\"" + } else { + append ucomments "# - vars(celtic_settings)\n" + } + if {![catch {set arg $vars(si_analysis_type)}]} { + append comments "# - vars(si_analysis_type)\n" + append args " -analysisType $arg" + } else { + append ucomments "# - vars(si_analysis_type)\n" + } + if {$vars(high_timing_effort) && [regexp "9.1" $vars(version)]} { +# append comments "# - vars(high_timing_effort)\n" + append args " -acceptableWNS 0" + } elseif {[info exists vars(acceptable_wns)]} { + append args " -acceptableWNS $vars(acceptable_wns)" + } + if {$args != ""} { + set command "setSIMode $args\n" + append commands [FF::wrap_command postroute_si_hold,set_si_mode $command] + } + if {$vars(enable_ss) == "pre_postroute_si"} { + append comments "# - vars(enable_ss)\n" + set command "setDelayCalMode -engine signalStorm\n" + append commands [FF::wrap_command postroute_si_hold,set_delay_cal_mode $command] + } else { + append ucomments "# - vars(enable_ss) \"pre_postroute_si\"\n" + } + if {$vars(enable_ocv) == "pre_postroute_si"} { + append comments "# - vars(enable_ocv)\n" + if {$vars(flow) != "default"} { + set command "setAnalysisMode -analysisType onChipVariation\n" + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append command "-aocv true " + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append command "-socv true " + } else { + append ucomments "# - vars(enable_socv)\n" + } + append commands [FF::wrap_command postroute_si_hold,set_analysis_mode $command] + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_postroute_si\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + } + + "signoff" { + ################################################################### + # For the default flow, switch to MMMC for final STA to support + # multiple RC corners. Also, enable CCE (signoff) extraction if + # the QRC techfile exists + ################################################################### + if {$vars(flow) == "default"} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# UPDATING TIMING ENVIRONMENT" + append commands "#\n" + } + set command [FF_EDI::initialize_timing mmmc] + append commands [FF::wrap_command signoff,initialize_timing $command] + } + set process [regsub "nm" $vars(process) ""] + append comments "# - vars(process)\n" + set command "setDesignMode -process $process\n" + append commands [FF::wrap_command signoff,set_design_mode $command] + + ################################################################### + # Set noise, extraction, and SI options ... + # Enable signalStorm if requested + # Enable onChipVariation (if MMMC) + ################################################################### + + set command "setExtractRCMode -coupled true" + if {![catch {set arg $vars(signoff_extraction_effort)}]} { + append comments "# - vars(signoff_extraction_effort)\n" + append command " -effortLevel $arg" + } else { + append command " -effortLevel high" + } + if {![catch {set arg $vars(total_c_thresh)}]} { + append comments "# - vars(total_c_thresh)\n" + append command " -total_c_th $arg" + } else { + append ucomments "# - vars(total_c_thresh)\n" + } + if {![catch {set arg $vars(relative_c_thresh)}]} { + append comments "# - vars(relative_c_thresh)\n" + append command " -relative_c_th $arg" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(coupling_c_thresh)}]} { + append comments "# - vars(coupling_c_thresh)\n" + append command " -coupling_c_th $arg" + } else { + append ucomments "# - vars(coupling_c_thresh)\n" + } + if {![catch {set arg $vars(qrc_layer_map)}]} { + append comments "# - vars(qrc_layer_map)\n" + append command " -lefTechFileMap $arg" + } else { + append ucomments "# - vars(qrc_layer_map)\n" + } + append command "\n" + append commands [FF::wrap_command signoff,set_extract_rc_mode $command] + + set args "" + if {![catch {set arg $vars(delta_delay_threshold)}]} { + append comments "# - vars(delta_delay_threshold)\n" + append args " -deltaDelayThreshold $arg" + } else { + append ucomments "# - vars(delta_delay_threshold)\n" + } + if {![catch {set arg $vars(celtic_settings)}]} { + append comments "# - vars(celtic_settings)\n" + append args " -insCeltICPreTcl \"$arg\"" + } else { + append ucomments "# - vars(celtic_settings)\n" + } + if {![catch {set arg $vars(si_analysis_type)}]} { + append comments "# - vars(si_analysis_type)\n" + append args " -analysisType $arg" + } else { + append ucomments "# - vars(si_analysis_type)\n" + } + set args "" + if {$vars(enable_ocv) != "false"} { + append comments "# - vars(enable_ocv)\n" + append args "-analysisType onChipVariation " + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "-aocv true " + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "-socv true " + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_signoff\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + if {$vars(enable_cppr) != "false"} { + append comments "# - vars(enable_cppr)\n" + append args "-cppr $vars(enable_cppr) " + } else { + append ucomments "# - vars(enable_cppr)\n" + } + if {$args != ""} { + set command "setAnalysisMode $args\n" + append commands [FF::wrap_command signoff,set_analysis_mode $command] + } + if {[regexp "9.1" $vars(version)]} { + if {$vars(enable_ss) == "pre_signoff"} { + set command "setDelayCalMode -engine signalStorm -signoff true\n" + append commands [FF::wrap_command signoff,set_delay_cal_mode $command] + append comments "# - vars(enable_ss)\n" + } else { + append ucomments "# - vars(enable_ss) \"pre_signoff\"\n" + } + } else { +# if {$vars(enable_si_aware)} { +# append comments "# - vars(enable_si_aware)\n" +# append command "-siAware true -engine aae\n " + if {$vars(enable_ss) == "pre_signoff"} { + set command "setDelayCalMode -engine signalStorm -signoff true\n" + append commands [FF::wrap_command signoff,set_delay_cal_mode $command] +# append commands " Variable vars(enable_ss) ignored when vars(enable_si_aware) is set\n" +# set warnings($vars(warning_count)) "Variable vars(enable_ss) ignored when vars(enable_si_aware) is set\n" +# incr vars(warning_count) + } else { + append ucomments "# - vars(enable_ss) \"pre_signoff\"\n" + } +# } else { +# append ucomments "# - vars(enable_si_aware)\n" +# if {$vars(enable_ss) == "pre_signoff"} { +# append comments "# - vars(enable_ss)\n" +# append command "-engine signalStorm -signoff true " +# } else { +# append ucomments "# - vars(enable_ss) \"pre_signoff\"\n" +# } +# } + } + + if {$vars(skip_signoff_checks)} { + set command "setExtractRCMode -engine postRoute -effortLevel $vars(signoff_extraction_effort) -coupled true\n" + append commands [FF::wrap_command signoff,set_extract_rc_mode $command] + } else { + append commands "set vars(active_rc_corners) \[list\]\n" + append commands "foreach view \[concat \[all_setup_analysis_views\] \[all_hold_analysis_views\]\] {\n" + append commands " set corner \[get_delay_corner \[get_analysis_view \$view -delay_corner\] -rc_corner\]\n" + append commands " if {\[lsearch \$vars(active_rc_corners) \$corner\] == -1 } {\n" + append commands " lappend vars(active_rc_corners) \$corner\n" + append commands " }\n" + append commands "}\n" + append commands "Puts \" ACTIVE RC CORNER LIST: \$vars(active_rc_corners)\"\n" + + append commands "set empty_corners \[list\]\n" + append commands "foreach corner \$vars(active_rc_corners) {\n" + append commands " if {!\[file exists \[get_rc_corner \$corner -qx_tech_file\]\]} {\n" + append commands " lappend empty_corners \$corner\n" + append commands " }\n" + append commands "}\n" + append commands "if {\[llength \$empty_corners\] == 0} {\n" + set command " setExtractRCMode -engine postRoute -effortLevel $vars(signoff_extraction_effort) -coupled true\n" + append commands [FF::wrap_command signoff,set_extract_rc_mode $command] + append commands "} else {\n" + append commands " Puts \" CAN'T RUN SIGNOFF EXTRACTION BECAUSE qx_tech_file IS NOT DEFINED FOR these corners: \$empty_corners\"\n" + set command " setExtractRCMode -engine postRoute -effortLevel low -coupled true\n" + append commands [FF::wrap_command signoff,set_extract_rc_mode $command] + append commands "}\n" + } + } + } + if {[info exists ucomments]} { + if {$ucomments == ""} { + if {[info exists vars(ucomments)]} { + unset vars(ucomments) + } + } else { + set vars(ucomments) $ucomments + } + } + if {[info exists comments]} { + if {$comments == ""} { + if {[info exists vars(comments)]} { + unset vars(comments) + } + } else { + set vars(comments) $comments + } + } + set vars($step,commands) $commands + return $commands + } + + proc save_results {{step ""} {format 0}} { + + if {[regexp "^syn" $step]} { + return "" + } + + global vars + global errors + global env + + if {[info exists vars(hier)]} { + set hier true + } else { + set hier false + } + if {$step != ""} { + set vars(step) $step + } + + if {$vars(debug)} { + puts " Saving results for $vars(step) ..." + } + + set commands "" + if {$vars(batch)} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# SAVING RESULTS\n" + append commands "#\n" + } + +# if {[regexp _hold $vars(step)] && (![lsearch $vars(fix_hold) $vars(step)] <0)} { +# +# if {!$format} { +# set commands "" +# } else { +# if {$vars(report_run_time)} { +# append commands "FF_EDI::report_time $vars(step)\n" +# } +# } +# if {$vars(codegen)} { +# return $commands +# } else { +# uplevel #0 eval $commands +# } +# } + + if {$vars(step) != "partition"} { + set header "#---------------------------------------------------------------------\n" + append header "# GENERATING REPORTS\n" + append header "#---------------------------------------------------------------------\n" + + if {$vars(report_power)} { + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + set command "report_power -view $vars(power_analysis_view) -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } else { + set command "report_power -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } + append commands [FF::wrap_command $vars(step),report_power $command] + } + + if {[FF::is_lp_flow] && [info exists vars(power_domains)] && [llength $vars(power_domains)] > 1} { + append commands $header + set header "" + + ###################################################################### + # Verify power domain + ###################################################################### + + set command "verifyPowerDomain -bind -gconn" + append command " -isoNetPD $vars(rpt_dir)/$vars(step).isonets.rpt" + append command " -xNetPD $vars(rpt_dir)/$vars(step).xnets.rpt\n" + + append commands [FF::wrap_command $step,verify_power_domain $command] + + ###################################################################### + # Run CLP + ###################################################################### + + if {$vars(run_clp) && ([auto_execok lec] != "")} { + set command "runCLP " + if {[info exists vars(clp_options)]} { + append command $vars(clp_options) + } + append command "\n" + append commands [FF::wrap_command $step,run_clp $command] + } else { + if {![info exists vars(clp_warning)]} { + puts " WARNING: UNABLE TO RUN CLP ... PLEASE MAKE SURE IT IS IN YOUR PATH" + set vars(clp_warning) true + } + } + } + } + + set map(init) unplaced + set map(partition_place) placed + set map(model_gen) placed + set map(assign_pin) placed + #set map(partition) {} + set map(place) placed + set map(prects) placed + set map(cts) clock_synthesized + set map(postcts) clock_synthesized + set map(postcts_hold) clock_synthesized + set map(route) clock_synthesized_routed + set map(postroute) clock_synthesized_routed + set map(postroute_hold) clock_synthesized_routed + set map(signoff) clock_synthesized_routed + set map(assemble) placed_routed + + if {$vars(capture_metrics) && ($vars(step) != "debug")} { + if {[lindex [split $vars(version) "."] 0] > 13} { + append commands "um::pop_snapshot_stack\n" + if {[lindex [split $vars(version) "."] 0] > 16} { + if {[info exists map($step)]} { + if {[info exists vars(compute_metrics)] && $vars(compute_metrics)} { + append commands "create_snapshot -name $vars(step) -categories \[dict get \$metric_category_status_map $map($step)\]\n" + } else { + append commands "create_snapshot -name $vars(step) -categories design\n" + } + } else { + append commands "create_snapshot -name $vars(step) -categories design\n" + } + } else { + append commands "create_snapshot -name $vars(step) -categories design\n" + } + append commands "report_metric -file $vars(rpt_dir)/metrics.html -format html\n" + } + } + +# append commands "#\n" +# append commands "# HOUSEKEEPING\n" +# append commands "#\n" + + if {[info exists vars(mail,to)]} { + switch $vars(step) { + init { set summary_file preplace.summary } + assemble { set summary_file signoff.summary } + default { set summary_file $vars(step).summary } + } + if {![info exists vars(mail,steps)] || \ + ([info exists vars(mail,steps)] && ([lsearch $vars(mail,steps) $vars(step)] != -1))} { + append commands "Puts \" MAILING RESULTS TO $vars(mail,to)\"\n" + append commands "if {\[file exists $vars(rpt_dir)/$summary_file\]} {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" < $vars(rpt_dir)/$summary_file $vars(mail,to)\n" + append commands "} elseif {\[file exists $vars(rpt_dir)/${summary_file}.gz\]} {\n" + append commands " exec gunzip -c $vars(rpt_dir)/${summary_file}.gz \| /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" $vars(mail,to)\n" + append commands "} else {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" < /dev/null $vars(mail,to)\n" + append commands "}\n" + } + } + + if {($step != "partition") && ($step != "rebudget") && ($step != "flexilm")} { + set args "" + if {[info exists vars(save_rc)] && $vars(save_rc)} { + if {[regexp "route" $vars(step)]} { + append args " -rc" + } + } + if {[info exists vars(save_constraints)] && $vars(save_constraints)} { + append args " -tcon" + } + + # BCL: Added subst around vars(dbs_dir) to resolve vars(rundir) + set dir [subst $vars(dbs_dir)] + set design $vars(design) + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + if {$hier} { + set command "saveDesign $args -cellview {$vars(oa_partition_lib) $vars(design) $vars(step)}\n" + } else { + set command "saveDesign $args -cellview {$vars(oa_design_lib) $vars(design) $vars(step)}\n" + } + } else { + set command "saveOaDesign $vars(oa_design_lib) $design $vars(step)\n" + } + } else { + if {[info exists vars(relative_path)] && $vars(relative_path)} { + append args " -relativePath" + } + if {[info exists vars(absolute_lib_path)] && $vars(absolute_lib_path)} { + append args " -absoluteLibPath" + } + set command "saveDesign $args $dir/$vars(step).enc -compress\n" + } + if {!(($vars(step) == "model_gen") && $vars(use_flexmodels) && $vars(flexmodel_art_based))} { + append commands [FF::wrap_command $step,save_design $command] + if {$vars(run_lec)} { + append commands [FF::wrap_command $step,save_lec_netlist "saveNetlist $vars(dbs_dir)/LEC/$step.v.gz\n"] + } + } + } + + if {![info exists env(VPATH)]} { + set env(VPATH) "make" + } + + append commands "if {\[info exists env(VPATH)\]} {" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)" + append commands "}\n" + + + if {$format} { + if {$vars(report_run_time)} { + append commands "ff_procs::report_time\n" + } + if {$vars(capture_metrics)} { + if {[lindex [split $vars(version) "."] 0] < 14} { + append commands [eval FF::capture_metrics] + } + } + } + + if {$vars(enable_qor_check)} { +# if {[info exists vars($step,qor_tcl]} { +# set qor_file $vars($step,qor_tcl) +# if {[file exists $qor_file]} { +# set qor [catch {exec $qor_file} msg] +# set make_file [open $this_semaphore w] +# puts $make_file "$qor" +# close $make_file +# } +# } + if {[info exists vars($step,qor_tcl)]} { + if {[file exists $vars($step,qor_tcl)]} { + append commands [FF::source_plug ${step},qor_tcl] + } else { + append commands " WARNING: QOR file $vars($step,qor_tcl) does not exist" + set warnings($warning_count) "WARNING: QOR file $vars($step,qor_tcl) does not exist" + incr warning_count + } + } else { + if {$vars(makefile)} { + append commands "\nif {\[info exists env(VPATH)\]} {\n" + append commands " exec /bin/touch \$env(VPATH)/${step}_qor\n" + append commands "}\n" + } + } + } + append commands [FF::source_plug final_always_source_tcl] + + } else { + append commands "Puts \" =================================================\"\n" + append commands "Puts \" INFO: Running in interactive mode ...\"\n" + append commands "Puts \" Please run 'ff_procs::save_results ' \"\n" + append commands "Puts \" to prepare a database for the next step\"\n" + append commands "Puts \" =================================================\"\n" + if {$vars(makefile)} { + append commands "if {\[info exists env(VPATH)\]} {\n" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)\n" + append commands "}\n" + } + } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + + } + + proc initialize_multicpu {} { + + global vars + + if {[regexp "^syn" $vars(step)]} { return "" } + + set commands "" +# append commands "#\n" +# append commands "# SETTING UP MULTI PROCESS DISTRIBUTION AND THREADING\n" +# append commands "#\n" + + if {[info exists vars(distribute_timeout)]} { + set command "setDistributeHost -timeOut $vars(distribute_timeout) " + } else { + set command "setDistributeHost " + } + + if {[info exists vars(distribute)]} { + switch $vars(distribute) { + "rsh" { +# append commands "# RUNNING RSH on $vars(rsh,host_list)\n" + append command "-rsh -add \[list $vars(rsh,host_list)\]\n" + set vars(remote_hosts) [llength $vars(rsh,host_list)] + } + "local" { + append command "-local\n" + } + "custom" { +# append commands "# RUNNING CUSTOM ($vars(custom,script))\n" + append command "-custom -custom_script { $vars(custom,script) }\n" + } + "lsf" { +# append commands "# RUNNING LSF ($vars(lsf,queue), $vars(lsf,resource), $vars(lsf,args)\n" + append command "-lsf -queue $vars(lsf,queue) -resource { $vars(lsf,resource) } -lsf_args { $vars(lsf,args) }\n" + } + default { + puts " DISTRIBUTION TYPE $vars(distribute) NOT SUPPORTED\n" + } + } + +# append commands $command + append commands [FF::wrap_command $vars(step),set_distributed_hosts $command] + + set command "setMultiCpuUsage " + append command "-localCpu $vars(local_cpus) " + append command "-remoteHost $vars(remote_hosts) " + append command "-cpuPerRemoteHost $vars(cpus_per_remote_host)\n" + append commands [FF::wrap_command $vars(step),set_multi_cpu_usage $command] + + } else { + + append command "-local\n" + append commands [FF::wrap_command $vars(step),set_distribute_host $command] + + set command "setMultiCpuUsage -localCpu $vars(local_cpus)\n" + append commands [FF::wrap_command $vars(step),set_multi_cpu_usage $command] + + } + + return $commands + + } + proc derate_timing {{type minmax}} { + + global vars + global errors + +# if {[info exists vars(view_definition_tcl)]} { +# return "" +# } + +# if {$vars(enable_aocv)} { +# set commands "" +# foreach corner $vars(delay_corners) { +# append commands "reset_timing_derate -delay_corner $corner\n" +# } +# return $commands +# } + + set commands "Puts \" DERATING DELAY CORNERS ...\"\n" + if {$vars(verbose)} { + append commands "#\n" + append commands "# DERATING DELAY CORNERS ($type) ...\n" + append commands "#\n" + } + switch $type { + "mmmc" { + set found_corner 0 + foreach corner $vars(delay_corners) { + set derate_file 0 + set command($corner) "" + if {[info exists vars($corner,derate_tcl)]} { + set derate_file 1 + incr found_corner 1 + if {[file exists $vars($corner,derate_tcl)]} { + if {$command($corner) == ""} { + append command($corner) [FF::source_plug "$corner,derate_tcl"] + } + } + } + if {!$derate_file} { + foreach object "cell net" { + foreach mode "early late" { + foreach type "data clock" { + if {[info exists vars($corner,${type}_${object}_${mode})]} { + append command($corner) " set_timing_derate -$type -${object}_delay -$mode -delay_corner $corner $vars($corner,${type}_${object}_${mode})\n" + set found_corner 1 + } + if {[info exists vars($corner,${object}_${type}_${mode})]} { + append command($corner) " set_timing_derate -$type -${object}_delay -$mode -delay_corner $corner $vars($corner,${object}_${type}_${mode})\n" + set found_corner 1 + } + } + if {[info exists vars($corner,cell_check_${mode})]} { + append command($corner) " set_timing_derate -cell_check -$mode -delay_corner $corner $vars($corner,cell_check_${mode})\n" + set found_corner 1 + } + if {[info exists vars($corner,check_cell_${mode})]} { + append command($corner) " set_timing_derate -cell_check -$mode -delay_corner $corner $vars($corner,check_cell_${mode})\n" + set found_corner 1 + } + } + } + } + } + ######################################################################### + # There can only be one ilm_non_sdc_file, so need to combine them with + # the timing derate commands if both exists + ######################################################################### + if {$found_corner>0} { + if $vars(ilm) { + set op [open .ilm_non_sdc_file.tcl w] + if {[info exists vars(ilm_non_sdc_file)] && [file exists $vars(ilm_non_sdc_file)]} { + set fhr [open $vars(ilm_non_sdc_file) r] + puts $op "#" + puts $op "# Contents of $vars(ilm_non_sdc_file)" + puts $op "#" + while {[gets $fhr line]>=0} { + puts $op " $line" + } + close $fhr + puts $op "# -------------------------------------------" + set vars(save_ilm_non_sdc_file) $vars(ilm_non_sdc_file) + unset vars(ilm_non_sdc_file) + } + if {[info exists vars(derate_tcl)]} { + puts $op "source $vars(derate_tcl)" + } else { + foreach corner $vars(delay_corners) { + puts $op $command($corner) + } + } + close $op + if {[lindex [split $vars(version) "."] 0] <= 10} { + append commands "loadTimingCon -ilmNonSdcFile .ilm_non_sdc_file.tcl\n" + } else { + append commands "setIlmNonSdcConstraintFile .ilm_non_sdc_file.tcl\n" + } + } else { + if {[info exists vars(derate_tcl)]} { + append commands [FF::source_plug derate_tcl] + append commands "\n" + } else { + append commands "set active_corners \[all_delay_corners\]\n" + foreach corner $vars(delay_corners) { + if {$command($corner) != ""} { + append commands "if {\[lsearch \$active_corners $corner\] != -1} {\n" + append commands $command($corner) + append commands "}\n" + } + } + } + } + } else { + if {[info exists vars(derate_tcl)]} { + append commands [FF::source_plug derate_tcl] + append commands "\n" + } + } + } + "minmax" { + + set corners(min) $vars($vars(default_hold_view),delay_corner) + set corners(max) $vars($vars(default_setup_view),delay_corner) + + ################################################################################ + # Derate timing if derating factors are defined + ################################################################################ + foreach object "cell net" { + foreach corner "min max" { + foreach type "data clock" { + foreach mode "early late" { + if {[info exists vars($corners($corner),${type}_${object}_${mode})]} { + append commands "set_timing_derate -$corner -$type -${object}_delay -$mode $vars($corners($corner),${type}_${object}_${mode})\n" + } + if {[info exists vars($corners($corner),${object}_${type}_${mode})]} { + append commands "set_timing_derate -$corner -$type -${object}_delay -$mode $vars($corners($corner),${object}_${type}_${mode})\n" + } + } + } + } + } + foreach corner "min max" { + foreach mode "early late" { + if {[info exists vars($corners($corner),cell_check_${mode})]} { + append commands "set_timing_derate -cell_check -$mode $vars($corners($corner),cell_check_${mode})\n" + } + if {[info exists vars($corners($corner),check_cell_${mode})]} { + append commands "set_timing_derate -cell_check -$mode $vars($corners($corner),check_cell_${mode})\n" + } + } + } + } + default { + Puts " INVALID OPTION ... MUST BE EITHER minmax OR mmmc" + } + } + if {[lindex [split $vars(version) "."] 0] > 10} { + set op [open $vars(script_dir)/timingderate.sdc w] + puts $op $commands + close $op +# set commands "source \$vars(script_dir)/timingderate.sdc\n" + set commands "source $vars(script_dir)/timingderate.sdc\n" + } + return $commands + } + ##################################################################################### + # The code below updates timing depending on whether the current module is + # - top partition in a hierarchical flow + # - partition in a hierarchical flow + # - chip or block in a flat flow + # Timing is updated by incrementally adding the vars(incr_cts_sdc) to each + # constraint mode that has one defined + ##################################################################################### + + proc update_timing {{type minmax} {switch_to_propagated true}} { + + global vars + + if {![info exists vars(constraint_modes)]} { + return + } + + set commands "Puts \" UPDATING TIMING ...\"\n" + + set ptn [file tail [pwd]] + set parent [file tail [file dirname [pwd]]] + set update true + set top false + if {[info exists vars(partition_list)] && ($parent == "$vars(partition_dir)")} { + if {[lsearch $vars(partition_list) $ptn] != -1} { +# set ilm false + set update false + } else { + set top true + } + } + +# append commands "# ILM $vars(ilm), UPDATE $update\n" + + if {$switch_to_propagated} { + append commands "set op \[open prop.sdc w\]\n" + append commands "puts \$op \"set_propagated_clock \\\[all_clocks\\\]\"\n" + if {$vars(ilm)} { + if {$vars(flat) != "none"} { + append commands [FF_EDI::get_clock_ports] + } else { + append commands "set clock_ports \[FF_EDI::get_clock_ports\]\n" + } + append commands "if {\[llength \$clock_ports\] > 0} {\n" + append commands " foreach port \$clock_ports {\n" + append commands " puts \$op \"set_propagated_clock \$port\"\n" + append commands " }\n" + append commands "}\n" + } + append commands "close \$op\n" + } + + switch $type { + + "minmax" { + if {$vars(ilm) && $update} { + if {[info exists vars(incr_cts_sdc)]} { + foreach file $vars(incr_cts_sdc) { + append commands "loadTimingCon -ilm -incr $file\n" + } + } elseif {[info exists vars(post_cts_sdc)]} { + append command "unloadTimingCon\n" + append commands "loadTimingCon [lindex $vars(post_cts_sdc) 0]\n" + foreach sdc [lrange $vars(post_cts_sdc) 1 end] { + append commands "loadTimingCon -ilm -incr $sdc\n" + } + } + if {$switch_to_propagated} { + append commands "loadTimingCon -ilm -incr prop.sdc\n" + } + } else { + if {$update} { + if {[info exists vars(incr_cts_sdc)]} { + foreach file $vars(incr_cts_sdc) { + append commands "loadTimingCon -incr $file\n" + } + } elseif {[info exists vars(post_cts_sdc)]} { + append commands "unloadTimingCon\n" + append commands "loadTimingCon [lindex $vars(post_cts_sdc) 0]\n" + foreach sdc [lrange $vars(post_cts_sdc) 1 end] { + append commands "loadTimingCon -incr $sdc\n" + } + } + } + if {$switch_to_propagated} { + append commands "loadTimingCon -incr prop.sdc\n" + } + } + } + "mmmc" { +# if {[info exists vars(update_io_latency)] && $vars(update_io_latency)} { +# update_io_latency +# } + if {$switch_to_propagated} { + set prop_sdc "prop.sdc" + } else { + set prop_sdc "" + } + + foreach mode $vars(constraint_modes) { + append commands "if {\[lsearch \[all_constraint_modes\] $mode\] != -1} {\n" + if {$update} { + if {[info exists vars($mode,incr_cts_sdc)]} { + if {$vars(ilm)} { + append commands "set vars($mode,post_cts_sdc_list) \[concat \[get_constraint_mode $mode -ilm_sdc_files\] $vars($mode,incr_cts_sdc) $prop_sdc\]\n" + } else { + append commands "set vars($mode,post_cts_sdc_list) \[concat \[get_constraint_mode $mode -sdc_files\] $vars($mode,incr_cts_sdc) $prop_sdc\]\n" + } + if {[info exists vars($mode,post_cts_sdc)]} { + puts " WARNING: BOTH vars($mode,incr_cts_sdc) AND vars($mode,post_cts_sdc) ARE DEFINED ..." + puts " USING vars($mode,incr_cts_sdc)" + } + } else { + if {[info exists vars($mode,post_cts_sdc)]} { + append commands "set vars($mode,post_cts_sdc_list) \[concat $vars($mode,post_cts_sdc) $prop_sdc\]\n" + } else { + if {$vars(ilm)} { + if {$vars(cts_engine) == "cts" || ($vars(step) == "assemble")} { + append commands "set vars($mode,post_cts_sdc_list) \[concat \[get_constraint_mode $mode -ilm_sdc_files\] $prop_sdc\]\n" + } else { + if {$vars(step) != "assemble"} { + return "" + } + } + } else { + if {$vars(cts_engine) == "cts" || ($vars(step) == "assemble")} { + append commands "set vars($mode,post_cts_sdc_list) \[concat \[get_constraint_mode $mode -sdc_files\] $prop_sdc\]\n" + } else { + if {$vars(step) != "assemble"} { + return "" + } + } + } + } + } + } else { + if {$vars(ilm)} { + if {$vars(cts_engine) == "cts"} { + append commands "set vars($mode,post_cts_sdc_list) \[concat \[get_constraint_mode $mode -ilm_sdc_files\] $prop_sdc\]\n" + } else { + if {[regexp "^assemble" $vars(step)]} { + return "" + } + } + } else { + if {$vars(cts_engine) == "cts"} { + append commands "set vars($mode,post_cts_sdc_list) \[concat \[get_constraint_mode $mode -sdc_files\] $prop_sdc\]\n" + } else { +# if {[regexp "^assemble" $vars(step)]} { + return "" + } + } + } + } + append commands "}\n" + } + + if {!$vars(ilm)} { + append commands "set restore \[get_global timing_defer_mmmc_object_updates\]\n" + append commands "set_global timing_defer_mmmc_object_updates true\n" + } + + if {$vars(ilm)} { + exec /bin/touch empty.sdc + append commands "foreach mode \[all_constraint_modes\] {\n" + append commands " if {\[info exists vars(\$mode,post_cts_sdc_list)\]} {\n" + append commands " update_constraint_mode -name \$mode -ilm_sdc_files \$vars(\$mode,post_cts_sdc_list)\n" + append commands " } else {\n" + append commands " foreach view \[all_analysis_views] {\n" + append commands " set m \[regsub _\$view \$mode \"\"\]\n" + append commands " if {\[info exists vars(\$m,post_cts_sdc_list)\]} {\n" + append commands " update_constraint_mode -name \$mode -ilm_sdc_files \$vars(\$m,post_cts_sdc_list)\n" + append commands " }\n" + append commands " } \n" + append commands " } \n" + append commands "} \n" + } else { + append commands "foreach mode \[all_constraint_modes\] \{\n" + append commands " if \{\[info exists vars(\$mode,post_cts_sdc_list)\]\} \{\n" + append commands " update_constraint_mode -name \$mode -sdc_files \$vars(\$mode,post_cts_sdc_list)\n" + append commands " \} else \{\n" + append commands " foreach view \[all_analysis_views] \{\n" + append commands " set m \[regsub _\$view \$mode \"\"\]\n" + append commands " if \{\[info exists vars(\$m,post_cts_sdc_list)\]\} \{\n" + append commands " update_constraint_mode -name \$mode -sdc_files \$vars(\$m,post_cts_sdc_list)\n" + append commands " \}\n" + append commands " \} \n" + append commands " \} \n" + append commands "\} \n" + } + + if {!$vars(ilm)} { + append commands "set_analysis_view -update_timing\n" + append commands "set_global timing_defer_mmmc_object_updates \$restore\n" + } + set this_index [lsearch $vars(steps) $vars(step)] + set prior [lindex $vars(steps) [expr $this_index - 1]] + # BCL: Added subst around vars(dbs_dir) + if {[file isfile [subst $vars(dbs_dir)]/$prior.enc.dat/mmmc/pathgroup.sdc]} { + # BCL: Added subst around vars(dbs_dir) + set vars(path_group_sdc) [subst $vars(dbs_dir)]/$prior.enc.dat/mmmc/pathgroup.sdc + append commands "ff_procs::load_path_groups $vars(path_group_sdc)\n" + } + } + default { + puts $vars(codgen_log) " INVALID OPTION ... MUST BE EITHER minmax OR mmmc" + } + } + return $commands + } + + proc initialize_timing {{type mmmc}} { + + global vars + global env + global init + global warnings + + set vars(delay_corners) $vars(good_corners) + +# if {[info exists vars(view_definition_tcl)]} { +# return "" +# } + + if {$vars(verbose)} { + append commands "#\n" + append commands "# INITIALIZING [string toupper $type] TIMING\n" + append commands "#\n" + } + + if {$vars(debug)} { + puts " Executing proc: initialize_timing ..." + } + + switch $type { + minmax { +# if {([llength $vars(rc_corners)] > 1)} { +# puts " WARNING: THE \"default\" FLOW SHOULD ONLY HAVE A SINGLE RC CORNER" +# puts " BUT [llength $vars(rc_corners)] CORNERS ARE DEFINED ($vars(rc_corners))" +# } + + ################################################################### + # Define RC corners and set the appropriate temperatures. This + # requires that the cap tables use -best/-worst syntax in the + # configuration file. Scaling factors should be derived using + # Ostrich Values for the default timing environment is derived + # from the default setup and hold analysis views + ################################################################### + + set corners(min) $vars($vars(default_hold_view),delay_corner) + set corners(max) $vars($vars(default_setup_view),delay_corner) + set corner $vars($corners(max),rc_corner) + +# if {[info exists env(FF_KIT_PATH)]} { + if {![catch {set max $vars($vars($corners(max),rc_corner),T)}] && + ![catch {set min $vars($vars($corners(min),rc_corner),T)}]} { + append commands \ + "defineRCCorner -late worst $max -early best $min\n" + } +# } else { +# Puts " USING SINGLE RC CORNER $vars($corners(max),rc_corner)" +# if {[info exists vars($vars($corners(max),rc_corner),T)]} { +# setExtractRCMode -scOpTemp $vars($vars($corners(max),rc_corner),T) +# } +# } + + ################################################################### + # Set scaling factors ... for pre-route optimization, the detailed + # cap factor is set to the detailed clock cap factor. This will + # be reset post-route + ################################################################### + + set args "" + if {![catch {set arg $vars($corner,pre_route_res_factor)}]} { + append args " -preRoute_res $arg" + } + if {![catch {set arg $vars($corner,pre_route_cap_factor)}]} { + append args " -preRoute_cap $arg" + } + if {![catch {set arg $vars($corner,pre_route_clk_res_factor)}]} { + append args " -preRoute_clkres $arg" + } + if {![catch {set arg $vars($corner,pre_route_clk_cap_factor)}]} { + append args " -preRoute_clkcap $arg" + } + if {![catch {set arg $vars($corner,post_route_res_factor)}]} { + append args " -postRoute_res " + if {[llength $arg] > 1} { + append args "\"[lindex $arg 2],[lindex $arg 1],[lindex $arg 0]\"" + } else { + append args $arg + } + } + if {![catch {set arg $vars($corner,post_route_cap_factor)}]} { + append args " -postRoute_cap " + if {[llength $arg] > 1} { + append args "\"[lindex $arg 2],[lindex $arg 1],[lindex $arg 0]\"" + } else { + append args $arg + } + } + if {![catch {set arg $vars($corner,post_route_clk_res_factor)}]} { + append args " -postRoute_clkres " + if {[llength $arg] > 1} { + append args "\"[lindex $arg 2],[lindex $arg 1],[lindex $arg 0]\"" + } else { + append args $arg + } + } + if {![catch {set arg $vars($corner,post_route_clk_cap_factor)}]} { + append args " -postRoute_clkcap " + if {[llength $arg] > 1} { + append args "\"[lindex $arg 2],[lindex $arg 1],[lindex $arg 0]\"" + } else { + append args $arg + } + } + if {![catch {set arg $vars($corner,post_route_xcap_factor)}]} { + append args " -postRoute_xcap " + if {[llength $arg] > 1} { + append args "\"[lindex $arg 2],[lindex $arg 1],[lindex $arg 0]\"" + } else { + append args $arg + } + } + if {$args != ""} { + set command "setRCFactor $args\n" + append commands [FF::wrap_command $vars(step),set_rc_factor $command] + } + set command [FF_EDI::derate_timing minmax] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } + mmmc { + if {$vars(verbose)} { + append commands "#\n" + append commands "# CREATING RC CORNERS ...\n" + append commands "#\n" + } + foreach rc $vars(rc_corners) { +# set command "\n" + set command "" + set non_command "" + if {[info exists vars($rc,scale_tcl)]} { + append command "create_rc_corner -name $rc" +# append command " -cap_table $vars($rc,cap_table) " + foreach option "cap_table T qx_tech_file qx_conf_file qx_lib_file" { + if {![catch {set arg $vars($rc,$option)}]} { + append command " -$option $arg" + } + } + append command "\n" + append command [FF::source_plug "$rc,scale_tcl"] + } else { + append command "create_rc_corner -name $rc" + foreach option "cap_table T qx_tech_file qx_conf_file qx_lib_file" { + if {![catch {set arg $vars($rc,$option)}]} { + append command " -$option $arg" + } + } +# append command "\n" +# append command " -cap_table $vars($rc,cap_table) " + if {![catch {set arg $vars($rc,pre_route_res_factor)}]} { + append command " -preRoute_res $arg" + } else { + append non_command "# -preRoute_res \$vars($rc,pre_route_res_factor)\n" + } + if {![catch {set arg $vars($rc,pre_route_cap_factor)}]} { + append command " -preRoute_cap $arg" + } else { + append non_command "# -preRoute_cap \$vars($rc,pre_route_cap_factor)\n" + } + if {![catch {set arg $vars($rc,pre_route_clk_res_factor)}]} { + append command " -preRoute_clkres $arg" + } else { + append non_command "# -preRoute_clkres \$vars($rc,pre_route_clk_res_factor)\n" + } + if {![catch {set arg $vars($rc,pre_route_clk_cap_factor)}]} { + append command " -preRoute_clkcap $arg" + } else { + append non_command "# -preRoute_clkcap \$vars($rc,pre_route_clk_cap_factor)\n" + } + if {![catch {set arg $vars($rc,post_route_res_factor)}]} { + append command " -postRoute_res " + if {[llength $arg] > 1} { + append command "\"$arg\"" + } else { + append command $arg + } + } else { + append non_command "# -postRoute_res \$vars($rc,post_route_res_factor)\n" + } + if {![catch {set arg $vars($rc,post_route_cap_factor)}]} { + append command " -postRoute_cap " + if {[llength $arg] > 1} { + append command "\"$arg\"" + } else { + append command $arg + } + } else { + append non_command "# -postRoute_cap \$vars($rc,post_route_cap_factor)\n" + } + if {![catch {set arg $vars($rc,post_route_clk_res_factor)}]} { + append command " -postRoute_clkres " + if {[llength $arg] > 1} { + append command "\"$arg\"" + } else { + append command $arg + } + } else { + append non_command "# -postRoute_res \$vars($rc,post_route_clk_res_factor)\n" + } + if {![catch {set arg $vars($rc,post_route_clk_cap_factor)}]} { + append command " -postRoute_clkcap " + if {[llength $arg] > 1} { + append command "\"$arg\"" + } else { + append command $arg + } + } else { + append non_command "# -postRoute_clkcap \$vars($rc,post_route_clk_cap_factor)\n" + } + if {![catch {set arg $vars($rc,post_route_xcap_factor)}]} { + append command " -postRoute_xcap " + if {[llength $arg] > 1} { + append command "\"$arg\"" + } else { + append command $arg + } + } else { + append non_command "# -postRoute_xcap \$vars($rc,post_route_xcap_factor)\n" + } + } + append command "\n" + append commands [FF::wrap_command $vars(step),create_rc_corner $command] + if {$non_command != ""} { + append commands "#------------------------------------------------\n" + append commands "# Additional (unused) options ....\n" + append commands "#------------------------------------------------\n" + append commands $non_command + append commands "#------------------------------------------------\n" + } + } + if {![info exists vars(cpf_file)] || ([info exists vars(cpf_file)] && !$vars(cpf_timing))} { + ################################################################ + # CPF_TIMING == FALSE + ################################################################ + set command "" + if {$vars(verbose)} { + append command "#\n" + append command "# CREATING LIBRARY SETS ...\n" + append command "#\n" + } + append commands $command + foreach set $vars(library_sets) { + set command "" + append command "create_library_set -name $set -timing \[list " + append command "$vars($set,timing) " + append command "\]\n" + append commands [FF::wrap_command $vars(step),create_library_set $command] + } + if {[info exists vars(opconds)]} { + if {$vars(verbose)} { + append command "#\n" + append command "# CREATING OPERATING CONDITIONS ...\n" + append command "#\n" + } + foreach opcond $vars(opconds) { + set command "create_op_cond -name $opcond" + # We already checked so we know these options exist + foreach option "library_file P V T" { + append command " -$option $vars($opcond,$option)" + } + append command "\n" + append commands [FF::wrap_command $vars(step),create_op_cond $command] + } + } + set command "" + if {$vars(verbose)} { + append command "#\n" + append command "# CREATING DELAY CORNERS ...\n" + append command "#\n" + } + append commands $command + foreach c $vars(delay_corners) { +# if {![info exists vars($c,rc_corner)]} { +# puts "Skipping delay corners $c" +# Puts " ERROR: RC corner for delay corner $c missing" +# continue +# } + set command "" + append command "create_delay_corner -name $c" + if {![catch {set arg $vars($c,library_set)}]} { + append command " -library_set $arg" + } elseif {![catch {set early $vars($c,early_library_set)}] && + ![catch {set late $vars($c,late_library_set)}]} { + append command " -early_library_set $early" + append command " -late_library_set $late" + } else { + Puts " ERROR: Library sets for delay corner $c not defined properly" + } + append command " -rc_corner $vars($c,rc_corner)" + if {![catch {set opcond $vars($c,opcond)}] && + ![catch {set library $vars($c,opcond_library)}]} { + append command " -opcond_library $library" + append command " -opcond $opcond" + } else { + if {![catch {set early $vars($c,early_opcond_library)}] && + ![catch {set late $vars($c,late_opcond_library)}]} { + append command " -early_opcond_library $early" + append command " -late_opcond_library $late" + } + if {![catch {set early_opcond $vars($c,early_opcond)}] && + ![catch {set late_opcond $vars($c,late_opcond)}]} { + append command " -early_opcond $early_opcond" + append command " -late_opcond $late_opcond" + } + } + append command "\n" + if {![catch {set domains $vars($c,power_domains)}]} { + set attribute_list "library_set opcond_library opcond irdrop_file \ + late_library_set early_library_set \ + late_opcond_library early_opcond_library \ + late_opcond early_opcond late_irdrop_file early_irdrop_file" + foreach domain $domains { + append command " update_delay_corner -name $c -power_domain \"$domain\"" + foreach attr $attribute_list { + if {[info exists vars($c,$domain,$attr)]} { + append command " -$attr $vars($c,$domain,$attr)" + } + } + append command "\n" + } +# if {![catch {set opcond $vars($domain,opcond)}] && +# ![catch {set library $vars($domain,opcond_library)}]} { +# append command " -opcond_library $library" +# append command " -opcond $opcond" +# } + } + append commands [FF::wrap_command $vars(step),create_delay_corner $command] + } + + set command "" + if {$vars(verbose)} { + append command "#\n" + append command "# CREATING CONSTRAINT MODES ...\n" + append command "#\n" + } + append commands $command + + # Variable ccommand captures the constraint creation for the view_definition.tcl + # Variable ucommand capture the constraint updates for hier/ilm flows + #------------------------------------------------------------------------------------ + set ccommand "" + + set active_views [list] + set active_modes [list] + + # Get modes actually used ... (changed from active to all views) + foreach view [concat $vars(setup_analysis_views) $vars(hold_analysis_views)] { + if {[lsearch $active_views $view] == -1} { +# lappend active_views $view + if {[lsearch $active_modes $vars($view,constraint_mode)] == -1} { + lappend active_modes $vars($view,constraint_mode) + } + } + } + set flatten_ilm 0 + foreach constraint_mode $active_modes { + if {!$vars(ilm)} { + # Default flat flow + if {[info exists vars($constraint_mode,pre_cts_sdc)]} { + set command "create_constraint_mode -name $constraint_mode " + append command "-sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\] " + append command "\n" + append ccommand [FF::wrap_command $vars(step),create_constraint_mode $command] + } else { + puts "Constraint file not found for $constraint_mode ..." + } + if {$vars(rc)} { + if {[info exists vars($constraint_mode,synth_sdc)]} { + set command "create_constraint_mode -name $constraint_mode " + append command "-sdc_files \[list $vars($constraint_mode,synth_sdc)\] " + append command "\n" + append ccommand [FF::wrap_command $vars(step),create_constraint_mode $command] + } else { + puts "Constraint file not found for $constraint_mode ..." + } + } + } else { + set sdcs "" + # ILM flow + if {[info exists vars(partition_list)]} { + # Hierarchy + ILMs + if {[info exists vars($constraint_mode,pre_cts_ilm_sdc)]} { +# append command "-sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\] " + exec /bin/touch empty.sdc + append sdcs "-sdc_files empty.sdc " + append sdcs "-ilm_sdc_files \[list $vars($constraint_mode,pre_cts_ilm_sdc)\]\n" + } else { + exec /bin/touch empty.sdc + append sdcs "-sdc_files empty.sdc " + append sdcs "-ilm_sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\]\n" + } + if {$vars(top)} { + if {![info exists ucommand]} { set ucommand ""} + set command "update_constraint_mode -name $constraint_mode " + append command $sdcs + append ucommand [FF::wrap_command $vars(step),update_constraint_mode $command] +# append ucommand [FF::wrap_command $vars(step),flatten_ilm "flattenIlm\nsetIlmMode -keepFlatten true\n"] + set dynamic_update 1 +# continue + } else { + set command "create_constraint_mode -name $constraint_mode " + append command $sdcs + append ccommand [FF::wrap_command $vars(step),create_constraint_mode $command] + } + } else { + # ILM only + set command "create_constraint_mode -name $constraint_mode " + if {[info exists vars($constraint_mode,pre_cts_ilm_sdc)]} { +# append command "-sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\] " + exec /bin/touch empty.sdc + append sdcs "-sdc_files empty.sdc " + append sdcs "-ilm_sdc_files \[list $vars($constraint_mode,pre_cts_ilm_sdc)\]\n" + } else { + exec /bin/touch empty.sdc + append sdcs "-sdc_files empty.sdc " + append sdcs "-ilm_sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\]\n" + } +# if {[info exists vars($constraint_mode,pre_cts_sdc)]} { +# set command "create_constraint_mode -name $constraint_mode " +# append command "-sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\] " +# append command "\n" +# append ccommand [FF::wrap_command $vars(step),create_constraint_mode $command] +# } else { +# puts "Constraint file not found for $constraint_mode ..." +# } + append command $sdcs + append ccommand [FF::wrap_command $vars(step),create_constraint_mode $command] +# append ccommand [FF::wrap_command $vars(step),flatten_ilm "flattenIlm\nsetIlmMode -keepFlatten true\n"] + } + } + } + + append commands $ccommand + + if {[info exists dynamic_update] && $dynamic_update} { +# set command "" +# append command "foreach mode \[all_constraint_modes\] {\n" +# append command " update_constraint_mode -name \$mode -sdc_files empty.sdc \\\n" +# append command " -ilm_sdc_files \[get_constraint_mode \$mode -sdc_files\]\n" +# append command "}\n" +# append ucommand [FF::wrap_command $vars(step),update_constraint_mode $command] + + set command "" + append command "foreach mode \[all_constraint_modes] \{\n" + append command " foreach view \[all_analysis_views] \{\n" + append command " set m \[regsub _\$view \$mode \"\"\]\n" + append command " if \{( \$m != \$mode ) && ( \[lsearch \[all_constraint_modes\] \$m\] != -1) \} \{\n" + append command " update_constraint_mode -name \$mode -sdc_files empty.sdc -ilm_sdc_files \[get_constraint_mode \$m -ilm_sdc_files\]\n" + append command " \}\n" + append command " \} \n" + append command "\} \n" + append ucommand [FF::wrap_command $vars(step),dynamic_update $command] + + if {$vars(ilm)} { +# append ucommand [FF::wrap_command $vars(step),flatten_ilm "flattenIlm\nsetIlmMode -keepFlatten true\n"] + append ucommand [FF::wrap_command $vars(step),flatten_ilm "flattenIlm\n"] + } + } + + if {($vars(user_mode) == "hier") && ![info exists vars(view_definition_tcl)]} { + if {($vars(step) == "assemble") || ($vars(step) == "rebudget") || ($vars(step) == "assemble_flexilm") || ($vars(step) == "partition_place") || ($vars(step) == "model_gen") || ($vars(step) == "prototype")} { + # Create mmmc file for partition and assemble step + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set mmmc_file $vars(script_dir)/incr_view_definition.tcl + set op [open $mmmc_file w] + puts $op [FF::pretty_print $commands 1] + close $op + } else { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file $vars(view_definition_tcl) + } else { + set mmmc_file $vars(script_dir)/view_definition.tcl + set op [open $mmmc_file w] + puts $op [FF::pretty_print $commands 1] + close $op + } + } + #return $commands + } else { + # Return only constraint mode updates for top level flow + if {[info exists ucommand]} { + return $ucommand + } + } + } else { + if {[info exists vars(view_definition_tcl)]} { + if {[info exists ucommand]} { + return $ucommand + } + } + } + + if {![info exists vars(power_analysis_view)]} { + set vars(power_analysis_view) "" + } + set vars(all_analysis_views) \ + [lsort -unique [concat $vars(setup_analysis_views) \ + $vars(hold_analysis_views) \ + $vars(power_analysis_view)]] + set command "" + if {$vars(verbose)} { + append command "#\n" + append command "# CREATING ANALYSIS VIEWS ...\n" + append command "#\n" + } + foreach view $vars(all_analysis_views) { +# append command "if {\[lsearch \[all_analysis_views\] $view\] == -1} {\n" + append command " create_analysis_view" + append command " -name $view" + append command " -constraint_mode $vars($view,constraint_mode)" + append command " -delay_corner $vars($view,delay_corner)\n" +# append command "}\n" + } + append commands [FF::wrap_command $vars(step),create_analysis_view $command] + if {![info exists vars(gen_postload)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + # Legacy support, so no IEEE 1801 support + # append commands [FF_EDI::load_power_intent] + set command "" + foreach c $vars(delay_corners) { + if {![catch {set domains $vars($c,power_domains)}]} { + foreach domain $domains { + append command " update_delay_corner -name $c -power_domain \"$domain\"\n" + # if {![catch {set opcond $vars($domain,opcond)}] && + # ![catch {set library $vars($domain,opcond_library)}]} { + # append command " -opcond_library $library" + # append command " -opcond $opcond" + # } + } + } + } + append commands [FF::wrap_command init,update_delay_corner $command] + } + } + } else { + ################################################################ + # CPF_TIMING == TRUE + # Since the delay corner names are derived from the CPF, they + # are not known. However, they can be retrieved from the + # analysis_views + ################################################################ +# if {$vars(verbose)} { +# append commands "# UPDATING DELAY CORNERS ...\n" +# } + if {![info exists vars(delay_corners)]} { + set vars(delay_corners) [FF::[get_by_suffix vars ",rc_corner"]] + } + set command "" + foreach corner $vars(delay_corners) { + append command "if {\[lsearch -exact \[all_delay_corners\] $corner\] != -1} {\n" + append command " update_delay_corner -name $corner -rc_corner $vars($corner,rc_corner)\n" + append command "}\n" + } + append commands [FF::wrap_command $vars(step),update_delay_corner $command] + ################################################################### + # Update constraints modes if an ILM flow + ################################################################### + set ccommand "" + foreach constraint_mode $vars(constraint_modes) { + if {$vars(ilm)} { + if {[info exists vars(partition_list)]} { + set command "update_constraint_mode -name $constraint_mode " + } else { + set command "create_constraint_mode -name $constraint_mode " + } + if {[info exists vars($constraint_mode,pre_cts_ilm_sdc)]} { + append command "-sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\] " + append command "-ilm_sdc_files \[list $vars($constraint_mode,pre_cts_ilm_sdc)\] " + } else { + exec /bin/touch empty.sdc + append command "-sdc_files empty.sdc " + append command "-ilm_sdc_files \[list $vars($constraint_mode,pre_cts_sdc)\] " + } + append command "\n" + if {[info exists vars(partition_list)]} { + append ccommand [FF::wrap_command $vars(step),update_constraint_mode $command] + } else { + append ccommand [FF::wrap_command $vars(step),create_constraint_mode $command] + } + } + } + + ################################################################### + # Return early for partition implementation flows ... + ################################################################### + if {(($vars(mode) == "hier") || ([info exists vars(hier)] && $vars(hier))) && ($vars(step) != "partition_place")} { + set commands $ccommand + return $commands + } else { + append commands $ccommand + } + } + + ################################################################### + # Update library_sets with SI libraries if defined + ################################################################### + +# if {$vars(verbose)} { +# append commands "# UPDATING LIBRARY SETS ...\n" +# } + set command "" + foreach set $vars(library_sets) { + if {([info exists vars($set,si)] && ($vars($set,si) != "")) || \ + ([info exists vars($set,socv)] && ($vars($set,socv) != "")) || \ + ([info exists vars($set,aocv)] && ($vars($set,aocv) != ""))} { + append command "update_library_set -name $set" + } + if {[info exists vars($set,socv)] && ($vars($set,socv) != "")} { + append command " -socv \[list" + foreach file $vars($set,socv) { + append command " $file" + } + append command "\]" + } + if {[info exists vars($set,aocv)] && ($vars($set,aocv) != "")} { + append command " -aocv \[list" + foreach file $vars($set,aocv) { + append command " $file" + } + append command "\]" + } + if {[info exists vars($set,si)] && ($vars($set,si) != "")} { + append command " -si \[list" + foreach file $vars($set,si) { + append command " $file" + } + append command "\]" + } + append command "\n" + } + append commands [FF::wrap_command $vars(step),update_library_set $command] + + if {$vars(flow) != "mmmc"} { + append commands [FF_EDI::update_timing mmmc] + } +# set command [FF_EDI::derate_timing mmmc] +# append commands [FF::wrap_command $vars(step),derate_timing $command] + + ################################################################### + # Define setup / hold analysis views and enable the default views + # for each + ################################################################### + + append commands "set_analysis_view" + append commands " -setup \[list $vars(active_setup_views)\]" + append commands " -hold \[list $vars(active_hold_views)\]\n" +# set command "set_default_view -setup $vars(default_setup_view) -hold $vars(default_hold_view)\n" +# append commands [FF::wrap_command $vars(step),set_default_view $command] +# set command [FF_EDI::derate_timing mmmc] +# append commands [FF::wrap_command $vars(step),derate_timing $command] +# if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { +# set command "set_power_analysis_mode -analysis_view $vars(power_analysis_view)\n" +# append commands [FF::wrap_command $vars(step),set_power_analysis_mode $command] +# } + file mkdir $vars(script_dir) + if {[lindex [split $vars(version) "."] 0] <= 10} { + if {$vars(flat) != "full"} { + set op [open $vars(script_dir)/mmmc.tcl w] + puts $op [FF::pretty_print $commands 1] + close $op +# set commands "source \$vars(script_dir)/mmmc.tcl\n" + set commands "source $vars(script_dir)/mmmc.tcl\n" + } + } else { + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set mmmc_file $vars(script_dir)/incr_view_definition.tcl + set op [open $mmmc_file w] + puts $op [FF::pretty_print $commands 1] + close $op + return "source $vars(script_dir)/incr_view_definition.tcl\n" + } else { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file $vars(view_definition_tcl) + } else { + set mmmc_file $vars(script_dir)/view_definition.tcl + set op [open $mmmc_file w] + puts $op [FF::pretty_print $commands 1] + close $op + } + } + return +# return $commands + } + } + default { + puts " INVALID OPTION ... MUST BE EITHER minmax OR mmmc" + } + } + return $commands + } + + proc update_rc_corners {} { + + global vars + + foreach rc_corner [all_rc_corners] { + if {$rc_corner != "default_rc_corner"} { + set update false + set command "update_rc_corner -name $rc_corner " + if {[get_rc_corner $rc_corner -cap_table] != $vars($rc_corner,cap_table)} { + set update true + append command "-cap_table $vars($rc_corner,cap_table) " + } + if {[get_rc_corner $rc_corner -preRoute_res] != $vars($rc_corner,pre_route_res_factor)} { + set update true + append command "-preRoute_res $vars($rc_corner,pre_route_res_factor) " + } + if {[get_rc_corner $rc_corner -preRoute_cap] != $vars($rc_corner,pre_route_cap_factor)} { + set update true + append command "-preRoute_cap $vars($rc_corner,pre_route_cap_factor) " + } + if {[get_rc_corner $rc_corner -postRoute_res] != $vars($rc_corner,post_route_res_factor)} { + set update true + append command "-postRoute_res \"$vars($rc_corner,post_route_res_factor)\" " + } + if {[get_rc_corner $rc_corner -postRoute_cap] != $vars($rc_corner,post_route_cap_factor)} { + set update true + append command "-postRoute_cap \"$vars($rc_corner,post_route_cap_factor)\" " + } + if {[get_rc_corner $rc_corner -preRoute_clkres] != $vars($rc_corner,pre_route_clk_res_factor)} { + set update true + append command "-preRoute_clkres $vars($rc_corner,pre_route_clk_res_factor) " + } + if {[get_rc_corner $rc_corner -preRoute_clkcap] != $vars($rc_corner,pre_route_clk_cap_factor)} { + set update true + append command "-preRoute_clkcap $vars($rc_corner,pre_route_clk_cap_factor) " + } + if {[get_rc_corner $rc_corner -postRoute_clkres] != $vars($rc_corner,post_route_clk_res_factor)} { + set update true + append command "-postRoute_clkres \"$vars($rc_corner,post_route_clk_res_factor)\" " + } + if {[get_rc_corner $rc_corner -postRoute_clkcap] != $vars($rc_corner,post_route_clk_cap_factor)} { + set update true + append command "-postRoute_clkcap \"$vars($rc_corner,post_route_clk_cap_factor)\" " + } + if {[get_rc_corner $rc_corner -postRoute_xcap] != $vars($rc_corner,post_route_xcap_factor)} { + set update true + append command "-postRoute_xcap \"$vars($rc_corner,post_route_xcap_factor)\" " + } + foreach option "T qx_tech_file qx_conf_file qx_lib_file" { + if {[info exists vars($rc_corner,$option)]} { + if {[get_rc_corner $rc_corner -$option] != $vars($rc_corner,$option)} { + set update true + append command "-$option $vars($rc_corner,$option) " + } + } + } + if {$update} { + uplevel #0 eval $command + } + } + } + } + proc reset_rc_corners {} { + + global vars + + foreach corner $vars(rc_corners) { + update_rc_corner -name $corner \ + -preRoute_res 1.0 \ + -preRoute_clkres 1.0 \ + -preRoute_cap 1.0 \ + -preRoute_clkcap 1.0 \ + -postRoute_res 1.0 \ + -postRoute_clkres 1.0 \ + -postRoute_cap 1.0 \ + -postRoute_clk_ap 1.0 \ + -postRoute_xcap 1.0 + } + } + proc add_views {} { + + global vars + + Puts " CREATING RC CORNERS ..." + foreach rc_corner $vars(rc_corners) { + if {[lsearch [all_rc_corners] $rc_corner] == -1} { + set command "create_rc_corner -name $rc_corner " + append command "-cap_table $vars($rc_corner,cap_table)\] " + append command "-preRoute_res $vars($rc_corner,pre_route_res_factor) " + append command "-preRoute_clkres $vars($rc_corner,pre_route_clk_res_factor) " + append command "-preRoute_cap $vars($rc_corner,pre_route_cap_factor) " + append command "-preRoute_clkcap $vars($rc_corner,pre_route_clk_cap_factor) " + append command "-postRoute_res \"$vars($rc_corner,post_route_res_factor)\" " + append command "-postRoute_clkres \"$vars($rc_corner,post_route_clk_res_factor)\" " + append command "-postRoute_cap \"$vars($rc_corner,post_route_cap_factor)\" " + append command "-postRoute_clkcap \"$vars($rc_corner,post_route_clk_cap_factor)\" " + append command "-postRoute_xcap $vars($rc_corner,post_route_xcap_factor) " + foreach option "T qx_tech_file qx_conf_file qx_lib_file" { + if {[info exists vars($rc_corner,$option)]} { + append command "-$option $vars($rc_corner,$option) " + } + } + uplevel #0 eval $command + } + } + + if {![FF::is_lp_flow] || \ + ([FF::is_lp_flow] && ([llength [all_analysis_views]] == 2))} { + + Puts " CREATING LIBRARY SETS ..." + foreach library_set $vars(library_sets) { + if {[lsearch [all_library_sets] $library_set] == -1} { + create_library_set -name $library_set \ + -timing $vars($library_set,timing) + } + } + + Puts " CREATING DELAY CORNERS ...\n" + foreach delay_corner $vars(delay_corners) { + if {[lsearch [all_delay_corners] $delay_corner] == -1} { + set command "create_delay_corner -name $delay_corner " + append command "-library_set $vars($delay_corner,library_set) " + append command "-rc_corner $vars($delay_corner,rc_corner) " + if {[info exists vars($delay_corner,opcond)] && [info exists vars($delay_corner,opcond_library)]} { + append command "-opcond_library $vars($delay_corner,opcond_library) " + append command "-opcond $vars($delay_corner,opcond) " + } + uplevel #0 eval $command + if {![catch {set domains $vars($c,power_domains)}]} { + set command " update_delay_corner -name $c -power_domains \"$domains\"" + uplevel #0 eval $command + } + } + } + + Puts " UPDATING CONSTRAINT MODES ..." + foreach mode $vars(constraint_modes) { + if {[lsearch [all_constraint_modes] $mode] == -1} { + if {[info exists vars($mode,pre_cts_sdc,full)]} { + append commands "create_constraint_mode " + append commands " -name $mode " + append commands " -sdc_files $vars($mode,pre_cts_sdc,full)\n" + } elseif {[info exists vars($mode,pre_cts_sdc)} { + append commands "create_constraint_mode " + append commands " -name $mode " + append commands " -sdc_files $vars($mode,pre_cts_sdc)\n" + } + } + } + + set vars(all_analysis_views) [lsort -uniq [concat $vars(setup_analysis_views) $vars(hold_analysis_views)]] + Puts " UPDATING ANALYSIS VIEWS ..." + + foreach analysis_view $vars(all_analysis_views) { + if {[lsearch [all_analysis_views] $analysis_view] == -1} { + create_analysis_view -name $analysis_view \ + -constraint_mode $vars($analysis_view,constraint_mode) \ + -delay_corner $vars($analysis_view,delay_corner) + } + } + } else { + + ############################################################################ + # Since the delay corner names are derived from the CPF, they are not + # known. However, they can be retrieved from the analysis_views + ############################################################################ + Puts " UPDATING DELAY CORNERS ..." + foreach corner $vars(delay_corners) { + Puts "Updating delay corner $corner with RC Corner $vars($corner,rc_corner) ..." + update_delay_corner -name $corner -rc_corner $vars($corner,rc_corner) + } + } + + ############################################################################ + # Update library_sets with SI libraries if defined + ############################################################################ + Puts " UPDATING LIBRARY SETS ..." + foreach library_set $vars(library_sets) { + if {[info exists vars($library_set,si)] && ($vars($library_set,si) != "")} { + update_library_set -name $library_set \ + -si $vars($library_set,si) + } + } + foreach library_set $vars(library_sets) { + if {[info exists vars($library_set,aocv)] && ($vars($library_set,aocv) != "")} { + update_library_set -name $library_set \ + -aocv $vars($library_set,aocv) + } + } + + + set_interactive_constraint_modes [all_constraint_modes -active] + + Puts " DERATING DELAY CORNERS ..." + FF_EDI::derate_timing mmmc + + if {$vars(flow) != "mmmc"} { + FF_EDI::update_timing mmmc + } + + ############################################################################ + # Define setup / hold analysis views and enable the default views for each + ############################################################################ + set_analysis_view -setup $vars(active_setup_views) -hold $vars(active_hold_views) + set_default_view -setup $vars(default_setup_view) -hold $vars(default_hold_view) + } + + proc get_power_domains_code {} { + + global vars + + set commands "set domains \[list\]\n" + append commands "dbForEachPowerDomain \[dbgHead\] domain {\n" + append commands " if {\[dbGroupHInstList \[dbPowerDomainName \$domain\]\] != \"0x0\"} {\n" + append commands " lappend domains \[dbPowerDomainName \$domain\]\n" + append commands " }\n" + append commands "}\n" + return $commands + } + + + proc get_clock_ports {} { + + global vars + + set commands "" + + if {!$vars(codegen) || ($vars(codegen) && ($vars(flat) != "none"))} { + + if {$vars(ilm)} { + if {$vars(step) != "cts"} { + append commands "setIlmType -model si\n" + } + } + append commands "set clock_ports \[list\]\n" + append commands "set clocks \[get_clocks *\]\n" + + append commands "foreach_in_collection clock \$clocks {\n" + append commands " set sources \[get_property \$clock sources\]\n" + append commands " foreach_in_collection source \$sources {\n" + append commands " set source_name \[get_property \$source hierarchical_name\]\n" + append commands " set source_type \[get_property \$source object_type\]\n" + append commands " if {\$source_type == \"port\"} {\n" + append commands " lappend clock_ports \$source_name\n" + append commands " }\n" + append commands " }\n" + append commands "}\n" + } else { + append commands "FF::get_clock_ports\n" + } + return $commands + } + + proc add_tie_cells {{mode true} {add true}} { + ######################################################################### + # This procedure inserts tie hi/lo cells based on information in the + # setup.tcl + ######################################################################### + + global vars + global errors + + set commands "" + if {$vars(verbose)} { + append commands "#\n" + append commands "# ADDING TIE CELLS\n" + append commands "#\n" + } + + set args "" + if {[info exists vars(tie_cells,max_distance)]} { + append args " -maxDistance $vars(tie_cells,max_distance)" + } + if {[info exists vars(tie_cells,max_fanout)]} { + append args " -maxFanout $vars(tie_cells,max_fanout)" + } + + if {[FF::is_lp_flow] && ([info exists vars(power_domains)] && ([llength $vars(power_domains)] > 1))} { + + # Get the set of tie cells to use, both domain-specific and generic. + + set all_tie_cells [list] + + set has_default false + if {![catch {set default_cells $vars(tie_cells)}]} { + set has_default true + lappend all_tie_cells $vars(tie_cells) + } + set has_specific false + foreach domain [FF::get_by_suffix vars ",tie_cells"] { + set cells $vars($domain,tie_cells) + lappend all_tie_cells $vars($domain,tie_cells) + if {![llength $cells]} { + continue + } + set has_specific true +# append command "set tie_cells($domain) \[list $cells\]\n" +# append commands $command + } + + # + # If there are no tie cells at all, there's nothing to do + # + + if {!$has_default && !$has_specific} { + return "" + } + + set all_tie_cells [lsort -unique [join $all_tie_cells]] + + # + # If there are no domain-specific entries, life is real simple + # + +# if {!$has_specific} { +# set command "setTieHiLoMode -cell \"$default_cells\" $args\n" +# append commands [FF::wrap_command $vars(step),set_tie_hi_lo_mode $command] +# if {$add} { +# foreach cell $default_cells { +# append commands "setDontUse $cell false\n" +# } +# if {[llength $vars(power_domains)] > 0} { +# foreach domain $vars(power_domains) { +# append commands " catch {addTieHiLo -powerDomain $domain -prefix $domain}\n" +# } +# } +# foreach cell $default_cells { +# append commands "setDontUse $cell true\n" +# } +# } +# } else { + foreach cell $default_cells { + append commands "setDontUse $cell false\n" + } + if {[llength $vars(power_domains)] > 0} { + foreach domain $vars(power_domains) { + if {[info exists vars($domain,tie_cells)]} { + set command "setTieHiLoMode -cell \"$vars($domain,tie_cells)\" $args\n" + } else { + if {[info exists default_cells]} { + set command "setTieHiLoMode -cell \"$default_cells\" $args\n" + } else { + continue + } + } + append commands [FF::wrap_command $vars(step),set_tie_hi_lo_mode $command] + append commands " catch {addTieHiLo -powerDomain $domain -prefix $domain}\n" + } + } + foreach cell $default_cells { + append commands "setDontUse $cell true\n" + } +# } + } elseif {![catch {set cells $vars(tie_cells)}]} { + set command "setTieHiLoMode -cell \"$cells\" $args\n" +# if {$mode} { + append commands [FF::wrap_command $vars(step),set_tie_hi_lo_mode $command] +# } + set command "foreach cell \{$cells\} {\n" + append command " setDontUse \$cell false\n" + append command "}\n" + append command "addTieHiLo\n" + append command "foreach cell \{$cells\} {\n" + append command " setDontUse \$cell true\n" + append command "}\n" + append commands $command + } else { + set commands "" + } + + return $commands + } + + proc add_filler_cells {} { + ######################################################################### + # This procedure inserts tie hi/lo cells based on information in the + # setup.tcl + ######################################################################### + + global vars + global errors + + set commands "" + + set ccommands "" + if {$vars(verbose)} { + append ccommands "#\n" + append ccommands "# ADD FILLER CELLS\n" + append ccommands "#\n" + } + + append commands $ccommands + + if {[FF::is_lp_flow] && ([info exists vars(power_domains)] && ([llength $vars(power_domains)] > 1))} { + + # Get the set of filler cells to use, both domain-specific and generic. + + set all_filler_cells [list] + + set has_default false + if {![catch {set default_cells $vars(filler_cells)}]} { + set has_default true + lappend all_filler_cells $vars(filler_cells) + } + set has_specific false + foreach domain [FF::get_by_suffix vars ",filler_cells"] { + set cells $vars($domain,filler_cells) + lappend all_filler_cells $vars($domain,filler_cells) + if {![llength $cells]} { + continue + } + set has_specific true +# append command "set filler_cells($domain) \[list $cells\]\n" +# append commands $command + } + + # + # If there are no filler cells at all, there's nothing to do + # + + if {!$has_default && !$has_specific} { + return "" + } + + set all_filler_cells [lsort -unique [join $all_filler_cells]] + + # + # If there are no domain-specific entries, life is real simple + # + +# if {!$has_specific} { +# set command "setFillerMode -core \"$default_cells\" -corePrefix FILL\n" +# append commands [FF::wrap_command $vars(step),set_filler_mode $command] +# if {$add} { +# foreach cell $default_cells { +# append commands "setDontUse $cell false\n" +# } +# if {[llength $vars(power_domains)] > 0} { +# foreach domain $vars(power_domains) { +# append commands " catch {addFiller -powerDomain $domain}\n" +# } +# } +# foreach cell $default_cells { +# append commands "setDontUse $cell true\n" +# } +# } +# } else { +# foreach cell $default_cells { +# append commands "setDontUse $cell false\n" +# } + if {[llength $vars(power_domains)] > 0} { + set default 0 + foreach domain $vars(power_domains) { + if {[info exists vars($domain,filler_cells)]} { + set command "setFillerMode -core \"$vars($domain,filler_cells)\" -corePrefix FILL\n" + set default 0 + } else { + if {[info exists default_cells]} { + if {!$default} { + set command "setFillerMode -core \"$default_cells\" -corePrefix FILL\n" + set default 1 + } else { + set command "" + } + } else { + continue + } + } + append commands [FF::wrap_command $vars(step),set_filler_mode $command] + append commands " catch {addFiller -powerDomain $domain}\n" + } + } +# foreach cell $default_cells { +# append commands "setDontUse $cell true\n" +# } +# } + } elseif {![catch {set cells $vars(filler_cells)}]} { + set command "setFillerMode -core \"$cells\" -corePrefix FILL\n" + append commands [FF::wrap_command $vars(step),set_filler_mode $command] +# set command "foreach cell \{$cells\} {\n" +# append command " setDontUse \$cell false\n" +# append command "}\n" + set command "addFiller\n" +# append command "foreach cell \{$cells\} {\n" +# append command " setDontUse \$cell true\n" +# append command "}\n" + append commands $command + } else { + set commands "" + } + + return $commands + } + + proc delete_filler_cells {} { + + global vars + + ######################################################################### + # Remove filler cells + ######################################################################### + + set command "deleteFiller\n" + append commands [FF::wrap_command $vars(step),delete_filler_cells $command] + return $commands + } + + proc insert_welltaps_endcaps {{outline false}} { + + global vars + + ######################################################################### + # Insert welltaps and pre/post endcaps + ######################################################################### + + global vars + global errors + global warnings + + set commands "" + + if {[FF::is_lp_flow] && ([info exist vars(power_domains)] && ([llength $vars(power_domains)] > 0))} { + + if {$vars(flat) == "full"} { + # + # Just like tie and filler cells, we can have power domain-specific + # cells and settings that we need to worry about. + # + +# append commands [FF_EDI::get_power_domains_code] + + # + # Get the set of domains that we need to worry about + # + + set pre [FF::get_by_suffix vars ",pre_endcap"] + set post [FF::get_by_suffix vars ",post_endcap"] + set endcaps [FF::lintersection $pre $post] + set welltaps [FF::get_by_suffix vars ",welltaps"] + + # + # For every domain in the union, we need to issue statements if that + # domain is one of the power domains in the design + # + # NOTE: We really don't need to worry about indenting the commands + # to look nice since the output routine will format it correctly + # + + set domains [FF::lunion $endcaps $welltaps] + + foreach domain $domains { +# append commands "if {\[lsearch \$domains $domain\] != -1} {\n" + + # + # Handle the end caps + # + + set std_args "-prefix $domain -powerDomain $domain" + set add " addEndCap $std_args" + if {![catch {set pre $vars($domain,pre_endcap)}] && + ![catch {set post $vars($domain,post_endcap)}]} { + append commands "$add -preCap $pre -postCap $post\n" + } elseif {![catch {set pre $vars(pre_endcap)}] && + ![catch {set post $vars(post_endcap)}]} { + append commands "$add -preCap $pre -postCap $post\n" + } + + set taps "" + if {[catch {set taps $vars($domain,welltaps)}]} { + catch {set taps $vars(welltaps)} + } + if {$taps == ""} { + append commands "\}\n" + continue + } + + # + # Handle well taps + # + + append commands " addWellTap $std_args -cell \[list $taps\]" + + if {![catch {set i $vars($domain,welltaps,cell_interval)}]} { + append commands " -cellInterval $i" + } elseif {![catch {set i $vars(welltaps,cell_interval)}]} { + append commands " -cellInterval $i" + } + + if {![catch {set offset $vars($domain,welltaps,row_offset)}] || + ![catch {set offset $vars(welltaps,row_offset)}]} { + append commands " -inRowOffset $offset" + } + + if {![catch {set checker $vars($domain,welltaps,checkerboard)}] || + ![catch {set checker $vars(welltaps,checkerboard)}]} { + if {$checker} { + append commands " -checkerboard" + } + } + append commands "\n" + + # + # Add a verify step, if requested + # + + if {![catch {set rule $vars($domain,welltaps,verify_rule)}] || + ![catch {set rule $vars(welltaps,verify_rule)}]} { + append commands "verifyWellTap -cells \[list $taps\]" + append commands " -powerDomain $domain" + append commands " -report $vars(rpt_dir)/$domain.welltap.rpt" + append commands " -rule $rule\n" + } + +# append commands "}\n" + } + + # + # We've taken care of all of the domains that we have explicit + # settings for. However, we may still have domains in the design + # that we know nothing explicit about. We need to handle these + # with a different set of code. + # + # We are going to cheat. Since the code we need is already written + # (below), we are going to recursively call this routine to get + # the skeleton that we need and wrap it up into a for-loop. This + # should get us something that looks like the following: + # set processed [list domain1 domain2 domain3] + # foreach domain $domains { + # if {[lsearch $processed_domains $domain] == -1} { + # addEndCap -powerDomain $domain -prefix $domain ... + # addWellTap -powerDomain $domain -prefix $domain ... + # verifyWellTap -powerDomain $domain ... + # } + # } + # + # NOTE: The output routine will take care of making this look pretty + # at the end. We don't need to worry about indentation for + # the inserted commands + # + +# set save $vars(cpf_file) +# unset vars(cpf_file) +# set default_insert [insert_welltaps_endcaps true] +# if {$default_insert != ""} { +# append commands "set processed_domains \[list $domains\]\n" +# append commands "foreach domain \$domains {\n" +# append commands " if {\[lsearch \$processed_domains \$domain\] == -1} {\n" +# append commands " $default_insert" +# append commands " }\n" +# append commands "}\n" +# } +# set vars(cpf_file) $save + } else { + append commands "ff_procs::insert_welltaps_endcaps\n" + } + } else { + # + # There is no CPF file that we need to worry about. However, if + # $outline is true, it means that the code (above) that handles power + # domains called this routine recursively, and we need to change + # the commands a little bit to include variables for power domains + # + # Start with the simple case: endcaps + # + + if {![catch {set pre $vars(pre_endcap)}] && + ![catch {set post $vars(post_endcap)}]} { + + append commands "addEndCap -preCap $pre -postCap $post" + if {!$outline} { + append commands " -prefix ENDCAP\n" + } else { + append commands " -prefix \$domain -powerDomain \$domain\n" + } + } + + # + # Now process welltaps + # + + if {![catch {set taps $vars(welltaps)}]} { + append commands "addWellTap -cell \[list $taps\]" + if {!$outline} { + append commands " -prefix WELLTAP" + } else { + append commands " -prefix \$domain -powerDomain \$domain" + } + + if {![catch {set max_gap $vars(welltaps,max_gap)}]} { + append commands " -maxGap $max_gap" + } elseif {![catch {set interval $vars(welltaps,cell_interval)}]} { + append commands " -cellInterval $interval" + } + + if {![catch {set offset $vars(welltaps,row_offset)}]} { + append commands " -inRowOffset $offset" + } + + if {![catch {set checker $vars(welltaps,checkerboard)}]} { + if {$checker} { + append commands " -checkerboard" + } + } + append commands "\n" + + # + # If a verify request has been made, create the command to + # do so. Again, take into account the potential for a recursive + # call to this routine. + # + + if {![catch {set rule $vars(welltaps,verify_rule)}]} { + append commands "verifyWellTap -cells \[list $taps\] " + append commands " -report $vars(rpt_dir)/" + if {!$outline} { + append commands "welltap.rpt" + } else { + append commands "\$domain.welltap.rpt -powerDomain \$domain" + } + append commands " -rule $rule\n" + } elseif {!$outline} { +# puts " Cannot run verifyWellTap because vars(welltaps,verify_rule) is not defined" + set warnings($vars(warning_count)) "Cannot run verifyWellTap because vars(welltaps,verify_rule) is not defined" + incr vars(warning_count) + } + } + } + + # + # If we created any commands to be executed, prefix the commands with a + # header + # + + if {($commands != "") && !$outline} { + set body $commands + + set commands "" + if {$vars(verbose)} { + append commands "#\n" + append commands "# INSERTING WELLTAPS AND/OR ENDCAPS\n" + append commands "#\n" + } + append commands $body + } + + return $commands + } + + proc route_secondary_pg_nets {} { + + global vars + global errors + + # + # Don't try to route unless the proper flags are in place to do so + # + + if {![info exists vars(route_secondary_pg_nets)] || + !$vars(route_secondary_pg_nets)} { + return "" + } + + set commands "# ROUTING SECONDARY POWER NETS ...\n" + + # + # Enable global pin pairs (if defined) + # + + if {[catch {set arg $vars(secondary_pg,cell_pin_pairs)}]} { + puts " ==========================================================" + puts " ERROR: No cell/pin pairs defined. Please define cell/pin" + puts " pairs in your setup.tcl using the variable" + puts " vars(secondary_pg,cell_pin_pairs)" + puts " ==========================================================" + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + append commands "setPGPinUseSignalRoute $arg\n" + + # + # Build commands for individual nets (if defined) + # + + if {[info exists vars(secondary_pg,nets)]} { + foreach net $vars(secondary_pg,nets) { + if {![catch {set arg $vars($net,cell_pin_pairs)}]} { + append commands "setPGPinUseSignalRoute $arg\n" + } + } + set nets $vars(secondary_pg,nets) + set netFormat " -nets %s" + } else { + set nets [list "secondary_pg"] + set netFormat "" + } + + foreach net $nets { + set route "routePGPinUseSignalRoute" + append route [format $netFormat $net] + catch {append route " -pattern $vars($net,pattern)"} + catch {append route " -maxFanout $vars($net,max_fanout)"} + catch {append route " -nonDefaultRule $vars($net,non_default_rule)"} + append commands "$route\n" + } + return $commands + } + + proc add_power_switches {{domains ""}} { + + global vars + global errors + global map + + source $vars(script_path)/ETC/INNOVUS/map_options.tcl + + if {$domains == ""} { + append commands [FF_EDI::get_power_domains_code] +# eval [FF::get_power_domains_code] + } + + foreach domain $domains { + if {[info exists vars($domain,switchable)] && + $vars($domain,switchable)} { + set type $vars($domain,switch_type) + + deletePowerSwitch -$type -powerDomain $domain + + set command "addPowerSwitch -powerDomain $domain -$type" + + if {[info exists vars($domain,checker_board)] && + $vars($domain,checker_board)} { + append command " -checkerBoard" + } + if {[info exists vars($domain,back_to_back_chain)] && + $vars($domain,back_to_back_chain)} { + append command " -backToBackChain" + } + if {[info exists vars($domain,loop_back_at_end)] && + $vars($domain,loop_back_at_end)} { + append command " -loopbackAtEnd" + } + if {[info exists vars($domain,check_height)] && + !$vars($domain,check_height)} { + append command " -noDoubleHeightCheck" + } + if {[info exists vars($domain,verify_rows)] && + !$vars($domain,verify_rows)} { + append command " -noRowVerify" + } + if {[info exists vars($domain,enable_chain)] && + !$vars($domain,enable_chain)} { + append command " -noEnableChain" + } + + foreach option [array names map] { + if {[info exists vars($domain,$option)]} { + append command " -$map($option) $vars($domain,$option)" + } + } + + uplevel #0 eval $command + } + } + } + + proc run_clock_eco {args} { + + global vars + global errors + + if {[llength $args] != 1} { + puts " Internal error in run_clock_eco. Wrong number of args." + exit -111 + } + + set commands "" +# append commands "# RUNNING CLOCK ECO\n" + switch $args { + "post_route" { + append commands [FF_EDI::delete_filler_cells] + append commands "ckECO -postRoute -useSpecFileCellsOnly\n" + append commands [FF_EDI::add_filler_cells] + append commands "changeClockStatus -all -noFixedNetWires\n" + } + "post_cts" { + append commands "ckECO -postCTS -useSpecFileCellsOnly\n" + } + default { + puts " Internal error in run_clock_eco." + puts " Invalid argument; valid arguments are post_cts and post_route." + exit -111 + } + } + # if {$vars(codegen)} { + return $commands + # } else { + # uplevel #0 eval $commands + # } + } + + ############################################################################ + # Main foundation flow step procedures + ############################################################################ + + proc run_syn_map {{format 1}} { + + global vars + global env + global errors + + set vars(step) syn_map + + set commands "" + + append commands "proc Puts {args} {puts \$args}\n" + + append commands "puts \[get_attr program_version /\]\n" + + ## enable multi processing + append commands "set hostlist \[lrepeat $vars(local_cpus) localhost\]\n" + append commands "set_attribute super_thread_servers \$hostlist /\n" + + if {$vars(capture_metrics)} { + append commands "\num::enable_metrics -on\n" + append commands "um::push_snapshot_stack\n" + } + append commands [FF::source_plug pre_syn_setup_tcl] + + set command "set_attribute information_level 1 /\n" + append command "set_attribute source_verbose false /\n" + append command "set_attribute -quiet print_error_info false /\n" + append command "set_attribute -quiet echo_commands false /\n" + append command "set_attribute mesg_coloring false /\n" + append command "set_attribute qos_report_basic_cost_groups true /\n" + + set command "set_attribute lib_lef_consistency_check_enable true /\n" + append command "set_attribute script_search_path {./} /\n" + + append command "suppress_messages {LBR-30 LBR-31 LBR-170 LBR-72 LBR-155 PHYS-210 PHYS-256 LBR-201 LBR-34 LBR-83 LBR-40 LBR-162 LBR-122}\n" + append command "redirect /dev/null {set map_fancy_names 1}\n" + + append commands [FF::source_plug post_syn_setup_tcl] + + append commands [FF::source_plug pre_syn_load_lib_tcl] + + set command "\nset_attribute library \"\\\n" + foreach lib $vars($vars($vars($vars(default_setup_view),delay_corner),library_set),timing) { + append command " $lib \\\n" + } + append command "\"\n" + append commands [FF::wrap_command $vars(step),read_lib $command] + + set command "\nset_attribute lef_library \"\\\n" + foreach lef $vars(lef_files) { + append command " $lef \\\n" + } + append command "\"\n" + append commands [FF::wrap_command $vars(step),read_lef $command] + + set command "\nset_attribute qrc_tech_file $vars($vars($vars($vars(default_setup_view),delay_corner),rc_corner),qx_tech_file)\n" + append commands [FF::wrap_command $vars(step),read_qrc $command] + + if {[info exists vars(dont_use_list)] && $vars(dont_use_list) != "" } { + foreach cell $vars(dont_use_list) { + append commands "set_attribute avoid true \[find / -libcell $cell\]\n" + } + } + + append commands [FF::source_plug post_syn_load_lib_tcl] + + if {[info exists vars(cpf_file)]} { + set command "read_power_intent -module $vars(design) -cpf $vars(cpf_file)\n" + append commands [FF::wrap_command $vars(step),read_power_intent $command] + } + + if {[info exists vars(ieee1801_file)]} { + set command "read_power_intent -module $vars(design) -1801 $vars(ieee1801_file)\n" + append commands [FF::wrap_command $vars(step),read_power_intent $command] + } + + if {[info exists vars(hdl_search_path)]} { + append commands "set_attribute hdl_search_path \"$vars(hdl_search_path)\" /\n" + } + if {[info exists vars(hdl_file_list)]} { + set command "read_hdl -v2001 \"$vars(hdl_file_list)\"\n" + append commands [FF::wrap_command $vars(step),read_hdl $command] + } else { + append commands [FF::source_plug syn_load_rtl_tcl] + } + + append commands "\n#set read_def_libcell_mismatch_error 0\n" + + if {0} { + set command "#set_attribute gen_module_prefix _RC_ /\n" + append command "#set_attribute hdl_array_naming_style %s_%d /\n" + append command "#set_attribute hdl_reg_naming_style %s_reg%s /\n" + append command "#set_attribute hdl_use_if_generate_prefix false /\n" + append command "#set_attribute hdl_use_for_generate_prefix true /\n" + append command "#set_attribute hdl_use_block_prefix false /\n" + append command "#set_attribute hdl_max_loop_limit 8096 /\n" + append command "#set_attribute hdl_generate_index_style %s_%d_ /\n" + append command "#set_attribute hdl_generate_separator _ /\n" + append command "#set_attribute hdl_instance_array_naming_style %s_%d_ /\n" + append command "#set_attribute hdl_parameter_naming_style _%s%d /\n" + append command "#set_attribute hdl_record_naming_style %s\[%s\] /\n" + append command "#set_attribute hdl_use_techelt_first true /\n" + append command "#set_attribute hdl_error_on_blackbox true /\n" + append command "#set_attribute hdl_track_filename_row_col false /\n" + append command "#set_attribute hdl_enable_proc_name false /\n" + append command "#set_attribute hdl_error_on_latch false /\n" + append command "#set_attribute hdl_unconnected_input_port_value none /\n" + append command "#set_attribute hdl_undriven_output_port_value none /\n" + append command "#set_attribute hdl_undriven_signal_value none /\n" + } + + append commands [FF::wrap_command $vars(step),set_hdl_attributes $command] + + append commands [FF::source_plug pre_syn_load_elab_tcl] + + append commands "\nelaborate $vars(design)\n" + + append commands [FF::source_plug post_syn_load_elab_tcl] + + append commands "write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/elab.db\n" + + append commands "redirect $vars(rpt_dir)/check_design.rpt { check_design -multidriven -undriven -unresolved }\n" + append commands "redirect $vars(rpt_dir)/report_datapath.rpt { report datapath -all -max_width {{filename 512}} }\n" + + +# append commands "#set treat_invalid_from_to_as_through 1\n" + + if {[info exists vars(clock_gate_cells)]} { + set command "set_attribute lp_clock_gating_cell \[find /lib* -libcell $vars(clock_gate_cells)\] /designs/*\n\n" + append command "set_attribute lp_insert_clock_gating true /\n" + append commands [FF::wrap_command $vars(step),insert_clock_gating $command] + } + + if {[info exists vars(leakage_power_effort)] && ($vars(leakage_power_effort) != "none")} { + set command "set_attribute lp_multi_vt_optimization_effort $vars(leakage_power_effort) /\n" + append commands [FF::wrap_command $vars(step),leakage_power_effort $command] + } + append command "#set_attribute lp_insert_operand_isolation false /\n" + append command "#set_attribute lp_power_analysis_effort low /\n" + append command "#set_attribute lp_clock_gating_hierarchical false /\n" + append command "#set_attribute lp_clock_gating_auto_cost_group_initial_target 0 /designs/*\n" + append command "#set_attribute lp_clock_gating_max_flops infinity /designs/$vars(design)\n" + append command "#set_attribute lp_clock_gating_min_flops 3 /designs/$vars(design)\n" + append command "#set_attribute lp_clock_gating_auto_path_adjust fixed /designs/*\n" + append command "#set_attribute lp_clock_gating_auto_path_adjust_fixed_delay 175 /designs/*\n" + + append commands [FF::wrap_command $vars(step),set_icg_attributes $command] + +# append command "#set_attribute lp_power_optimization_weight \"\" /designs/*\n" + + + #----------------------------------------------------------------------- + # DFT Settings + #----------------------------------------------------------------------- + set command "#set_attribute dft_scan_map_mode force_all /designs/$vars(design)\n" + append command "#set_attribute dft_scan_style muxed_scan /\n" + append command "#set_attribute dft_prefix DFT_ /\n" + append command "#set_attribute use_scan_seqs_for_non_dft true /\n" + append command "#set_attribute dft_scan_map_mode force_all /des*/*\n" + append command "#set_attribute dft_connect_shift_enable_during_mapping tie_off /designs/*\n" + append command "#set_attribute dft_connect_scan_data_pins_during_mapping loopback /designs/*\n" + append command "#set_attribute dft_scan_output_preference non_inverted /designs/*\n" + append command "#set_attribute dft_lockup_element_type edge_sensitive /designs/*\n" + append command "#set_attribute dft_mix_clock_edges_in_scan_chains false /designs/*\n" + + append commands [FF::wrap_command $vars(step),set_dft_attributes $command] + + append commands [FF::source_plug syn_setup_dft_tcl] + + set command "" + ## RC timing still comes from cpf, Innovus timing comes from setup.tcl + if {[info exists vars(cpf_file)]} { + append command "apply_power_intent -summary\n" + append commands [FF::wrap_command $vars(step),apply_power_intent $command] + } else { + append command "set mode [lindex $vars(constraint_modes) 0]\n" + append command "if { \[find / -mode \$mode \] == \"\"} {\n" + append command " create_mode -default -name \$mode\n" + append command "}\n" + foreach mode [lrange $vars(constraint_modes) 1 end] { + } + ## Now populate the timing modes + foreach mode $vars(constraint_modes) { + if {[info exists vars($mode,synth_sdc)]} { + append command "if { \[find / -mode $mode\] == \"\" } {\n" + append command " create_mode -name $mode\n" + append command "}\n" + append command "read_sdc -mode $mode $vars($mode,synth_sdc)\n" + } else { + if {[info exists vars($mode,pre_cts_sdc)]} { + append command "if { \[find / -mode $mode\] == \"\" } {\n" + append command " create_mode -name $mode\n" + append command "}\n" + append command "read_sdc -mode $mode $vars($mode,pre_cts_sdc)\n" + } + } + } + + append commands [FF::wrap_command $vars(step),apply_constraints $command] + append command "puts \"The number of exceptions is \[llength \[find / -exception *\]\]\"\n" + + set command "\ndefine_cost_group -name in2out\n" + append command "define_cost_group -name in2reg\n" + append command "define_cost_group -name reg2out\n" + append command "define_cost_group -name reg2reg\n" + + set mode [lindex $vars(constraint_modes) 0] + append command "path_group -mode $mode -from \[all::all_inps\] -to \[all::all_outs\] -group in2out -name in2out\n" + append command "path_group -mode $mode -from \[all::all_inps\] -to \[all::all_seqs\] -group in2reg -name in2reg\n" + append command "path_group -mode $mode -from \[all::all_seqs\] -to \[all::all_outs\] -group reg2out -name reg2out\n" + append command "path_group -mode $mode -from \[all::all_seqs\] -to \[all::all_seqs\] -group reg2reg -name reg2reg\n" + + append commands [FF::wrap_command $vars(step),create_path_groups $command] + } + + set command "" + set first 1 + if {[info exists vars(def_files)]} { + foreach file $vars(def_files) { + if {[file exists $file]} { + if {$first} { + append command "read_def $file\n" + set first 0 + } else { + append command "read_def -incr $file\n" + } + } + } + append commands [FF::wrap_command $vars(step),read_def $command] + } + + append commands "report timing -lint\n" + + if {[info exists vars(max_route_layer)]} { + append commands "\nset_attribute number_of_routing_layers $vars(max_route_layer) designs/$vars(design)\n" + } + +# append commands "#foreach cg \[find / -cost_group *\] {\n" +# append commands "# report timing -cost_group [list \$cg] >> $vars(rpt_dir)/cost_group.map.rpt\n" +# append commands "#}\n" + +# append commands "#set_remove_assign_options -skip_unconstrained_paths -physical\n" +# append commands "#set_attribute utilization 0 \[find / -layer M1\]\n" + + append commands [FF::source_plug pre_syn_gen_tcl] + + set command "\nsynthesize -to_generic -effort medium\n\n" + append commands [FF::wrap_command $vars(step),syn2gen $command] + + append commands [FF::source_plug post_syn_gen_tcl] + + append commands "write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/syn_gen.db\n" + + append commands "redirect -tee $vars(rpt_dir)/report_metric.syn_gen.rpt { report qor -nopower }\n" + append commands "redirect -append $vars(rpt_dir)/report_metric.syn_gen.rpt { report timing -full -num 250 -end }\n" + append commands "redirect -append $vars(rpt_dir)/report_metric.syn_gen.rpt { report timing -full -num 25 }\n" + + append commands "generate_reports -tag syn_gen -outdir $vars(rpt_dir)\n" + + set command "\nsynthesize -to_map -effort high -clock_gating_only\n\n" + append commands [FF::wrap_command $vars(step),syn2icg $command] + +# set cg_cells "\n" +# foreach i [filter libcell -invert "" [find / -inst instances_seq/*]] { +# if {[get_attr clock_gating_integrated_cell [get_attr libcell $i]] != "" } { +# lappend cg_cells $i +# } +# } +# if { $cg_cells != "" } { +# set CG_ADJUST [path_adjust -delay -150 -to $cg_cells] +# } + + append commands [FF::source_plug pre_syn_map_tcl] + + append commands "if {\[llength \[find -mode *\]\] > 0} {\n" + append commands " redirect $vars(rpt_dir)/report_timing_lint.elab.gz { report timing -lint -verbose -mode \[lindex \[find -mode *\] 0\] }\n" + append commands "} else {\n" + append commands " redirect $vars(rpt_dir)/report_timing_lint.elab.gz { report timing -lint -verbose }\n" + append commands "}\n" + append commands "redirect $vars(rpt_dir)/report_sequential.elab.rpt.gz { report sequential -hier }\n" + append commands "redirect $vars(rpt_dir)/report_cdn_loop_breakers.elab.rpt.gz { report cdn_loop_breaker }\n" + + # Synthesizing to gates using effort level defined by vars(syn_map_effort). + set command "\nsynthesize -to_mapped -effort high -no_incremental\n\n" + + append commands [FF::wrap_command $vars(step),syn2map $command] + + if {$vars(capture_metrics)} { + append commands "um::pop_snapshot_stack\n" + set command "" + if {[lindex [split $vars(version) "."] 0] > 16} { + if {[info exists vars(compute_metrics)] && $vars(compute_metrics)} { + append commands "create_snapshot -name $vars(step) -categories \[dict get \[get_attr metric_category_status_map\] \[get_attr state \[find / -design *\]\]\]\n" + } else { + append commands "create_snapshot -name $vars(step) -categories design\n" + } + } else { + append commands "create_snapshot -name $vars(step)\n" + } + append command "um::save_metric_file $vars(dbs_dir)/$vars(step).um\n" + append command "um::report_metric -file $vars(rpt_dir)/$vars(design).html -format html\n" + append commands [FF::wrap_command $vars(step),create_snapshot $command] + } + +# append commands "write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/syn_map.db\n" + append commands "write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/syn_map.db\n" + append commands "write_hdl \[find / -design $vars(design)\] > $vars(dbs_dir)/syn_map.v.gz\n" + append commands "write_hdl \[find / -design $vars(design)\] -lec > $vars(lec_dir)/syn_map.LECONLY.v.gz\n" + + # Write out RTL versus mapped LEC dofile + append commands "write_do_lec -revised $vars(lec_dir)/syn_map.LECONLY.v.gz -logfile rtl2map.log > $vars(lec_dir)/rtl2map.dof\n" + + set command "redirect $vars(lec_dir)/deleted_sequentials.rpt {report sequential -deleted_seqs}\n" + append command "redirect -tee $vars(rpt_dir)/syn_map.qor.rpt { report qor -nopower }\n" + append command "redirect -append $vars(rpt_dir)/syn_map.qor.rpt { report timing -full -num 250 -end }\n" + append command "redirect -append $vars(rpt_dir)/syn_map.qor.rpt { report timing -full -num 25 }\n" + + append command "generate_reports -tag syn_map -outdir $vars(rpt_dir)\n" + + append commands [FF::wrap_command $vars(step),generate_reports $command] + + if {[info exists vars(mail,to)]} { + set summary_file $vars(step).qor.rpt + if {![info exists vars(mail,steps)] || \ + ([info exists vars(mail,steps)] && ([lsearch $vars(mail,steps) $vars(step)] != -1))} { + append commands "puts \" MAILING RESULTS TO $vars(mail,to)\"\n" + append commands "if {\[file exists $vars(rpt_dir)/$summary_file\]} {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[sh pwd\])\" < $vars(rpt_dir)/$summary_file $vars(mail,to)\n" + append commands "} elseif {\[file exists $vars(rpt_dir)/${summary_file}.gz\]} {\n" + append commands " exec gunzip -c $vars(rpt_dir)/${summary_file}.gz \| /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" $vars(mail,to)\n" + append commands "} else {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[sh pwd\])\" < /dev/null $vars(mail,to)\n" + append commands "}\n" + } + } + + append commands "if {\[info exists env(VPATH)\]} {" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)" + append commands "}\n" + + return $commands + + } + + proc run_syn_incr {{format 1}} { + + global vars + global env + global errors + + set vars(step) syn_incr + + set commands "" + + append commands "proc Puts {args} {puts \$args}\n" + + append commands "puts \[get_attr program_version /\]\n" + + ## enable multi processing + append commands "set hostlist \[lrepeat $vars(local_cpus) localhost\]\n" + append commands "set_attribute super_thread_servers \$hostlist /\n" + + if {$vars(capture_metrics)} { + append commands "\num::enable_metrics -on\n" + append commands "um::push_snapshot_stack\n" + } + + append commands [FF::source_plug pre_syn_incr_tcl] + +# append commands "catch { set_remove_assign_options -skip_unconstrained_paths -physical }\n" +# append commands "set_attribute remove_assigns true /\n" + + if {$vars(enable_pam)} { + append commands "\nset_attribute physical_aware_restructuring true /des*/*\n" + append commands "set_attribute physical_aware_structuring true /des*/*\n" + append commands "set_attribute physical_aware_mapping true /des*/*\n" + } + + #### OPTIMIZATION EFFORT CONTROL + if {$vars(high_timing_effort)} { + set command "\nset_attribute tns_opto true /\n" + append command "set_attribute iopt_enable_parallelization true /\n" + append command "set_attribute ultra_global_mapping true /\n" + append command "set_attribute iopt_ultra_optimization true /\n" + append commands [FF::wrap_command $vars(step),set_high_effort_attributes $command] + } + + set command "#set_attribute optimize_merge_flops false /\n" + append command "#set_attribute optimize_constant_0_flops true /\n" + append command "#set_attribute optimize_constant_1_flops false /\n" + append command "#set_attribute optimize_constant_latches false /\n" + append command "#set_attribute delete_unloaded_seqs true /\n" + append command "#set_attribute optimize_net_area false /\n" + append command "#set_attribute dp_area_mode true /\n" + append command "#set_attribute auto_ungroup none /\n" + append command "#set_attribute auto_ungroup_min_effort low /\n" + append command "#set_attribute ungroup_separator /\n" + + append commands [FF::wrap_command $vars(step),set_opt_attributes $command] + + ### Detail Stats while running +# append commands "#set iopt_stats 1\n" + + #----------------------------------------------------------------------- + # Max leakage power ? + #----------------------------------------------------------------------- +# append commands "#set_attribute max_leakage_power ? /designs/*\n" + set command "\nsynthesize -to_mapped -effort high -incr\n\n" + + append commands [FF::wrap_command $vars(step),syn2incr $command] + + append commands [FF::source_plug post_syn_incr_tcl] + + append commands "foreach cg \[find / -cost_group *\] {\n" + append commands " report timing -cost_group \$cg >> $vars(rpt_dir)/syn_incr_\[file tail \$cg\].rpt\n" + append commands "}\n" + + set command "write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/$vars(step).db\n" +# append command "write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/$vars(step).db\n" + + append commands [FF::wrap_command $vars(step),write_db $command] + + set command "write_hdl \[find / -design $vars(design)\] > $vars(dbs_dir)/$vars(step).v.gz\n" + append command "write_hdl \[find / -design $vars(design)\] -lec > $vars(lec_dir)/$vars(step).LECONLY.v.gz\n" + + append commands [FF::wrap_command $vars(step),write_hdl $command] + + if {$vars(capture_metrics)} { + append commands "um::pop_snapshot_stack\n" + if {[lindex [split $vars(version) "."] 0] > 16} { + if {[info exists vars(compute_metrics)] && $vars(compute_metrics)} { + append commands "create_snapshot -name $vars(step) -categories \[dict get \[get_attr metric_category_status_map\] \[get_attr state \[find / -design *\]\]\]\n" + } else { + append commands "create_snapshot -name $vars(step) -categories design\n" + } + } else { + append commands "create_snapshot -name $vars(step)\n" + } + append commands "um::save_metric_file $vars(dbs_dir)/$vars(step).um\n" + append commands "um::report_metric -file $vars(rpt_dir)/$vars(design).html -format html\n" + } + + if {!$vars(enable_rcp)} { + set command "\nwrite_design -innovus -gzip -basename $vars(dbs_dir)/$vars(step)/$vars(step)\n" + append command "set file \[open $vars(dbs_dir)/$vars(step)/$vars(step).novus_setup.tcl w\]\n" + append command "puts \$file \"eval_enc \{source $vars(dbs_dir)/$vars(step)/$vars(step).enc_setup.tcl\}\"\n" + append command "close \$file\n\n" + append commands [FF::wrap_command $vars(step),write_design $command] + } + + # Write out RTL versus mapped LEC dofile + append commands "write_do_lec -revised $vars(lec_dir)/$vars(step).LECONLY.v.gz -logfile rtl2incr.log > $vars(lec_dir)/rtl2incr.dof\n" + + set command "redirect $vars(lec_dir)/deleted_sequentials.rpt {report sequential -deleted_seqs}\n" + append command "redirect -tee $vars(rpt_dir)/$vars(step).qor.rpt { report qor -nopower }\n" + append command "redirect -append $vars(rpt_dir)/$vars(step).qor.rpt { report timing -full -num 250 -end }\n" + append command "redirect -append $vars(rpt_dir)/$vars(step).qor.rpt { report timing -full -num 25 }\n" + + append command "generate_reports -tag $vars(step) -outdir $vars(rpt_dir)/generate_reports\n" + + append commands [FF::wrap_command $vars(step),generate_reports $command] + + if {[info exists vars(mail,to)]} { + set summary_file $vars(step).qor.rpt + if {![info exists vars(mail,steps)] || \ + ([info exists vars(mail,steps)] && ([lsearch $vars(mail,steps) $vars(step)] != -1))} { + append commands "puts \" MAILING RESULTS TO $vars(mail,to)\"\n" + append commands "if {\[file exists $vars(rpt_dir)/$summary_file\]} {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[sh pwd\])\" < $vars(rpt_dir)/$summary_file $vars(mail,to)\n" + append commands "} elseif {\[file exists $vars(rpt_dir)/${summary_file}.gz\]} {\n" + append commands " exec gunzip -c $vars(rpt_dir)/${summary_file}.gz \| /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" $vars(mail,to)\n" + append commands "} else {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[sh pwd\])\" < /dev/null $vars(mail,to)\n" + append commands "}\n" + } + } + + append commands "if {\[info exists env(VPATH)\]} {" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)" + append commands "}\n" + + return $commands + + } + + proc run_syn_place {{format 1}} { + + global vars + global env + global errors + + set vars(step) syn_place + + set commands "" + + append commands "proc Puts {args} {puts \$args}\n" + + append commands "puts \[get_attr program_version /\]\n" + + ## enable multi processing + append commands "set hostlist \[lrepeat $vars(local_cpus) localhost\]\n" + append commands "set_attribute super_thread_servers \$hostlist /\n" + + if {$vars(capture_metrics)} { + append commands "\um::nenable_metrics -on\n" + append commands "um::push_snapshot_stack\n" + } + + if {[info exists vars(postload_syn_place_tcl)]} { + append commands "set_attribute enc_postload_script $vars(postload_syn_place_tcl) /\n" + } + if {[info exists vars(preexport_syn_place_tcl)]} { + append commands "set_attribute enc_preexport_script $vars(preexport_syn_place_tcl) /\n" + } + if {[info exists vars(preannotation_syn_placed_tcl)]} { + append commands "set_attribute enc_preannotation_tcl $vars(preannotation_syn_placed_tcl) /\n" + } + + append commands "set_attribute enc_temp_dir ./INNOVUS/rcp_run /\n" + append commands "set_attribute enc_gzip_interface_files true /\n" + append commands "set_attribute pqos_placement_effort no_value /\n" + + append commands "set ::phys::pqos_tns_opt 1\n" + append commands "set_attribute iopt_enable_parallelization false /\n" + +# if {[info exists vars(def_files)]} { +# foreach file $vars(def_files) { +# if {[file exists $file]} { +# set command "read_def $vars(def_files)\n" +# append commands [FF::wrap_command $vars(step),read_def $command] +# } +# } +# } + + append commands [FF::source_plug pre_syn_place_tcl] + + set command "\nsynthesize -to_placed -effort high -pqos_only\n\n" + append command "write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/$vars(step).db\n" + append commands [FF::wrap_command $vars(step),syn2place $command] + + set command "\nsynthesize -to_placed -effort high -incr\n\n" + append commands [FF::wrap_command $vars(step),syn2place_incr $command] + + append commands [FF::source_plug post_syn_place_tcl] + + append commands "::phys::qos_stats -quiet -tag syn2placed\n" + append commands "::phys::qos_write_stats_array > $vars(rpt_dir)/qos_stats.qdb\n" + append commands "::phys::qos_summary\n" + + append commands "foreach cg \[find / -cost_group *\] {\n" + append commands " report timing -cost_group \$cg >> $vars(rpt_dir)/syn_place_\[file tail \$cg\].rpt\n" + append commands "}\n" + + if {$vars(capture_metrics)} { + append commands "um::pop_snapshot_stack\n" + if {[lindex [split $vars(version) "."] 0] > 16} { + if {[info exists vars(compute_metrics)] && $vars(compute_metrics)} { + append commands "create_snapshot -name $vars(step) -categories \[dict get \[get_attr metric_category_status_map\] \[get_attr state \[find / -design *\]\]\]\n" + } else { + append commands "create_snapshot -name $vars(step) -categories design\n" + } + } else { + append commands "create_snapshot -name $vars(step)\n" + } + append commands "um::save_metric_file $vars(dbs_dir)/$vars(step).um\n" + append commands "um::report_metric -file $vars(rpt_dir)/$vars(design).html -format html\n" + } + + set command "write_db $vars(design) -script $vars(dbs_dir)/$vars(step)_db_scr.tcl -all_root_attributes -to_file $vars(dbs_dir)/$vars(step).db\n" + append command "write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/$vars(step).db\n" + + append commands [FF::wrap_command $vars(step),write_db $command] + + set command "write_hdl \[find / -design $vars(design)\] > $vars(dbs_dir)/$vars(step).v.gz\n" + append command "write_hdl \[find / -design $vars(design)\] -lec > $vars(lec_dir)/$vars(step).LECONLY.v.gz\n" + + append commands [FF::wrap_command $vars(step),write_hdl $command] + + if {$vars(enable_rcp)} { + set command "\nwrite_design -innovus -gzip -basename $vars(dbs_dir)/$vars(step)/$vars(step)\n" + append command "set file \[open $vars(dbs_dir)/$vars(step)/$vars(step).novus_setup.tcl w\]\n" + append command "puts \$file \"eval_enc \{source $vars(dbs_dir)/$vars(step)/$vars(step).enc_setup.tcl\}\"\n" + append command "close \$file\n\n" + append commands [FF::wrap_command $vars(step),write_design $command] + } + + # Write out RTL versus mapped LEC dofile + append commands "write_do_lec -revised $vars(lec_dir)/$vars(step).LECONLY.v.gz -logfile rtl2incr.log > $vars(lec_dir)/rtl2incr.dof\n" + + set command "redirect $vars(lec_dir)/deleted_sequentials.rpt {report sequential -deleted_seqs}\n" + append command "redirect -tee $vars(rpt_dir)/$vars(step).qor.rpt { report qor -nopower }\n" + append command "redirect -append $vars(rpt_dir)/$vars(step).qor.rpt { report timing -full -num 250 -end }\n" + append command "redirect -append $vars(rpt_dir)/$vars(step).qor.rpt { report timing -full -num 25 }\n" + + append command "generate_reports -tag $vars(step) -outdir $vars(rpt_dir)/generate_reports\n" + + append commands [FF::wrap_command $vars(step),generate_reports $command] + + if {[info exists vars(mail,to)]} { + set summary_file $vars(step).qor.rpt + if {![info exists vars(mail,steps)] || \ + ([info exists vars(mail,steps)] && ([lsearch $vars(mail,steps) $vars(step)] != -1))} { + append commands "puts \" MAILING RESULTS TO $vars(mail,to)\"\n" + append commands "if {\[file exists $vars(rpt_dir)/$summary_file\]} {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[sh pwd\])\" < $vars(rpt_dir)/$summary_file $vars(mail,to)\n" + append commands "} elseif {\[file exists $vars(rpt_dir)/${summary_file}.gz\]} {\n" + append commands " exec gunzip -c $vars(rpt_dir)/${summary_file}.gz \| /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[pwd\])\" $vars(mail,to)\n" + append commands "} else {\n" + append commands " exec /bin/mail -s \"FF: $vars(design), $vars(step) completed (\[sh pwd\])\" < /dev/null $vars(mail,to)\n" + append commands "}\n" + } + } + + append commands [FF::wrap_command $vars(step),schedule_flow $command] + + append commands "if {\[info exists env(VPATH)\]} {" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)" + append commands "}\n" + + return $commands + + } + + proc run_init {{format 1}} { + + global vars + global env + global errors + global warnings + global env + + set commands "" + set ucomments "" + set comments "" + + if {[info exists vars(view_definition_tcl)]} { + append comments "# - vars(view_definition_tcl)\n" + } + + if {![info exists vars(step)] || (($vars(step) != "partition_place") && ($vars(step) != "model_gen") && ($vars(step) != "prototype"))} { + append commands "set vars(step) init\n" + set vars(step) init + } + + if {$vars(report_run_time)} { + append commands "set vars($vars(step),start_time) \[clock seconds\]\n" + append comments "# - vars(report_run_time)\n" + } else { + append ucomments "# - vars(report_run_time)\n" + } + + if {[info exists vars($vars(step),rpt_dir)]} { + set vars(rpt_dir) $vars($vars(step),rpt_dir) + file mkdir $vars($vars(step),rpt_dir) + } else { + set vars(rpt_dir) $vars(orig_rpt_dir) + } + + ############################################################################### + # Make sure necessary data is defined + # Create make directory if it doesn't exists + ############################################################################### + if {!$vars(codegen)} { + set command "FF_EDI::check_setup\n" + append command "sleep 3\n" + uplevel #0 eval $command + } + + ############################################################################### + # Make sure necessary data is defined + ############################################################################### + + if {![info exists env(VPATH)]} { + set env(VPATH) "make" + } + append commands "exec mkdir -p \$env(VPATH)\n" + + if {$vars(backup_data)} { + puts "# BACKING UP PRIOR RUN DATA IF IT EXISTS...\n" + set date [string toupper [clock format [clock seconds] -format {%h%d_%H:%M}]] + exec mkdir -p BACKUP/$date + # BCL: Added subst to handle dererencing variables + + foreach dir "[subst $vars(dbs_dir)] [subst $vars(rpt_dir)] [subst $vars(log_dir)]" { + if {[file isdirectory $dir]} { + exec mv $dir BACKUP/$date + # BCL: Changed to file mkdir + puts "Making $dir" + file mkdir $dir + } + } +# append commands "sleep 5\n" + } + # BCL: Added subst to handle dererencing variables + foreach dir "[subst $vars(dbs_dir)] [subst $vars(rpt_dir)] [subst $vars(log_dir)]" { + set newDir [subst $dir] + if {![file exists $newDir]} { + file mkdir $newDir + } + } + + ############################################################################### + # Load pre-initializatiaon plug-in script + ############################################################################### + append commands [FF::source_plug pre_init_tcl] + + ############################################################################### + # These flow scripts support the following: + # - Flat chip or block + # - Hierarchical partition + # - Top level partition + # + # The data loading mechanism are slightly different for each so we determine + # first if we are in a hierarchical flow (i.e. vars(partition_list) is + # defined and, if so, whether we are in a hierarchical partition flow + # or a top partition flow (i.e. cwd == $vars(design) - see below) + # + ############################################################################### + FF_EDI::check_flow + +# append commands "#---------------------------------------------------------------------\n" +# append commands "# EXECUTING FLOW\n" +# append commands "#---------------------------------------------------------------------\n" + + set hier 0 + + if {[info exists vars($vars(step),starting_dbs)]} { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + # Interpret the starting DBS as an OA triple + set restore_command "[list restoreDesign -cellview $vars($vars(step),starting_dbs)]\n" + } else { + if {[file isdirectory $vars($vars(step),starting_dbs)]} { + set restore_command "restoreDesign $vars($vars(step),starting_dbs) $vars(design)\n" + } elseif {[file exists $vars($vars(step),starting_dbs)]} { + set restore_command "restoreDesign $vars($vars(step),starting_dbs).dat $vars(design)\n" + } else { + puts " Starting DBS ($vars($vars(step),starting_dbs)) defined but does not exist" + set restore_command "restoreDesign $vars($vars(step),starting_dbs).dat $vars(design)\n" + set warnings($vars(warning_count)) "Starting DBS ($vars($vars(step),starting_dbs)) defined but does not exist" + incr vars(warning_count) + } + } + + append commands [FF::wrap_command $vars(step),restore_design $restore_command] + + } else { + + if {![info exists vars(partition_list)] || ([info exists vars(partition_list)] && \ + ([file tail [file dirname [pwd]]] != "$vars(partition_dir)"))} { + + ############################################################################### + # Partition step or flat init step + ############################################################################### + + if {[info exists vars(partition_list)]} { + set hier 1 + } + + if {$vars(verbose)} { + if {![info exists vars(partition_list)]} { + append commands "#\n" + append commands "# FLAT IMPLEMENTATION FLOW\n" + append commands "#\n" + } else { + append commands "#\n" + append commands "# PARTITIONING FLOW\n" + append commands "#\n" + } + } + + if {$vars(verbose)} { + append commands "#\n" + append commands "# LOADING DESIGN DATA\n" + append commands "#\n" + } + ############################################################################### + # Load design configuration file + ############################################################################### + + if {[lindex [split $vars(version) "."] 0] <= 10} { + source $vars(script_path)/ETC/INNOVUS/generic.conf + } + if {$vars(ilm)} { + set ilm_list $vars(ilm_list) + append comments "# - vars(ilm_list) \"\"\n" + if {$vars(mode) == "bottom_up"} { + foreach part $vars(partition_list) { + if {[info exists vars($part,ilm_dir)]} { + append comments "# - vars(,ilm_dir) \"\"\n" + if {[lsearch $ilm_list $part] == -1} { + lappend ilm_list $part + } + } + } + } + foreach ilm $ilm_list { + if {[info exists vars($ilm,lef_file)] && [file exists $vars($ilm,lef_file)]} { + append comments "# - vars(,lef_file) \"\"\n" + if {[lindex [split $vars(version) "."] 0] <= 10} { + lappend rda_Input(ui_leffile) $vars($ilm,lef_file) + } else { + if {[string compare $vars(dbs_format) "fe"]==0} { + lappend vars(lef_files) $vars($ilm,lef_file) + } + } + } else { + puts " WARNING: LEF file either not defined or doesn't exist for $ilm" + puts " Please make sure it is in your vars(lef_files) list" + set warnings($vars(warning_count)) "LEF file either not defined or doesn't exist for $ilm\n\tPlease make sure it is in your vars(lef_files) list" + incr vars(warning_count) + } + if {[info exists vars($ilm,setup_lib)] && [file exists $vars($ilm,setup_lib)]} { + append comments "# - vars(,setup_lib) \"\"\n" + if {[lindex [split $vars(version) "."] 0] <= 10} { + lappend rda_Input(ui_timelib) $vars($ilm,setup_lib) + } else { + if {[string compare $vars(dbs_format) "fe"]==0} { + foreach set $vars(library_sets) { + if {[lsearch $vars($set,timing) $vars($ilm,setup_lib)] == -1} { + lappend vars($set,timing) $vars($ilm,setup_lib) + } + } + } + } + } else { + puts " WARNING: LIB file either not defined or doesn't exist for $ilm" + puts " Please make sure it is in your library set definitions" + set warnings($vars(warning_count)) "LIB file either not defined or doesn't exist for $ilm\n\tPlease make sure it is in your library set definitions" + incr vars(warning_count) + } + } + } else { + append ucomments "# - vars(ilm_list) \"\"\n" + append ucomments "# - vars(,ilm_dir) \"\"\n" + append ucomments "# - vars(,lef_file) \"\"\n" + append ucomments "# - vars(,setup_lib) \"\"\n" + } + + FF_EDI::dump_config + + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadConfig \$vars(script_dir)/run.conf\n" + append commands [FF::wrap_command $vars(step),load_config $command] + } else { + if {[string compare -nocase $vars(netlist_type) "verilog"]>=0} { +# set command "source \$vars(script_dir)/init.tcl\n" + if {$vars(generate_flow_steps)} { + set command "" + set ip [open $vars(script_dir)/init.tcl r] + while {[gets $ip line]>=0} { + append command "$line\n" + } + } else { + set command "source $vars(script_dir)/init.tcl\n" + } + append command "init_design\n" + append commands [FF::wrap_command $vars(step),init_design $command] + } else { + if {$hier} { + if {$vars(step) == "partition_place"} { + set command "restoreDesign -cellview \[list $vars(oa_design_lib) $vars(oa_design_cell) $vars(oa_design_view)\]\n" + } else { + set command "restoreDesign -cellview \[list $vars(oa_partition_lib) $vars(oa_design_cell) $vars(oa_design_view)\]\n" + } + } else { + set command "restoreDesign -cellview \[list $vars(oa_design_lib) $vars(oa_design_cell) $vars(oa_design_view)\]\n" + } + append commands [FF::wrap_command $vars(step),restore_design $command] + } + # if {!$vars(codegen)} { + # Puts " ---------------------------------------" + # Puts " $commands" + # Puts " ---------------------------------------" + # uplevel #0 eval $commands + # set commands "" + # } + } + + if {$vars(capture_metrics)} { +# if {($vars(step) != "partition_place") && ($vars(step) != "model_gen") && ($vars(step) != "prototype")} { + if {[lindex [split $vars(version) "."] 0] > 13} { + append commands "um::enable_metrics -on\n" + append commands "um::push_snapshot_stack\n" + } +# } + } + + ############################################################################### + # Load "always source" plug-in script + ############################################################################### + append commands [FF::source_plug always_source_tcl] + + ############################################################################### + # Check for the existence of either a floorplan file, a + # DEF file, or both and load them + ############################################################################### + set command "" + if {[info exists vars(fp_tcl_file)] || [info exists vars(fp_tcl_proc)]} { + append comments "# - vars(fp_tcl_file)\n" + append comments "# - vars(fp_tcl_proc)\n" + if {[info exists vars(fp_tcl_file)] && ![info exists vars(fp_tcl_proc)]} { + append command "ff_procs::source_file $vars(fp_tcl_file)\n" + } elseif {![info exist vars(fp_tcl_file)] && [info exists vars(fp_tcl_proc)]} { + append command "$vars(fp_tcl_proc)\n" + } else { + append command "# ERROR: Both fp_tcl_file and fp_tcl_proc are defined but are mutually exclusive\n" + set errors($vars(error_count)) "Both fp_tcl_file and fp_tcl_proc are defined but are mutually exclusive" + incr vars(error_count) + } + } else { + append ucomments "# - vars(fp_tcl_file)\n" + append ucomments "# - vars(fp_tcl_proc)\n" + if {[info exists vars(fp_file)]} { + if {[file exists $vars(fp_file)]} { + # append command "Puts \" LOADING FP FILE $vars(fp_file)\"\n" + append command "loadFPlan $vars(fp_file)\n" + } + append comments "# - vars(fp_file)\n" + } else { + append ucomments "# - vars(fp_file)\n" + } + if {[info exists vars(oa_fp)]} { + append command "oaIn $vars(oa_fp)\n" + append comments "# - vars(oa_fp)\n" + } else { + append ucomments "# - vars(oa_fp)\n" + } + + if {[info exists vars(def_files)]} { + append comments "# - vars(def_files)\n" + if {$vars(rc)} { + if {$vars(enable_rcp)} { + set vars(netlist) $vars(dbs_dir)/syn_place/syn_place.v.gz + set vars(def_files) $vars(dbs_dir)/syn_place/syn_place.def.gz + if {[info exists vars(insert_dft)] && $vars(insert_dft)} { + lappend vars(def_files) $vars(dbs_dir)/syn_place/syn_place.scan.def.gz + } + } else { + set vars(netlist) $vars(dbs_dir)/syn_incr/syn_incr.v.gz +# set vars(def_files) $vars(dbs_dir)/syn_incr/syn_incr.def.gz + if {[info exists vars(insert_dft)] && $vars(insert_dft)} { + lappend vars(def_files) $vars(dbs_dir)/syn_incr/syn_incr.scan.def.gz + } + } + foreach def_file $vars(def_files) { + append command "defIn $def_file\n" + } + } else { + foreach def_file $vars(def_files) { + if {[file exists $def_file]} { + append command "defIn $def_file\n" + append comments "# - vars(def_files)\n" + } else { + append ucomments "# - vars(def_files)\n" + } + } + } + } else { + if {$vars(rc)} { + if {$vars(enable_rcp)} { + set vars(netlist) $vars(dbs_dir)/syn_place/syn_place.v.gz + set vars(def_files) $vars(dbs_dir)/syn_place/syn_place.def.gz + if {[info exists vars(insert_dft)] && $vars(insert_dft)} { + lappend vars(def_files) $vars(dbs_dir)/syn_place/syn_place.scan.def.gz + } + } else { + set vars(netlist) $vars(dbs_dir)/syn_incr/syn_incr.v.gz + set vars(def_files) $vars(dbs_dir)/syn_incr/syn_incr.def.gz + if {[info exists vars(insert_dft)] && $vars(insert_dft)} { + lappend vars(def_files) $vars(dbs_dir)/syn_incr/syn_incr.scan.def.gz + } + } + } else { + append ucomments "# - vars(def_files)\n" + } + } + } + append commands [FF::wrap_command $vars(step),load_floorplan $command] + + if {($vars(parent) == "rc") && $vars(rc)} { + set commands [FF::source_plug always_source_tcl] + if {$vars(report_run_time)} { + append commands "set vars($vars(step),start_time) \[clock seconds\]\n" + } + append commands [FF::source_plug pre_init_tcl] + } + + # if {[info exists vars(guides)]} { + # set command "\nbuild_guides\n" + # append commands [FF::wrap_command init,build_guides $command] + # } + # if {[info exists vars(blockages)]} { + # set command "\nadd_blockages\n" + # append commands [FF::wrap_command init,add_blockages $command] + # } + + if {[lindex [split $vars(version) "."] 0] < 15} { + if {$vars(generate_tracks)} { + set command "generateTracks\n" + if {[info exists vars(honor_pitch)] && $vars(honor_pitch)} { + set command " generateTracks -honorPitch\n" + } + append commands [FF::wrap_command $vars(step),generate_tracks $command] + append comments "# - vars(generate_tracks)\n" + } else { + append ucomments "# - vars(generate_tracks)\n" + } + } else { + if {$vars(add_tracks)} { + set command "add_tracks\n" + if {[info exists vars(honor_pitch)] && $vars(honor_pitch)} { + set command " add_tracks -honor_pitch\n" + } + append commands [FF::wrap_command $vars(step),add_tracks $command] + append comments "# - vars(add_tracks)\n" + } else { + append ucomments "# - vars(add_tracks)\n" + } + } + + ############################################################################### + # Specify ILMs if defined + ############################################################################### + if {[info exists ilm_list] && ($ilm_list != "")} { + set command "" + foreach cell $ilm_list { + if {[info exists vars($cell,ilm_dir)] && [file isdirectory $vars($cell,ilm_dir)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "specifyIlm -cell $cell -dir $vars($cell,ilm_dir)\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "specifyIlm -cell $cell\n" + } else { + append command "specifyIlm -cell $cell -dir $vars($cell,ilm_dir)\n" + } + } + } else { + puts " ERROR: ilm directory missing for $cell" + set errors($vars(error_count)) "ILM directory missing for $cell" + incr vars(error_count) + } + } + append commands [FF::wrap_command $vars(step),derate_timing [FF_EDI::derate_timing mmmc]] + if {$command != ""} { + append commands [FF::wrap_command $vars(step),specify_ilm "setIlmMode -keepFlatten true\n${command}flattenIlm\n"] +# append commands [FF::wrap_command $vars(step),specify_ilm $command] + } + } + + if {$vars(ilm) && [info exists vars(ilm_non_sdc_file)]} { + if {[file exists $vars(ilm_non_sdc_file)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + set lcommand "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" + } else { + set lcommand "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" + } + append commands [FF::wrap_command $vars(step),load_ilm_non_sdc_file $lcommand] + } + append comments "# - vars(ilm_non_sdc_file)\n" + } else { + append ucomments "# - vars(ilm_non_sdc_file)\n" + } + + ############################################################################### + # Define power intent if it is defined (low power flow) + ############################################################################### + + if {[lindex [split $vars(version) "."] 0] < 14} { + append commands [FF_EDI::load_power_intent] + } else { + append commands [FF_NOVUS::load_power_intent] + } + + if {[info exists vars(activity_file)]} { + # append commands $header + # set header "" + set command "readActivityFile -format $vars(activity_file_format) $vars(activity_file)\n" + append commands [FF::wrap_command $vars(step),read_activity_file $command] + append comments "# - vars(activity_file)\n" + append comments "# - vars(activity_file_format)\n" + } else { + append ucomments "# - vars(activity_file)\n" + append ucomments "# - vars(activity_file_format)\n" + } + + ############################################################################### + # Load timing enviroment based on the flow setting in the + # setup.tcl file. If the flow is mmmc, load the mmmc setup + # here else load the default timing environment + ############################################################################### + # append commands "#\n" + # append commands "# SETTING UP TIMING ENVIRONMENT\n" + # append commands "#\n" + + if {$vars(flow) == "mmmc"} { + set command [FF_EDI::initialize_timing mmmc] + } else { + set command [FF_EDI::initialize_timing minmax] + } + + # foreach var [array name vars] { + # if {($var != "step") && ($var != "mode") && ($var != "ilm") && \ + # ($var != "flavor") && ($var != "user_mode") && ($var != "flat") && \ + # ($var != "report_run_time") && ($var != "makefile") && ($var != "codegen") && \ + # ($var != "backup_data") && ($var != "verbose") && ($var != "format_lines") && \ + # ($var != "warning_count") && ($var != "error_count") && ($var != "rc") && \ + # ($var != "generate_tracks") && ($var != "fix_hold") && ($var != "honor_pitch") && \ + # ($var != "script_path") && ($var != "fix_hold") && ($var != "honor_pitch") && \ + # ($var != "steps") && ($var != "sourced") && ($var != "version")} { + # set vars($var) "\\\$vars($var)" + # } + # } + + append commands [FF::wrap_command $vars(step),initialize_timing $command] + + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + set command "set_power_analysis_mode -analysis_view $vars(power_analysis_view)\n" + append commands [FF::wrap_command $vars(step),set_power_analysis_mode $command] + } + + if {!$vars(ilm) && ($vars(flow) == "mmmc")} { + set command [FF_EDI::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } + + ############################################################################### + # Load scan DEF if it exists + ############################################################################### + if {[info exists vars(scan_def)]} { + if {[file exists $vars(scan_def)]} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# LOADING SCAN DEF FILE\n" + append commands "#\n" + } + set command "defIn $vars(scan_def)\n" + append commands [FF::wrap_command $vars(step),load_scan $command] + } + append comments "# - vars(scan_def)\n" + } else { + append ucomments "# - vars(scan_def)\n" + } + + ############################################################################### + # Specify spare gates for placement and optimization consideration; this assumes + # the spare cells are in the netlist. + ############################################################################### + + set command "" + if {[info exists vars(spare_cells)]} { + foreach spare_cell $vars(spare_cells) { + append command "specifySpareGate -inst $spare_cell\n" + } + append comments "# - vars(spare_cells)\n" + } else { + append ucomments "# - vars(spare_cells)\n" + } + append commands [FF::wrap_command $vars(step),specify_spare_gates $command] + + ############################################################################### + # Load the recommended command mode settings + ############################################################################### + if {$vars(verbose)} { + append commands "#\n" + append commands "# DEFINING MODE SETTINGS\n" + append commands "#\n" + } + + ############################################################################### + # Set don't use cells; disable some (clock buffers, strong buffers, etc.), + # enable others that may have "dont_use true" in the library (like delay cells + # for hold fixing) + ############################################################################### + set command "" + if {[info exists vars(dont_use_list)]} { + foreach cell $vars(dont_use_list) { + append command "setDontUse $cell true\n" + } + append comments "# - vars(dont_use_list)\n" + } else { + append ucomments "# - vars(dont_use_list)\n" + } + if {[info exists vars(dont_use_file)] && [file exists $vars(dont_use_file)]} { + append command "source $vars(dont_use_file)\n" + append comments "# - vars(dont_use_file)\n" + } else { + append ucomments "# - vars(dont_use_file)\n" + } + if {[info exists vars(use_list)]} { + foreach cell $vars(use_list) { + append command "setDontUse $cell false\n" + } + append comments "# - vars(use_list)\n" + } else { + append ucomments "# - vars(use_list)\n" + } + if {$command != ""} { + append commands [FF::wrap_command $vars(step),set_dont_use $command] + } + + ############################################################################### + # Set maximum routing layers + ############################################################################### + if {[info exists vars(max_route_layer)]} { + set command "setMaxRouteLayer $vars(max_route_layer)\n" + append commands [FF::wrap_command $vars(step),set_max_route_layer $command] + append comments "# - vars(max_route_layer)\n" + } else { + append ucomments "# - vars(max_route_layer)\n" + } + + ############################################################################### + # Set design mode + ############################################################################### + append commands [lindex [FF_EDI::set_design_mode] 0] + append comments [lindex [FF_EDI::set_design_mode] 1] + append ucomments [lindex [FF_EDI::set_design_mode] 2] + + ############################################################################### + # Insert welltaps and pre/post endcaps + ############################################################################### + if {([FF::get_by_suffix vars "welltaps"] != "") || + (([FF::get_by_suffix vars "pre_endcap"] != "") && + ([FF::get_by_suffix vars "post_endcap"] != ""))} { + set command [FF_EDI::insert_welltaps_endcaps] + append commands [FF::wrap_command $vars(step),insert_welltaps_endcaps $command] + append comments "# - vars(welltaps)\n" + append comments "# - vars(pre_endcap)\n" + append comments "# - vars(post_endcap)\n" + } else { + append ucomments "# - vars(welltaps)\n" + append ucomments "# - vars(pre_endcap)\n" + append ucomments "# - vars(post_endcap)\n" + } + + } else { + + ############################################################################### + # Partition init step + ############################################################################### + + set ptn [file tail [pwd]] + set vars(design) $ptn + set skip_cpf false + set skip_1801 false + ############################################################################### + if {[lsearch $vars(partition_list) $ptn] == -1} { + append commands "#------------------------------------------------------------\n" + append commands "# TOP ($ptn) IMPLEMENTATION FLOW\n" + append commands "#------------------------------------------------------------\n" + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadConfig $ptn.conf 0\n" + if {[info exists vars(save_ilm_non_sdc_file)]} { + set vars(ilm_non_sdc_file) $vars(save_ilm_non_sdc_file) + } + append command "global rda_Input\n" + foreach part $vars(partition_list) { + append command "lappend rda_Input(ui_leffile) ../$part/$part.antenna.lef\n" + } + append command "commitConfig\n" + append commands [FF::wrap_command $vars(step),load_config $command] + } else { + if {[string compare $vars(dbs_format) "oa"]==0} { + set command "restoreDesign -cellView \[list $vars(oa_partition_lib) $ptn layout\]\n" + } else { + if {$vars(use_flexmodels)} { + if {$vars(flexmodel_as_ptn)} { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "restoreDesign ${ptn}_proto_eco.enc.dat $ptn\n" + } else { + set command "restoreDesign ${ptn}_proto_full.enc.dat $ptn\n" + } + } else { + set command "restoreDesign . $ptn\n" + append command "ff_replace_flexmodel_with_full_netlist\n" + } + } else { + set command "restoreDesign . $ptn\n" + } + if {$vars(capture_metrics)} { + if {[lindex [split $vars(version) "."] 0] > 13} { + append commands "um::enable_metrics -on\n" + append commands "um::push_snapshot_stack\n" + } + } +# foreach part $vars(partition_list) { +# append command "if {\[file exists ../$part/$part.antenna.lef\]} {\n" +# append command "loadLefFile ../$part/$part.antenna.lef\n" +# append command "}\n" +# } +# set command "source $ptn.globals\n" +# foreach part $vars(partition_list) { +# append command "lappend init_lef_file ../$part/$part.antenna.lef\n" +# } +# append command "init_design\n" + } + append commands [FF::wrap_command $vars(step),restore_design $command] + set restore_design true + + if {$vars(top)} { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file [file normalize $vars(view_definition_tcl)] + } else { + set mmmc_file [file normalize $vars(script_dir)/view_definition.tcl] + } + if {$vars(enable_flexilm)} { + set command "" + set dirs "" + foreach block $vars(partition_list) { + append dirs "\\\n -flex_ilm {${block} ../${block}/${block}.flexilm}" + } + set command "commit_module_model $dirs\\\n" + if {[info exists vars(cpf_file)]} { + append command " -mmmc_file $vars(mmmc_file)\\\n" + append command " -cpf_file $vars(cpf_file)\n" + set skip_cpf true + } elseif {[info exists vars(ieee1801_file)]} { + append command " -mmmc_file $vars(mmmc_file)\\\n" + append command " -1801 $vars(ieee1801_file)\n" + set skip_1801 true + } else { + append command " -mmmc_file $vars(mmmc_file)\n" + } + append commands [FF::wrap_command $vars(step),commit_module_model $command] + } + } + } + } else { + append commands "#------------------------------------------------------------\n" + append commands "# PARTITION ($ptn) IMPLEMENTATION FLOW\n" + append commands "#------------------------------------------------------------\n" + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadConfig $ptn.conf\n" + append commands [FF::wrap_command $vars(step),load_config $command] + } else { + if {$vars(use_flexmodels)} { + if {$vars(flexmodel_as_ptn)} { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "restoreDesign ${ptn}_proto_eco.enc.dat $ptn\n" + } else { + set command "restoreDesign ${ptn}_proto_full.enc.dat $ptn\n" + } + } else { + set command "restoreDesign . $ptn\n" + append command "ff_replace_flexmodel_with_full_netlist\n" + } + } else { + if {[string compare $vars(dbs_format) "oa"]==0} { + set command "restoreDesign -cellView \[list $vars(oa_partition_lib) $ptn layout\]\n" + } else { + set command "restoreDesign . $ptn\n" + # set command "source $ptn.globals\n" + # append command "init_design\n" + } + } + append commands [FF::wrap_command $vars(step),restore_design $command] + set restore_design true + } + } + + if {$vars(capture_metrics)} { + if {[lindex [split $vars(version) "."] 0] > 13} { + append commands "um::enable_metrics -on\n" + append commands "um::push_snapshot_stack\n" + } + } + + append commands [FF::source_plug always_source_tcl] + + ############################################################################### + # Load floorplan file or DEF; use defIn to load a DEF file + ############################################################################### + if {[string compare $vars(dbs_format) "fe"]==0} { + if {![info exists restore_design]} { + append commands "loadFPlan $ptn.fp\n" + append commands "source $ptn.mode\n" + if {[file exists $ptn.scan.def]} { + append commands "Puts \" LOADING SCAN DEF FILE $ptn.scan.def\"\n" + append commands "defIn $ptn.scan.def\n" + } + } + } + + ############################################################################### + # Override maximum routing layer if defined for the partition + ############################################################################### + if {[info exists vars($ptn,max_route_layer)]} { + append commands "setMaxRouteLayer $vars($ptn,max_route_layer)\n" + append comments "# - vars(max_route_layer)\n" + } else { + append ucomments "# - vars(max_route_layer)\n" + } + + ############################################################################### + # Specify the ILM models for the top partition + ############################################################################### + if $vars(top) { + if {!$vars(enable_flexilm)} { + set command "" + foreach part $vars(partition_list) { + if {[info exists vars($part,ilm_dir)] && ($vars(codegen) || [file isdirectory $vars($part,ilm_dir)])} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "specifyIlm -cell $part -dir $vars($part,ilm_dir)\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "specifyIlm -cell $part\n" + } else { + append command "specifyIlm -cell $part -dir $vars($part,ilm_dir)\n" + } + } + } else { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "specifyIlm -cell $part -dir ../$part/$part.ilm\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "specifyIlm -cell $part\n" + } else { + append command "specifyIlm -cell $part -dir ../$part/$part.ilm\n" + } + } + } + } + append commands [FF::wrap_command $vars(step),setIlmMode "setIlmMode -keepFlatten true\n"] + if {$command != ""} { + append commands [FF::wrap_command $vars(step),specify_ilm $command] + } + set command "" + foreach part $vars(partition_list) { + append command "if {\[file exists ../$part/$part.antenna.lef\]} {\n" + append command " loadLefFile ../$part/$part.antenna.lef\n" + append command "}\n" + } + if {$command != ""} { + append commands [FF::wrap_command $vars(step),load_lef_file $command] + } + if {$vars(ilm) && [info exists vars(ilm_non_sdc_file)]} { + if {[file exists $vars(ilm_non_sdc_file)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" + } else { + set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" + } + append commands [FF::wrap_command $vars(step),load_ilm_non_sdc_file $command] + } + } + set command [FF_EDI::initialize_timing mmmc] + # if {![info exists vars(cpf_file)]} { + append commands [FF::wrap_command $vars(step),initialize_timing $command] + # } else { + # set defer_commands [FF::wrap_command $vars(step),initialize_timing $command] + # } + } + } + ############################################################################### + # Load power intent (if it is defined) + ############################################################################### + if {([info exists vars(cpf_file)]) && ($vars(cpf_file) != "") && !$skip_cpf} { + set save $vars(cpf_file) + if {!$vars(top)} { + set vars(cpf_file) "$ptn.cpf" + } + if {[lindex [split $vars(version) "."] 0] < 14} { + append commands [FF_EDI::load_power_intent] + } else { + append commands [FF_NOVUS::load_power_intent] + } + set vars(cpf_file) $save + } elseif {[info exists vars(ieee1801_file)] && !$skip_1801} { + set save $vars(ieee1801_file) + if {!$vars(top)} { +# set vars(ieee1801_file) "$ptn.cpf" + set vars(cpf_file) "$ptn.cpfdb" + } + if {[lindex [split $vars(version) "."] 0] < 14} { + append commands [FF_EDI::load_power_intent] + } else { + append commands [FF_NOVUS::load_power_intent] + } +# set command "read_power_intent $vars(ieee1801_file) -1801\n" + } else { + append ucomments "# - vars(cpf_file)\n" + append ucomments "# - vars(ieee1801_file)\n" + } + } + } + + ############################################################################### + # Load post-initialization plug-in script + ############################################################################### + append commands [FF::source_plug post_init_tcl 0] + + ############################################################################### + # Check pre-place timing (and generate timing graph for placement) + ############################################################################### + if {($vars(step) != "model_gen") && ($vars(step) != "partition_place") && ($vars(step) != "prototype")} { + if {![info exists vars(time_design_options,setup)]} { + set command "timeDesign -preplace -prefix preplace -outDir $vars(rpt_dir)\n" + } else { + set command [format "timeDesign -preplace -prefix preplace -outDir $vars(rpt_dir) %s\n" $vars(time_design_options,setup)] + } + append commands [FF::wrap_command $vars(step),time_design $command] + } + + ############################################################################### + # Check data setup (sanity check) + ############################################################################### + set command "checkDesign -all\n" + append commands [FF::wrap_command $vars(step),check_design $command] + + if {!$vars(ilm)} { + set command "check_timing\n" + append commands [FF::wrap_command $vars(step),check_timing $command] + } + + ############################################################################### + # Generate reports + #------------------------------------------------------------------------------ + # Report power domain for level-shifters, isolation and pg nets + #------------------------------------------------------------------------------ + if {[FF::is_lp_flow] && ([info exists vars(power_domains)] && ([llength $vars(power_domains)] > 1))} { +# set command "set domains \[FF_EDI::get_power_domains_code\]\n" + set command [FF_EDI::get_power_domains_code] + + append command "foreach domain \$domains {\n" + append command " set domain_file \[regsub -all {\[\]\[<>|\\/?*:\]} \$domain _\]\n" + append command " reportPowerDomain -powerDomain \$domain -file $vars(rpt_dir)/\${domain_file}.rpt -shifter -isoInst -pgNet\n" + + #------------------------------------------------------------------------------ + # Report library binding for power domains + #------------------------------------------------------------------------------ + append command " foreach analysis_view \[all_setup_analysis_views\] {\n" + append command " set_default_view -setup \$analysis_view\n" + append command " reportPowerDomain -powerDomain \$domain -file $vars(rpt_dir)/\${domain_file}_\$analysis_view.rpt -bindLib\n" + append command " }\n" + + append command " setAnalysisMode -checkType hold\n" + + append command " foreach analysis_view \[all_hold_analysis_views\] {\n" + append command " set_default_view -hold \$analysis_view\n" + append command " reportPowerDomain -powerDomain \$domain -file $vars(rpt_dir)/\${domain_file}_\$analysis_view.rpt -bindLib\n" + append command " }\n" + + append command " setAnalysisMode -checkType setup\n" + append command "}\n" + append commands [FF::wrap_command $vars(step),report_power_domains $command] + if {$vars(flow) =="mmmc"} { + append commands "set_default_view -setup $vars(default_setup_view) -hold $vars(default_hold_view)\n" + } + } + + if {[info exists comments]} { + if {$comments == ""} { + if {[info exists vars(comments)]} { + unset vars(comments) + } + } else { + set vars(comments) $comments + } + } + if {[info exists ucomments]} { + if {$ucomments == ""} { + if {[info exists vars(ucomments)]} { + unset vars(ucomments) + } + } else { + set vars(ucomments) $ucomments + } + } + set fcommands [FF_EDI::insert_comments] + append fcommands $commands + + if {$vars(codegen)} { + return $fcommands + } else { + uplevel #0 eval $commands + } + + } + + proc run_place {{format 1}} { + + global vars + global env + global errors + + if {[info exists vars(parent)] && ($vars(parent) == "rc")} { + set vars(step) rcp + } else { + if {$vars(step) != "partition_place"} { + set vars(step) place + } + } + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + set command [FF_EDI::initialize_step place] + append commands [FF_EDI::insert_comments] + append commands [FF::wrap_command $vars(step),initialize_step $command] + + append commands "Puts \" RUNNING PLACEMENT ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING PLACEMENT\n" + append commands "#\n" + } + + if {[info exists vars(partition_list)] && ($vars(step) != "partition_place") && \ + (([lsearch $vars(partition_list) $vars(design)] == -1) && $vars(enable_flexilm))} { + set command "" + append command "setHierMode -optStage preCTS\n" + append commands [FF::wrap_command $vars(step),set_hier_mode $command] + + set command "" + foreach block $vars(partition_list) { + append command "setPtnPinStatus -cell $block -pin * -status unplaced\n" + } + append commands [FF::wrap_command $vars(step),set_ptn_pin_status $command] + + set command "" + if {[lindex [split $vars(version) "."] 0] < 16} { + append command "setTrialRouteMode -honorPin false -handlePartitionComplex true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode1 $command] + } else { + append command "setRouteMode -earlyGlobalRoutePartitionHonorFence . -earlyGlobalRoutePartitionHonorPin {}\n" + append commands [FF::wrap_command $vars(step),set_route_mode1 $command] + } + + set command "" + append command "setOptMode -handlePartitionComplex true\n" + append commands [FF::wrap_command $vars(step),set_opt_mode $command] + + } + + ######################################################################### + # Load optional pre placement file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_place_tcl] + + ######################################################################### + # Run standard cell placement or load placement plug-in + ######################################################################### + + set command "" + if {[info exists vars(place_tcl)]} { + if {[file exists $vars(place_tcl)]} { + append command [FF::source_plug place_tcl] + } else { + set errors($vars(error_count)) "Plug-in vars(place_tcl) defined but the file does not exist" + incr vars(error_count) +# set vars(abort) 1 + } + } else { + if {[info exists vars(sdp_files)]} { + foreach file $vars(sdp_files) { + append command "#readSdpFile -file $file -hierPath -origin -leftOverGroup \n" + } + append command "#planDesign -useSdpGroup\n" + } + + if {[info exists vars(parent)] && ($vars(parent) == "rc")} { + append command "placeDesign \n" + } else { + if {$vars(place_opt_design) && ($vars(step) != "partition_place")} { +# if {[info exists vars(hier)]} { +# if {($vars(top) && $vars(enable_flexilm))} { +# append command "placeDesign " +# if {[lindex [split $vars(version) "."] 0] < 13} { +# if {[info exists vars(in_place_opt)] && $vars(in_place_opt)} { +# append command " -inPlaceOpt" +# } +# } +# if {[info exists vars(no_pre_place_opt)] && $vars(no_pre_place_opt)} { +# append command " -noPrePlaceOpt" +# } +# append command "\n" +# } else { +# append command "place_opt_design -out_dir $vars(rpt_dir) -prefix $vars(step)\n" +# } +# } else { + append command "place_opt_design -out_dir $vars(rpt_dir) -prefix $vars(step)\n" +# } + + } else { + append command "placeDesign " + if {[lindex [split $vars(version) "."] 0] < 13} { + if {[info exists vars(in_place_opt)] && $vars(in_place_opt)} { + append command " -inPlaceOpt" + } + } + if {($vars(step) == "partition_place") && $vars(use_flexmodels)} { + append command " -noPrePlaceOpt" + } else { + if {[info exists vars(no_pre_place_opt)] && $vars(no_pre_place_opt)} { + append command " -noPrePlaceOpt" + } + } + append command "\n" + } + } + } + + if {[info exist vars(parent)] && ($vars(parent) != "rc") && $vars(rc) && $vars(enable_rcp)} { + set command "ecoPlace\n" + append commands [FF::wrap_command $vars(step),eco_place $command] + } else { +# if {[info exists vars(hier_case)] && [regexp "^1" $vars(hier_case)]} { +# append commands [FF::wrap_command $vars(step),place_design "placeDesign -noPrePlaceOpt\n"] +# } else { + append commands [FF::wrap_command $vars(step),place_design $command] +# } + } + + ######################################################################### + # Load optional post placement file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_place_tcl 0] + + ######################################################################### + # Add tie cells for logic 0/1 nets + ######################################################################### + + set command [FF_EDI::add_tie_cells false true] + append commands [FF::wrap_command $vars(step),add_tie_cells $command] + + ############################################################################### + # Check post-place timing + ############################################################################### + if {![regexp "place_opt_design" $commands] && ($vars(step) == "place")} { + if {![info exists vars(time_design_options,setup)]} { + set command "timeDesign -prects -prefix place -outDir $vars(rpt_dir)\n" + } else { + set command [format "timeDesign %s -prects -prefix place -outDir $vars(rpt_dir)\n" $vars(time_design_options,setup)] + } + append commands [FF::wrap_command $vars(step),time_design $command] + } +# if {($vars(step) == "partition_place") && $vars(use_flexmodels)} { +# if {![regexp "proto" $command]} { +# regsub "timeDesign" $command "timeDesign -proto" command +# } +# } + + if {($vars(user_mode) == "hier") && $vars(place_opt_design) && ($vars(step) != "partition_place")} { + set ptn [file tail [pwd]] + if {[info exists vars(partition_list)] && ([lsearch $vars(partition_list) $ptn] != -1)} { + if {$vars(enable_flexilm)} { + set command "createInterfaceLogic -dir $ptn.flexilm -useType flexIlm -optStage preCTS\n" + append commands [FF::wrap_command $vars(step),create_flex_ilm $command] + } else { + if {!$vars(black_box)} { + if {[string compare -nocase $vars(dbs_format) "fe"]==0} { + set command "createInterfaceLogic -modelType timing -dir $ptn.ilm -hold\n" + } else { + set command "createInterfaceLogic -modelType timing -cellview {$vars(oa_partition_lib) $ptn abstract}\n" + } + } + append commands [FF::wrap_command $vars(step),create_ilm $command] + } + } else { + if {$vars(enable_flexilm)} { + set command "" + append command "saveDesign $vars(dbs_dir)/prects_flexilm.enc -compress\n" + append commands [FF::wrap_command $vars(step),save_design $command] + + # Re-assign pins based on new netlist changes + set command "" + if {[lindex [split $vars(version) "."] 0] < 16} { + append command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route1 $command] + } else { + append command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route1 $command] + } + + + set command "" + append command "timeDesign -preCTS -outDir $vars(rpt_dir) -prefix prects_flexilm\n" + append commands [FF::wrap_command $vars(step),time_design_flexilm $command] + + set command "" + append command "assignPtnPin\n" + append commands [FF::wrap_command $vars(step),assign_ptn_pin $command] + + set command "" + append command "checkPinAssignment\n" + append commands [FF::wrap_command $vars(step),check_pin_assignment $command] + + set command "" + if {[lindex [split $vars(version) "."] 0] < 16} { + append command "setTrialRouteMode -honorPin true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode2 $command] + set command "" + append command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route2 $command] + } else { + append command "setRouteMode -earlyGlobalRoutePartitionHonorPin .\n" + append commands [FF::wrap_command $vars(step),set_route_mode2 $command] + set command "" + append command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route2 $command] + } + + +# set command "" +# append command "setBudgetingMode -enableMTBudgeting true\n" +# append commands [FF::wrap_command $vars(step),set_budgeting_mode $command] + + set command "" + append command "deriveTimingBudget\n" + append commands [FF::wrap_command $vars(step),derive_timing_budget $command] + + set command "" + set dirs "" + foreach block $vars(partition_list) { + append dirs "\\\n -goldenBlockDir ../$block/$vars(dbs_dir)/place.enc.dat " + } + append command "update_partition \\\n -flexIlmECO $dirs \\\n -flexIlmDir ../../PARTITION_FLEXILM \\\n -postECOSuffix postECO -pinLocation\n" +# append command "update_partition \\\n -flexIlmECO $dirs \\\n -flexIlmDir ../../PARTITION_FLEXILM \\\n -postECOSuffix postECO -pinLocation -allowPortECO\n" + append commands [FF::wrap_command $vars(step),update_partition $command] + } + } + } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_prects {{format 1}} { + + global vars + global env + global errors + global warnings + + if {$vars(place_opt_design)} { +# if {!($vars(user_mode) == "hier")} { + return "" +# } else { +# set warnings($vars(warning_count)) "Feature vars(place_opt_design) not support for top level implementation when vars(enable_flexilm) is true" +# incr vars(warning_count) +# } + } + + if {[info exists vars(parent)] && ($vars(parent) == "rc")} { + set vars(step) rcp + } else { + set vars(step) prects + } + + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_EDI::initialize_step prects] + append commands [FF_EDI::insert_comments] + append commands [FF::wrap_command $vars(step),initialize_step $command] + + append commands "Puts \" RUNNING PRE-CTS OPTIMIZATION ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING PRE-CTS OPTIMIZATION\n" + append commands "#\n" + } + + ######################################################################### + # Load optional pre CTS file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_prects_tcl] + + if {[info exists vars(parent)] && ($vars(parent) == "rc")} { + return $commands + } + + ######################################################################### + # Run pre-CTS optimization + ######################################################################### + + if {([info exists vars(partition_list)]) && ([file tail [file dirname [pwd]]] == "$vars(partition_dir)")} { + set ptn [file tail [pwd]] + if {([lsearch $vars(partition_list) $ptn] == -1) && $vars(enable_flexilm)} { + # Top level flow for flexIlm + + set command "" + foreach block $vars(partition_list) { + append command "setPtnPinStatus -cell $block -pin * -status unplaced\n" + } + append commands [FF::wrap_command $vars(step),set_ptn_pin_status $command] + + set command "" + if {[lindex [split $vars(version) "."] 0] < 16} { + append command "setTrialRouteMode -honorPin false -handlePartitionComplex true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode1 $command] + } else { + append command "setRouteMode -earlyGlobalRoutePartitionHonorFence . -earlyGlobalRoutePartitionHonorPin {}\n" + append commands [FF::wrap_command $vars(step),set_route_mode1 $command] + } + +# set command "" +# append command "setHierMode -optStage preCTS\n" +# append commands [FF::wrap_command $vars(step),set_hier_mode $command] + + set command "" + append command "setOptMode -handlePartitionComplex true\n" + append commands [FF::wrap_command $vars(step),set_opt_mode $command] + + set command "" + append command "optDesign -preCTS -outDir $vars(rpt_dir) -prefix flexilm\n" + append commands [FF::wrap_command $vars(step),opt_design $command] + + set command "" + append command "saveDesign $vars(dbs_dir)/prects_flexilm.enc -compress\n" + append commands [FF::wrap_command $vars(step),save_design $command] + } else { + # Non flexIlm top flow and partition flow + set command "optDesign -preCTS -outDir $vars(rpt_dir) -prefix prects\n" + append commands [FF::wrap_command $vars(step),opt_design $command] + } + } else { + # Flat flow + set command "optDesign -preCTS -outDir $vars(rpt_dir) -prefix prects\n" + append commands [FF::wrap_command $vars(step),opt_design $command] + } + + ######################################################################### + # Load optional post CTS file (plug-in) + ######################################################################### + + set command "" + append commands [FF::source_plug post_prects_tcl 0] + + if {[info exists vars(clock_gate_clone)] && $vars(clock_gate_clone)} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING CLOCK GATE CLONING\n" + append commands "#\n" + } + # Set spec_file if one is defined + if {[info exists vars(cts_spec)]} { + set spec_file $vars(cts_spec) + } + if {([info exists vars(partition_list)]) && + ([file tail [file dirname [pwd]]] == "$vars(partition_dir)")} { + set ptn [file tail [pwd]] + # Override with partition spec if defined + if {[info exists vars($ptn,cts_spec)]} { + set spec_file $vars($ptn,cts_spec) + } + } + # Load final spec file or generate one +# if {[info exists spec_file]} { +# append commands "cleanupSpecifyClockTree\n" +# foreach spec $spec_file { +# append commands "specifyClockTree -file $spec\n" +# } +# } else { +# append commands "createClockTreeSpec\n" +# if {[info exists vars(cts_cells)]} { +# append commands "specifyClockTree -update \"AutoCTSRootPin * Buffer \[list $vars(cts_cells)\]\"\n" +# } +# } +# if {[info exists vars(route_clock_nets)] && $vars(route_clock_nets)} { +# append commands "specifyClockTree -update \"AutoCTSRootPin * RouteClkNet YES\"\n" +# } + + set command "ckCloneGate -timingDriven -forceReconvergent\n" + append commands [FF::wrap_command $vars(step),ck_clone_gate $command] + } + if {($vars(user_mode) == "hier")} { + set ptn [file tail [pwd]] + if {[info exists vars(partition_list)] && ([lsearch $vars(partition_list) $ptn] != -1) && !$vars(place_opt_design)} { + if {$vars(enable_flexilm)} { + set command "createInterfaceLogic -dir $ptn.flexilm -useType flexIlm -optStage preCTS\n" + append commands [FF::wrap_command $vars(step),create_flex_ilm $command] + } else { + if {!$vars(black_box)} { + if {[string compare -nocase $vars(dbs_format) "fe"]==0} { + set command "createInterfaceLogic -modelType timing -dir $ptn.ilm -hold\n" + } else { + set command "createInterfaceLogic -modelType timing -cellview {$vars(oa_partition_lib) $ptn abstract}\n" + } + } + append commands [FF::wrap_command $vars(step),create_ilm $command] + } + } else { ; # Top level unconditional (no place_opt_design support) ... + if {$vars(enable_flexilm)} { + # Re-assign pins based on new netlist changes + set command "" + if {[lindex [split $vars(version) "."] 0] < 16} { + append command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route1 $command] + } else { + append command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_route1 $command] + } + + set command "" + append command "timeDesign -preCTS -outDir $vars(rpt_dir) -prefix assemble_flexilm\n" + append commands [FF::wrap_command $vars(step),time_design $command] + + set command "" + append command "assignPtnPin\n" + append commands [FF::wrap_command $vars(step),assign_ptn_pin $command] + + set command "" + append command "checkPinAssignment\n" + append commands [FF::wrap_command $vars(step),check_pin_assignment $command] + + set command "" + if {[lindex [split $vars(version) "."] 0] < 16} { + append command "setTrialRouteMode -honorPin true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode2 $command] + } else { + append command "setRouteMode -earlyGlobalRoutePartitionHonorPin .\n" + append commands [FF::wrap_command $vars(step),set_route_mode2 $command] + } + + set command "" + if {[lindex [split $vars(version) "."] 0] < 16} { + append command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route2 $command] + } else { + append command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_route2 $command] + } + +# set command "" +# append command "setBudgetingMode -enableMTBudgeting true\n" +# append commands [FF::wrap_command $vars(step),set_budgeting_mode $command] + + set command "" + append command "deriveTimingBudget\n" + append commands [FF::wrap_command $vars(step),derive_timing_budget $command] + + set command "" + set dirs "" + foreach block $vars(partition_list) { + if {$vars(place_opt_design)} { + append dirs "\\\n -goldenBlockDir ../$block/$vars(dbs_dir)/place.enc.dat " + } else { + append dirs "\\\n -goldenBlockDir ../$block/$vars(dbs_dir)/prects.enc.dat " + } + } + append command "update_partition \\\n -flexIlmECO $dirs \\\n -flexIlmDir ../../PARTITION_FLEXILM \\\n -postECOSuffix postECO -pinLocation\n" +# append command "update_partition \\\n -flexIlmECO $dirs \\\n -flexIlmDir ../../PARTITION_FLEXILM \\\n -postECOSuffix postECO -pinLocation -allowPortECO\n" + append commands [FF::wrap_command $vars(step),update_partition $command] + } + } + } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_cts {{format 1}} { + + global vars + global errors + + if {$vars(skip_cts)} { + return "" + } + + set vars(step) cts + set commands "" + set ucomments "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_EDI::initialize_step cts] + append commands [FF_EDI::insert_comments] + append commands [FF::wrap_command cts,initialize_step $command] + + if {$vars(top) && ($vars(user_mode) == "hier") && ($vars(hier_flow_type) == "2pass") && $vars(enable_flexilm)} { + # Read Power Intent here ... + FF_EDI::normalize_files +# set save $vars(cpf_power_domain) +# set vars(cpf_power_domain) true +# append commands [FF_EDI::load_power_intent] +# set vars(cpf_power_domain) $save + set command "" + foreach part $vars(partition_list) { + if {[info exists vars($part,ilm_dir)] && ($vars(codegen) || [file isdirectory $vars($part,ilm_dir)])} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "specifyIlm -cell $part -dir $vars($part,ilm_dir)\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "specifyIlm -cell $part\n" + } else { + append command "specifyIlm -cell $part -dir $vars($part,ilm_dir)\n" + } + } + } else { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "specifyIlm -cell $part -dir ../$part/$part.ilm\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "specifyIlm -cell $part\n" + } else { + append command "specifyIlm -cell $part -dir ../$part/$part.ilm\n" + } + } + } + } + if {$command != ""} { + append commands [FF::wrap_command $vars(step),specify_ilm $command] + } + + set command [FF_EDI::initialize_timing mmmc] +# if {![info exists vars(cpf_file)] || ([info exists vars(cpf_file)] && !$vars(cpf_timing)) } { + append commands [FF::wrap_command $vars(step),initialize_timing $command] +# } else { +# set defer_commands [FF::wrap_command $vars(step),initialize_timing $command] +# } + if {[lindex [split $vars(version) "."] 0] < 14} { + append commands [FF_EDI::load_power_intent] + } else { + append commands [FF_NOVUS::load_power_intent] + } + } + + append commands "Puts \" RUNNING CLOCK TREE SYNTHESIS ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING CLOCK TREE SYNTHESIS\n" + append commands "#\n" + } + + ######################################################################### + # Load pre-CTS file (plug-in) + ######################################################################### + if {$vars(cts_engine) == "cts"} { + append commands [FF::source_plug pre_cts_tcl] + } + + ######################################################################### + # Run CTS + #------------------------------------------------------------------------ + # Generate the clock tree using clockDesign which: + # - loads the clock specification file + # - removes existing buffers in the clock tree (not marked don't touch); + # if a clock tree has been previously inserted, use changeClockStatus + # to unfix the tree so that it can be removed + # - unfixes the clock nets after tree insertion + # Need to make sure the clock gating cells are usable during clockDesign. + # Disable them afterwards. + ######################################################################### + + set clock_gate_cells [list] + set command "" + if {[info exists vars(clock_gate_cells)]} { + set clock_gate_cells $vars(clock_gate_cells) + foreach cell $clock_gate_cells { + append command "setDontUse $cell false\n" + } + } + append commands [FF::wrap_command cts,enable_clock_gate_cells $command] + + ######################################################################### + # Run CTS + ######################################################################### + + set command "" + if {[string tolower $vars(cts_engine)] == "cts"} { + if {[info exists vars(cts_tcl)]} { + if {[file exists $vars(cts_tcl)]} { + append commands [FF::source_plug cts_tcl] + } else { + set errors($vars(error_count)) "Plug-in vars(cts_tcl) defined but the file does not exist" + incr vars(error_count) +# set vars(abort) 1 + } + } else { + if {[info exists vars(cts_spec)]} { + append command "cleanupSpecifyClockTree\n" + foreach spec $vars(cts_spec) { + append command "specifyClockTree -file $spec\n" + } + } else { + if {[lindex [split $vars(version) "."] 0] < 15} { + if {!$vars(ilm)} { + append command "createClockTreeSpec\n" + if {[info exists vars(cts_cells)]} { + append command "specifyClockTree -update \"AutoCTSRootPin * Buffer $vars(cts_cells)\"\n" + } + } + } + } + if {[info exists vars(cts_spec)] || (![info exists vars(cts_spec)] && ([lindex [split $vars(version) "."] 0] < 15))} { + if {[info exists vars(route_clock_nets)] && $vars(route_clock_nets)} { + append command "specifyClockTree -update \"AutoCTSRootPin * RouteClkNet YES\"\n" + } + append commands [FF::wrap_command cts,create_clock_tree_spec $command] + set command "" + if {$vars(update_io_latency)} { + append command "clockDesign -skipTimeDesign -updateIoLatency -outDir $vars(rpt_dir)\n" + } else { + append command "clockDesign -skipTimeDesign -outDir $vars(rpt_dir)\n" + } + } else { + append command "clockDesign -skipTimeDesign -outDir $vars(rpt_dir)\n" + } + append commands [FF::wrap_command cts,clock_design $command] + } + set command "" + foreach cell $clock_gate_cells { + append command "setDontUse $cell true\n" + } + append commands [FF::wrap_command cts,disable_clock_gate_cells $command] + + ######################################################################### + # Run ckECO if requested + ######################################################################### + + if {[info exists vars(clock_eco)] && (($vars(clock_eco) == "post_cts") || ($vars(clock_eco) == "both"))} { + set command [FF_EDI::run_clock_eco post_cts] + append commands [FF::wrap_command cts,run_clock_eco $command] + } + + ######################################################################### + # Update timing based on vars(,incr_cts_sdc) and + # vars(,post_cts_sdc) + ######################################################################### + + if {$vars(flow) == "mmmc"} { + set command [FF_EDI::update_timing mmmc] + append commands [FF::wrap_command cts,update_timing $command] + set command [FF_EDI::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } else { + set command [FF_EDI::update_timing minmax] + append commands [FF::wrap_command cts,update_timing $command] + set command [FF_EDI::derate_timing minmax] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } + if {$vars(ilm) && [info exists vars(ilm_non_sdc_file)]} { + if {[file exists $vars(ilm_non_sdc_file)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" + } else { + set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" + } + append commands [FF::wrap_command $var(step),load_ilm_non_sdc_file $command] + } + } + ############################################################################### + # Check post-cts timing + ############################################################################### + if {![info exists vars(time_design_options,setup)]} { + set command "timeDesign -postcts -prefix cts -outDir $vars(rpt_dir)\n" + } else { + set command [format "timeDesign -postcts -prefix cts -outDir $vars(rpt_dir) %s\n" $vars(time_design_options,setup)] + } + append commands [FF::wrap_command cts,time_design $command] + } else { + ######################################################################### + # Run ccoptDesign ... convert to propagated timing first + ######################################################################### + if {[info exists vars(cts_tcl)]} { + if {[file exists $vars(cts_tcl)]} { + append commands [FF::source_plug pre_cts_tcl] + append commands [FF::source_plug cts_tcl] + } else { + set errors($vars(error_count)) "Plug-in vars(cts_tcl) defined but the file does not exist" + incr vars(error_count) + } + } else { + set is_native [expr {$vars(ccopt_integration) == "native"}] + set command [FF_EDI::update_timing mmmc [expr !$is_native]] + append commands [FF::wrap_command cts,update_timing $command] + set command [FF_EDI::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + append commands [FF::source_plug pre_cts_tcl] + if {[lindex [split $vars(version) "."] 0] <= 14} { + if {[regexp "^ccopt" $vars(cts_engine)] && ($vars(ccopt_effort) != "low")} { + append commands [FF::source_plug pre_postcts_tcl 0] + if {$vars(postcts_setup_hold)} { + append commands [FF::source_plug pre_postcts_hold_tcl] + } + } + } else { + if {$vars(ccopt_effort) != "low"} { + append commands [FF::source_plug pre_postcts_tcl 0] + if {$vars(postcts_setup_hold)} { + append commands [FF::source_plug pre_postcts_hold_tcl] + } + } + } + if {$vars(ccopt_effort) != "low"} { +# append commands [FF::wrap_command $vars(step),set_ccopt_mode "set_ccopt_mode -effort $vars(ccopt_effort)\n"] + append commands [FF::wrap_command $vars(step),set_ccopt_mode "set_ccopt_effort -$vars(ccopt_effort)\n"] + } + + if {$vars(cts_engine) == "ccopt_cts"} { + set ccopt_command "ccopt_design -outDir $vars(rpt_dir) -prefix $vars(step) -cts" + } else { + set ccopt_command "ccopt_design -outDir $vars(rpt_dir) -prefix $vars(step)" + + if {$vars(postcts_setup_hold)} { + append ccopt_command " -hold" + } + } + + if {$is_native} { + if {[lindex [split $vars(version) "."] 0] <= 14} { + if {$vars(cts_engine) == "ccopt_cts" && [info exists vars(cts_spec)]} { + append command "cleanupSpecifyClockTree\n" + foreach spec $vars(cts_spec) { + append command "specifyClockTree -file $spec\n" + } + append command "set_ccopt_mode -import_edi_cts_spec true\n" + append commands [FF::wrap_command cts,create_ccopt_clock_tree_spec $command] + } else { + set command "create_ccopt_clock_tree_spec\n" + append commands [FF::wrap_command cts,create_ccopt_clock_tree_spec $command] + } + } else { + if {($vars(ccopt_effort) == "low") && [info exists vars(cts_spec)]} { + append command "cleanupSpecifyClockTree\n" + foreach spec $vars(cts_spec) { + append command "specifyClockTree -file $spec\n" + } + append command "set_ccopt_mode -import_edi_cts_spec true\n" + append commands [FF::wrap_command cts,create_ccopt_clock_tree_spec $command] + } else { + set command "create_ccopt_clock_tree_spec\n" + append commands [FF::wrap_command cts,create_ccopt_clock_tree_spec $command] + } + } + } + + append ccopt_command "\n" + append commands [FF::wrap_command cts,ccopt_design $ccopt_command] + } + } + + ######################################################################### + # Load optional post CTS file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_cts_tcl 0] + if {[lindex [split $vars(version) "."] 0] <= 14} { + if {[regexp "^ccopt" $vars(cts_engine)] && ($vars(ccopt_effort) != "low")} { + append commands [FF::source_plug post_postcts_tcl 0] + if {$vars(postcts_setup_hold)} { + append commands [FF::source_plug post_postcts_hold_tcl] + } + } + } else { + if {$vars(ccopt_effort) != "low"} { + append commands [FF::source_plug post_postcts_tcl 0] + if {$vars(postcts_setup_hold)} { + append commands [FF::source_plug post_postcts_hold_tcl] + } + } + } + + ######################################################################### + # Reset clock gating cell usage + ######################################################################### + + if {$vars(hier_flow_type) == "2pass"} { + set ptn [file tail [pwd]] + if {[info exists vars(partition_list)] && ([lsearch $vars(partition_list) $ptn] != -1) && !$vars(enable_flexilm)} { + if {[string compare -nocase $vars(dbs_format) "fe"]==0} { + set command "createInterfaceLogic -modelType timing -dir $ptn.ilm -hold\n" + } else { + if {[lindex [split $vars(version) "."] 0] > 10} { + set command "createInterfaceLogic -modelType timing -cellview {$vars(oa_partition_lib) $ptn abstract}\n" + } else { + set command "createInterfaceLogic -modelType timing -dir $ptn.ilm -hold\n" + } + } + append commands [FF::wrap_command $vars(step),create_ilm $command] + } + } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_preroute {{format 1}} { + + global vars + global errors + + set vars(step) preroute + set commands "" + set ucomments "" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_EDI::initialize_step place] + append command [FF_EDI::initialize_step prects] + append command [FF_EDI::initialize_step cts] + append commands [FF_EDI::insert_comments] + append commands [FF::wrap_command preroute,initialize_step $command] + + if {$vars(top) && ($vars(user_mode) == "hier") && ($vars(hier_flow_type) == "2pass") && $vars(enable_flexilm)} { + # Read Power Intent here ... + FF_EDI::normalize_files + set command "" + foreach part $vars(partition_list) { + if {[info exists vars($part,ilm_dir)] && ($vars(codegen) || [file isdirectory $vars($part,ilm_dir)])} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "specifyIlm -cell $part -dir $vars($part,ilm_dir)\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "specifyIlm -cell $part\n" + } else { + append command "specifyIlm -cell $part -dir $vars($part,ilm_dir)\n" + } + } + } else { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "specifyIlm -cell $part -dir ../$part/$part.ilm\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "specifyIlm -cell $part\n" + } else { + append command "specifyIlm -cell $part -dir ../$part/$part.ilm\n" + } + } + } + } + if {$command != ""} { + append commands [FF::wrap_command $vars(step),specify_ilm $command] + } + + set command [FF_EDI::initialize_timing mmmc] + append commands [FF::wrap_command $vars(step),initialize_timing $command] + if {[lindex [split $vars(version) "."] 0] < 14} { + append commands [FF_EDI::load_power_intent] + } else { + append commands [FF_NOVUS::load_power_intent] + } + } + + append commands "Puts \" RUNNING PRE ROUTE OPTIMIZATION ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING PRE ROUTE OPTIMIZATION\n" + append commands "#\n" + } + + ######################################################################### + # Load pre-CTS file (plug-in) + ######################################################################### + append commands [FF::source_plug pre_preroute_tcl] + + set clock_gate_cells [list] + set command "" + if {[info exists vars(clock_gate_cells)]} { + set clock_gate_cells $vars(clock_gate_cells) + foreach cell $clock_gate_cells { + append command "setDontUse $cell false\n" + } + } + append commands [FF::wrap_command cts,enable_clock_gate_cells $command] + + ######################################################################### + # Run pre-route optimization flow + ######################################################################### + + set command "" + + ######################################################################### + # Update timing based on vars(,incr_cts_sdc) and + # vars(,post_cts_sdc) + ######################################################################### + + set command [FF_EDI::update_timing mmmc] + append commands [FF::wrap_command cts,update_timing $command] + set command [FF_EDI::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + + if {$vars(ilm) && [info exists vars(ilm_non_sdc_file)]} { + if {[file exists $vars(ilm_non_sdc_file)]} { + set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" + append commands [FF::wrap_command $var(step),load_ilm_non_sdc_file $command] + } + } + + set command "preroute_opt_design -prefix $vars(step) -out_dir $vars(rpt_dir)\n" + + append commands [FF::wrap_command preroute,opt_design $command] + + append commands [FF::source_plug post_preroute_tcl] + ######################################################################### + # Reset clock gating cell usage + ######################################################################### + + if {$vars(hier_flow_type) == "2pass"} { + set ptn [file tail [pwd]] + if {[info exists vars(partition_list)] && ([lsearch $vars(partition_list) $ptn] != -1) && !$vars(enable_flexilm)} { + if {[string compare -nocase $vars(dbs_format) "fe"]==0} { + set command "createInterfaceLogic -modelType timing -dir $ptn.ilm -hold\n" + } else { + set command "createInterfaceLogic -modelType timing -cellview {$vars(oa_partition_lib) $ptn abstract}\n" + } + append commands [FF::wrap_command $vars(step),create_ilm $command] + } + } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_postcts {{format 1}} { + + global vars + global env + global errors + +# if {($vars(skip_cts)) || [regexp "^ccopt" [string tolower $vars(cts_engine)]]} { +# if {$vars(cts_engine) != "ccopt_cts"} { +# return "" +# } +# } + + if {$vars(skip_cts)} { return "" } + + if {[lindex [split $vars(version) "."] 0] <= 14} { + if {[regexp "^ccopt" [string tolower $vars(cts_engine)]] && ($vars(ccopt_effort) != "low")} { + return "" + } + } else { + if {[string tolower $vars(cts_engine)] == "ccopt"} { + return "" + } +# if {$vars(ccopt_effort) != "low"} { +# return "" +# } + } + + set vars(step) postcts + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_EDI::initialize_step postcts] + append commands [FF_EDI::insert_comments] + append commands [FF::wrap_command postcts,initialize_step $command] + + ############################################################################### + # Specify the ILM models for the top partition (only for 2pass flow) + ############################################################################### + if {$vars(top) && ($vars(user_mode) == "hier") && ($vars(hier_flow_type) == "2pass") && !$vars(enable_flexilm)} { +# if {!$(vars(black_box)} { + set command "" + foreach part $vars(partition_list) { + if {[info exists vars($part,ilm_dir)] && ($vars(codegen) || [file isdirectory $vars($part,ilm_dir)])} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "specifyIlm -cell $part -dir $vars($part,ilm_dir)\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "specifyIlm -cell $part\n" + } else { + append command "specifyIlm -cell $part -dir $vars($part,ilm_dir)\n" + } + } + } else { + if {[lindex [split $vars(version) "."] 0] <= 10} { + append command "specifyIlm -cell $part -dir ../$part/$part.ilm\n" + } else { + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + append command "specifyIlm -cell $part\n" + } else { + append command "specifyIlm -cell $part -dir ../$part/$part.ilm\n" + } + } + } + } + if {$command != ""} { + append commands [FF::wrap_command $vars(step),specify_ilm $command] + } + if {$vars(flow) == "mmmc"} { + set command [FF_EDI::update_timing mmmc] + append commands [FF::wrap_command postcts,update_timing $command] + set command [FF_EDI::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } else { + set command [FF_EDI::update_timing minmax] + append commands [FF::wrap_command postcts,update_timing $command] + set command [FF_EDI::derate_timing minmax] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } + if {$vars(ilm) && [info exists vars(ilm_non_sdc_file)]} { + if {[file exists $vars(ilm_non_sdc_file)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" + } else { + set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" + } + append commands [FF::wrap_command $vars(step),load_ilm_non_sdc_file $command] + } + } +# } + +# set command [FF_EDI::initialize_timing mmmc] +# if {![info exists vars(cpf_file)]} { +# append commands [FF::wrap_command $vars(step),initialize_timing $command] +# } else { +# set defer_commands [FF::wrap_command $vars(step),initialize_timing $command] +# } + } + + append commands "Puts \" RUNNING POST-CTS OPTIMIZATION ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST-CTS OPTIMIZATION\n" + append commands "#\n" + } + + ######################################################################### + # Load optional pre postCTS file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_postcts_tcl] + + if {[lindex [split $vars(version) "."] 0] <= 14} { + if {$vars(cts_engine) == "ccopt" && $vars(ccopt_integration) == "native"} { + set command "Puts \" NO POST-CTS OPTIMIZATION REQUIRED FOR CCOPT NATIVE INTEGRATION\"\n" + append commands [FF::wrap_command postcts,opt_design $command] + } else { + ######################################################################### + # Run post-CTS optimization + ######################################################################### + + set command "optDesign -postCTS -outDir $vars(rpt_dir) -prefix postcts\n" + append commands [FF::wrap_command postcts,opt_design $command] + } + } else { + if {$vars(cts_engine) == "ccopt_cts"} { + set command "optDesign -postCTS -outDir $vars(rpt_dir) -prefix postcts\n" + append commands [FF::wrap_command postcts,opt_design $command] + } + } + ######################################################################### + # Load optional post postCTS file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_postcts_tcl 0] + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_postcts_hold {{format 1}} { + + global vars + global env + global errors + + if {$vars(skip_cts) || ([lsearch $vars(fix_hold) postcts] < 0) || ($vars(postcts_setup_hold) && ($vars(cts_engine) != "ccopt_cts"))} { + return "" + } + + set vars(step) postcts_hold + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_EDI::initialize_step postcts_hold] + append commands [FF_EDI::insert_comments] + append commands [FF::wrap_command postcts_hold,initialize_step $command] + + append commands "Puts \" RUNNING POST-CTS HOLD FIXING ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST-CTS HOLD FIXING\n" + append commands "#\n" + } + + ######################################################################### + # Load pre-postCTS hold file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_postcts_hold_tcl] + + set command "optDesign -postCTS -hold -outDir $vars(rpt_dir) -prefix postcts_hold\n" + append commands [FF::wrap_command postcts_hold,opt_design $command] + + ######################################################################### + # Load post-postCTS hold file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_postcts_hold_tcl 0] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_route {{format 1}} { + + global vars + global env + global errors + + set vars(step) route + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_EDI::initialize_step route] + append commands [FF_EDI::insert_comments] + append commands [FF::wrap_command route,initialize_step $command] + set command [FF_EDI::add_filler_cells] + append commands [FF::wrap_command route,add_filler_cells $command] + + append commands "Puts \" RUNNING GLOBAL/DETAIL ROUTING ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING GLOBAL/DETAIL ROUTING\n" + append commands "#\n" + } + + ######################################################################### + # Load optional pre route file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_route_tcl] + + set command [FF_EDI::route_secondary_pg_nets] + append commands [FF::wrap_command route,route_secondary_pg_nets $command] + + set command "checkPlace $vars(rpt_dir)/$vars(step),check_place.rpt\n" + append commands [FF::wrap_command route,check_place $command] + + ######################################################################### + # Route the design + ######################################################################### + + set command "" + set args "" + if {($vars(enable_ocv) == "pre_postroute") || ($vars(enable_ocv) == "pre_postcts")} { +# if {$vars(flow) != "default"} { + append comments "# - vars(enable_ocv)\n" + append args "-analysisType onChipVariation " +# } + if {$vars(enable_aocv)} { + append comments "# - vars(enable_aocv)\n" + append args "-aocv true " + } else { + append ucomments "# - vars(enable_aocv)\n" + } + if {$vars(enable_socv)} { + append comments "# - vars(enable_socv)\n" + append args "-socv true " + } else { + append ucomments "# - vars(enable_socv)\n" + } + } else { + append ucomments "# - vars(enable_ocv) \"pre_postroute\"\n" + append ucomments "# - vars(enable_aocv) \"true\"\n" + append ucomments "# - vars(enable_socv) \"true\"\n" + } + if {$args != ""} { + set command "setAnalysisMode $args\n" + append commands [FF::wrap_command route,set_analysis_mode $command] + } + + if {[info exists vars(postroute_spread_wires)] && !$vars(postroute_spread_wires)} { + append commands "setNanoRouteMode -droutePostRouteSpreadWire false\n" + } + + set command "routeDesign" + if {$vars(track_opt)} { + append comments "# - vars(track_opt)\n" + append command " -trackOpt" + } else { + append ucomments "# - vars(track_opt)\n" + } + + append commands [FF::wrap_command route,route_design "$command\n"] + + ######################################################################### + # Run ckECO if requested + ######################################################################### + + if {[info exists vars(clock_eco)] && (($vars(clock_eco) == "post_route") || ($vars(clock_eco) == "both"))} { + set command [FF_EDI::run_clock_eco post_route] + append commands [FF::wrap_command route,run_clock_eco $command] + } + + ######################################################################### + # Optionally run wire spreading + ######################################################################### + + if {[regsub "nm" $vars(process) ""] > 16} { + if {[info exists vars(postroute_spread_wires)] && $vars(postroute_spread_wires)} { + set command "setNanoRouteMode -droutePostRouteSpreadWire true -routeWithTimingDriven false\n" + append command "routeDesign -wireOpt\n" + append command "setNanoRouteMode -droutePostRouteSpreadWire false\n" + append commands [FF::wrap_command route,spread_wires $command] + } + } + + ######################################################################### + # Optionally run LPA + ######################################################################### + + if {$vars(verify_litho)} { + file mkdir $vars(rpt_dir)/LPA/DMC + set command "verifyLitho -routingLayersOnly -techFile $vars(lpa_tech_file) -dir $vars(rpt_dir)/LPA\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append commands [FF::wrap_command route,verify_litho $command] + } + + ######################################################################### + # Set extraction mode to postroute + ######################################################################### + set command "setExtractRCMode -engine postRoute" + if {![catch {set arg $vars(postroute_extraction_effort)}]} { + append comments "# - vars(postroute_extraction_effort)\n" + append command " -effortLevel $arg" + } else { + append ucomments "# - vars(postroute_extraction_effort)\n" + } + if {![catch {set arg $vars(total_c_thresh)}]} { + append comments "# - vars(total_c_thresh)\n" + append command " -total_c_th $arg" + } else { + append ucomments "# - vars(total_c_thresh)\n" + } + if {![catch {set arg $vars(relative_c_thresh)}]} { + append comments "# - vars(relative_c_thresh)\n" + append command " -relative_c_th $arg" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(coupling_c_thresh)}]} { + append comments "# - vars(coupling_c_thresh)\n" + append command " -coupling_c_th $arg" + } else { + append ucomments "# - vars(relative_c_thresh)\n" + } + if {![catch {set arg $vars(qrc_layer_map)}]} { + append comments "# - vars(qrc_layer_map)\n" + append command " -lefTechFileMap $arg" + } else { + append ucomments "# - vars(qrc_layer_map)\n" + } + append command "\n" + append commands [FF::wrap_command route,set_extract_rc_mode $command] + + ######################################################################### + # Load optional post route file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_route_tcl 0] + + ######################################################################### + # Update to MMMC if flow is "pr_mmmc" + ######################################################################### + + if {$vars(flow) != "default"} { + if {$vars(flow) == "pr_mmmc"} { + set command [FF_EDI::initialize_timing mmmc] + append commands [FF::wrap_command route,initialize_timing $command] + } + } + + if {![info exists vars(time_design_options,setup)]} { + set command "timeDesign -postroute -prefix route -outDir $vars(rpt_dir)\n" + } else { + set command [format "timeDesign -postroute -prefix route -outDir $vars(rpt_dir) %s\n" $vars(time_design_options,setup)] + } + append commands [FF::wrap_command route,time_design $command] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_postroute {{format 1}} { + + global vars + global env + global errors + + set vars(step) postroute + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + if {$vars(postroute_setup_hold)} { + set command [FF_EDI::initialize_step postroute_hold] + append commands [FF_EDI::insert_comments] + append commands [FF::wrap_command postroute_hold,initialize_step $command] + } + + set command [FF_EDI::initialize_step postroute] + append commands [FF_EDI::insert_comments] + append commands [FF::wrap_command postroute,initialize_step $command] + + if {$vars(metalfill) == "pre_postroute"} { + set command [FF::source_plug metalfill_tcl] + append commands [FF::wrap_command postroute,add_metalfill $command] + } + + ######################################################################### + # Run ckECO if requested + ######################################################################### + + if {[info exists vars(clock_eco)] && (($vars(clock_eco) == "post_route") || ($vars(clock_eco) == "both"))} { + set command [FF_EDI::run_clock_eco post_route] + append commands "Puts \" RUNNING POST-ROUTE CLOCK ECO ...\"\n" + append commands [FF::wrap_command route,run_clock_eco $command] + } + + append commands "Puts \" RUNNING POST-ROUTE OPTIMIZATION ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST-ROUTE OPTIMIZATION\n" + append commands "#\n" + } + + ######################################################################### + # Load optional pre postroute file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_postroute_tcl] + if {$vars(high_timing_effort) && [regexp "9.1" $vars(version)]} { + append commands "optLeakagePower -fixTimingOnly\n" + } + if {$vars(postroute_setup_hold)} { + append commands [FF::source_plug pre_postroute_hold_tcl] + set command "optDesign -postRoute -outDir $vars(rpt_dir) -prefix postroute -setup -hold\n" + } else { + set command "optDesign -postRoute -outDir $vars(rpt_dir) -prefix postroute\n" + } + append commands [FF::wrap_command postroute,opt_design $command] + + ######################################################################### + # Trim metal fill if added + ######################################################################### + + if {$vars(metalfill) == "pre_postroute"} { + set command "trimMetalFill\n" + append commands [FF::wrap_command postroute,trim_metalfill $command] + } + + ######################################################################### + # Optionally run LPA + ######################################################################### + + if {$vars(verify_litho)} { + # BCL: Added subst to handle dererencing variables + file mkdir [subst $vars(rpt_dir)]/LPA/DMC + set command "verifyLitho -routingLayersOnly -techFile $vars(lpa_tech_file) -dir $vars(rpt_dir)/LPA\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append commands [FF::wrap_command postroute,verify_litho $command] + } + + ######################################################################### + # Load optional post postRoute file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_postroute_tcl 0] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_postroute_hold {{format 1}} { + + global vars + global env + global errors + + if {([lsearch $vars(fix_hold) postroute] < 0) || $vars(postroute_setup_hold)} { + return "" + } + + ######################################################################### + # Initialize step ... + ######################################################################### + + set vars(step) postroute_hold + set commands "" +# append commands "set vars(step) $vars(step)\n" + + set command [FF_EDI::initialize_step postroute_hold] + append commands [FF_EDI::insert_comments] + append commands [FF::wrap_command postroute_hold,initialize_step $command] + + append commands "Puts \" RUNNING POST-ROUTE HOLD FIXING ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST-ROUTE HOLD FIXING\n" + append commands "#\n" + } + + ######################################################################### + # Load optional pre postRoute hold file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_postroute_hold_tcl] + set command "optDesign -postRoute -hold" + append command " -outDir $vars(rpt_dir) -prefix postroute_hold\n" + append commands [FF::wrap_command postroute_hold,opt_design $command] + + ######################################################################### + # Trim metal fill if added + ######################################################################### + + if {$vars(metalfill) == "pre_postroute"} { + set command "trimMetalFill\n" + append commands [FF::wrap_command postroute_hold,trim_metalfill $command] + } + + ######################################################################### + # Optionally run LPA + ######################################################################### + + if {$vars(verify_litho)} { + # BCL: Added subst to handle dererencing variables + file mkdir [subst $vars(rpt_dir)]/LPA/DMC + set command "verifyLitho -routingLayersOnly -techFile $vars(lpa_tech_file) -dir $vars(rpt_dir)/LPA\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append commands [FF::wrap_command postroute_hold,verify_litho $command] + } + + ######################################################################### + # Load optional post postRoute hold file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_postroute_hold_tcl 0] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_postroute_si_hold {{format 1}} { + + global vars + global env + global errors + + if {([lsearch $vars(fix_hold) postroute] < 0) || $vars(postroute_setup_hold)} { + return "" + } + + set vars(step) postroute_si_hold + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_EDI::initialize_step postroute_si_hold] + append commands [FF_EDI::insert_comments] + append commands [FF::wrap_command postroute_si_hold,initialize_step $command] + + append commands "Puts \" RUNNING POST-ROUTE SI-AWARE HOLD FIXING ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST-ROUTE SI AWARE HOLD FIXING\n" + append commands "#\n" + } + + ######################################################################### + # Force celtic based SI delay calculation + ######################################################################### + + set command "setDelayCalMode -engine signalStorm -siAware false\n" + append commands [FF::wrap_command postroute_si_hold,set_delay_cal_mode $command] + + ######################################################################### + # Load pre-postRoute SI hold file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_postroute_si_hold_tcl] + + ######################################################################### + # Load optional metalfill plug-in + ######################################################################### + + if {$vars(metalfill) == "pre_postroute_si"} { + set command [FF::source_plug metalfill_tcl] + append commands [FF::wrap_command postroute_si_hold,add_metalfill $command] + } + + ######################################################################### + # Run postroute SI hold fixing + ######################################################################### + + set command "optDesign -postRoute -si -hold" + append command " -outDir $vars(rpt_dir) -prefix postroute_si_hold\n" + append commands [FF::wrap_command postroute_si_hold,opt_design $command] + + ######################################################################### + # Trim metal fill if added + ######################################################################### + + if {($vars(metalfill) == "pre_postroute") || + ($vars(metalfill) == "pre_postroute_si")} { + set command "trimMetalFill\n" + append commands [FF::wrap_command postroute_si_hold,trim_metalfill $command] + } + + ######################################################################### + # Optionally run LPA + ######################################################################### + + if {$vars(verify_litho)} { + # BCL: Added subst to handle dererencing variables + file mkdir [subst $vars(rpt_dir)]/LPA/DMC + set command "verifyLitho -routingLayersOnly -techFile $vars(lpa_tech_file) -dir $vars(rpt_dir)/LPA\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append commands [FF::wrap_command post_postroute_si_hold,verify_litho $command] + } + + ######################################################################### + # Load optional post postRoute SI hold file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_postroute_si_hold_tcl 0] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_postroute_si {{format 1}} { + + global vars + global env + global errors + + set vars(step) postroute_si + set commands "" +# append commands "set vars(step) $vars(step)\n" + + ######################################################################### + # Initialize step ... + ######################################################################### + + set command [FF_EDI::initialize_step postroute_si] + append commands [FF_EDI::insert_comments] + append commands [FF::wrap_command postroute_si,initialize_step $command] + + ######################################################################### + # Force celtic based SI delay calculation + ######################################################################### + + set command "setDelayCalMode -engine signalStorm -siAware false\n" + append commands [FF::wrap_command postroute_si,set_delay_cal_mode $command] + + ######################################################################### + # Load optional metalfill plug-in + ######################################################################### + + if {$vars(metalfill) == "pre_postroute_si"} { + set command [FF::source_plug metalfill_tcl] + append commands [FF::wrap_command postroute_si,add_metalfill $command] + } + + append commands "Puts \" RUNNING POST-ROUTE SI-AWARE OPTIMIZATION ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST-ROUTE SI AWARE OPTIMIZATION\n" + append commands "#\n" + } + + ######################################################################### + # Load optional pre postRoute SI file (plug-in) + ######################################################################### + + append commands [FF::source_plug pre_postroute_si_tcl] + + ######################################################################### + # Run post route setup fixing w/SI + ######################################################################### + + set command "optDesign -postRoute -si" + append command " -outDir $vars(rpt_dir) -prefix postroute_si\n" + append commands [FF::wrap_command postroute_si,opt_design $command] + + ######################################################################### + # Trim metal fill if added + ######################################################################### + + if {($vars(metalfill) == "pre_postroute") || + ($vars(metalfill) == "pre_postroute_si")} { + set command "trimMetalFill\n" + append commands [FF::wrap_command postroute_si_hold,trim_metalfill $command] + } + + ######################################################################### + # Optionally run LPA + ######################################################################### + + if {$vars(verify_litho)} { + # BCL: Added subst to handle dererencing variables + file mkdir [subst $vars(rpt_dir)]/LPA/DMC + set command "verifyLitho -routingLayersOnly -techFile $vars(lpa_tech_file) -dir $vars(rpt_dir)/LPA\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append commands [FF::wrap_command post_postroute_si,verify_litho $command] + } + + ######################################################################### + # Load optional post postRoute SI file (plug-in) + ######################################################################### + + append commands [FF::source_plug post_postroute_si_tcl 0] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_signoff {{format 1}} { + + global vars + global env + global errors + global env + + if {$vars(step) != "assemble"} { + set vars(step) signoff + } + set commands "" + + ############################################################################### + # Optionally verify/fix litho + ############################################################################### + if {$vars(fix_litho)} { + # BCL: Added subst to handle dererencing variables + file mkdir [subst $vars(rpt_dir)]/LPA/DMC + set command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append command "setNanoRouteMode -droutePostRouteLithoRepair true \\\n" + append command " -drouteMinimizeTopologyChange true\n" + append command "globalDetailRoute\n" + append command "writeHif -file $vars(rpt_dir)/LPA/incr_verify.hif\n" + append command "verifyLitho -signOff \\\n" + append command " -dir $vars(dbs_dir)/LPA2 \\\n" + append command " -cpu $vars(local_cpus) \\\n" + append command " -config $vars(lpa_conf_file) \\\n" + append command " -incrCheck $vars(rpt_dir)/LPA/incr_verify.hif\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA2/DMC/merged.hif\n" + + append commands [FF::wrap_command signoff,fix_litho $command] + } + + ############################################################################### + # Load optional metalfill plug-in + ############################################################################### + if {$vars(metalfill) == "pre_signoff"} { + set command [FF::source_plug metalfill_tcl] + append commands [FF::wrap_command signoff,add_metalfill $command] + } + + set command [FF_EDI::initialize_step signoff] + append commands [FF_EDI::insert_comments] +# append commands [FF::wrap_command signoff,initialize_step $command] + append commands $command + + ############################################################################### + # Load optional pre signoff file (plug-in) + ############################################################################### + append commands [FF::source_plug pre_signoff_tcl] + + ############################################################################### + # Run RC Extraction + ############################################################################### + + append commands "Puts \" RUNNING FINAL SIGNOFF ...\"\n" + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING FINAL SIGNOFF\n" + append commands "#\n" + } + + set command "extractRC\n" + append commands [FF::wrap_command signoff,extract_rc $command] + + ############################################################################### + # Dump SPEF for signoff STA + ############################################################################### + + if {$vars(skip_signoff_checks)} { + set command "" + foreach corner $vars(rc_corners) { + append command "rcOut -rc_corner $corner -spef $corner.spef.gz\n" + } + } else { + set command "foreach corner \$vars(active_rc_corners) {\n" + append command " rcOut -rc_corner \$corner -spef \$corner.spef.gz\n" + append command "}\n" + } + append commands [FF::wrap_command signoff,dump_spef $command] + + if {(($vars(step) == "assemble") || ($vars(step) == "signoff"))} { + if {[info exists vars(enable_signoff_eco)] && $vars(enable_signoff_eco)} { + set command "signoffTimeDesign -reportOnly -noEcoDb -outDir $vars(rpt_dir)\n" + append commands [FF::wrap_command signoff,signoff_time_design $command] + } else { + if {$vars(enable_si_aware)} { + if {![info exists vars(time_design_options,setup)]} { + set command "timeDesign -prefix signoff -signoff -reportOnly -outDir $vars(rpt_dir)\n" + } else { + set command [format "timeDesign -prefix signoff -signoff -reportOnly -outDir $vars(rpt_dir) %s\n" $vars(time_design_options,setup)] + } + } else { + if {![info exists vars(time_design_options,setup)]} { + set command "timeDesign -prefix signoff -signoff -si -reportOnly -outDir $vars(rpt_dir)\n" + } else { + set command [format "timeDesign -prefix signoff -signoff -si -reportOnly -outDir $vars(rpt_dir) %s\n" $vars(time_design_options,setup)] + } + } + append commands [FF::wrap_command signoff,time_design_setup $command] + if {$vars(enable_si_aware)} { + if {![info exists vars(time_design_options,hold)]} { + set command "timeDesign -prefix signoff -signoff -reportOnly -hold -outDir $vars(rpt_dir)\n" + } else { + set command [format "timeDesign -prefix signoff -signoff -reportOnly -hold -outDir $vars(rpt_dir) %s\n" $vars(time_design_options,hold)] + } + } else { + if {![info exists vars(time_design_options,hold)]} { + set command "timeDesign -prefix signoff -signoff -si -reportOnly -hold -outDir $vars(rpt_dir)\n" + } else { + set command [format "timeDesign -prefix signoff -signoff -si -reportOnly -hold -outDir $vars(rpt_dir) %s\n" $vars(time_design_options,hold)] + } + } + append commands [FF::wrap_command signoff,time_design_hold $command] + } + } + + ############################################################################### + # Dump GDS and/or OA data base + ############################################################################### + if {[info exists vars(gds_layer_map)]} { + set command "streamOut $vars(design).gds.gz -mapFile $vars(gds_layer_map) " + if {[info exists vars(gds_files)]} { + append command "-merge { " + foreach file $vars(gds_files) { + if {[file exists $file]} { + append command "$file " + } else { + puts " WARNING: GDS FILE $file DOES NOT EXIST .... SKIPPING\n" + } + } + append command "}" + } + append command "\n" + append commands [FF::wrap_command signoff,stream_out $command] + } + if {[info exists vars(oasis_layer_map)]} { + set command "oasisOut $vars(design).oasis.gz -mapFile $vars(oasis_layer_map) " + if {[info exists vars(oasis_files)]} { + append command "-merge { " + foreach file $vars(oasis_files) { + if {[file exists $file]} { + append command "$file " + } else { + puts " WARNING: OASIS FILE $file DOES NOT EXIST .... SKIPPING\n" + } + } + append command "}" + } + append command "\n" + append commands [FF::wrap_command signoff,oasis_out $command] + } + +# if {([info exists vars(oa_ref_lib)] && ($vars(oa_ref_lib) != "")) && +# ([info exists vars(oa_design_lib)] && ($vars(oa_design_lib) != ""))} { +# set command "saveOaDesign $vars(oa_design_lib) $vars(design) signoff\n" +# append commands [FF::wrap_command signoff,save_oa_design $command] +# } + + ############################################################################### + # Dump Model for Top Level (Hierarchical Flow Only) + ############################################################################### + set ptn [file tail [pwd]] + if {[info exists vars(partition_list)]} { + if {([lsearch $vars(partition_list) $ptn] != -1)} { + if {[string compare -nocase $vars(dbs_format) "fe"]==0} { + set command "createInterfaceLogic -dir $ptn.ilm\n" + } else { + if {[lindex [split $vars(version) "."] 0] > 10} { + set command "createInterfaceLogic -cellview {$vars(oa_partition_lib) $ptn abstract}\n" + } else { + set command "createInterfaceLogic -dir $ptn.ilm\n" + } + } + append commands [FF::wrap_command signoff,create_ilm $command] + } elseif {$vars(step) != "assemble"} { + append commands [FF::wrap_command signoff,unflattenIlm "unflattenIlm\n"] + } + } + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING VERIFY COMMANDS\n" + append commands "#\n" + } + + ############################################################################### + # Run verify commands + ############################################################################### + if {!([info exists vars(enable_signoff_eco)] && $vars(enable_signoff_eco))} { + set command "summaryReport -outDir $vars(rpt_dir)\n" + append commands [FF::wrap_command signoff,summary_report $command] + } + set command "verifyConnectivity -noAntenna\n" + append commands [FF::wrap_command signoff,verify_connectivity $command] + set command "[verify_geometry_command]\n" + append commands [FF::wrap_command signoff,verify_geometry $command] + set command "verifyMetalDensity\n" + append commands [FF::wrap_command signoff,verify_metal_density $command] + if {[info exists vars(partition_list)] && ([lsearch $vars(partition_list) $ptn] != -1)} { + if {[string compare $vars(dbs_format) "fe"]==0} { + set command "verifyProcessAntenna -leffile $ptn.antenna.lef\n" + } else { + set command "verifyProcessAntenna\n" + # Not sure yet how save_abstract would be called- skip this for now. + } + } else { + set command "verifyProcessAntenna\n" + } + append commands [FF::wrap_command signoff,verify_process_antenna $command] + + if {([info exists vars(enable_lvs)] && $vars(enable_lvs)) && ($vars(dbs_format) == "oa")} { + append commands [FF_EDI::create_lvs_data] + } + + ############################################################################### + # Load optional post signoff file (plug-in) + ############################################################################### + append commands [FF::source_plug post_signoff_tcl 0] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + + } + + proc run_assemble {{format 1}} { + + global vars + global errors + global env + + set vars(step) assemble + set commands "" + append commands "set vars(step) $vars(step)\n" + + FF_EDI::initialize_step assemble + +# if {$vars(report_run_time)} { +# append commands "set vars($vars(step),start_time) \[clock seconds\]\n" +# } + + if {$vars(verbose)} { + append commands "#\n" + append commands "# ASSEMBLING DESIGN\n" + append commands "#\n" + } + ############################################################################### + # Load "pre assemble" plug-in script + ############################################################################### + append commands [FF::source_plug pre_assemble_tcl] + + ############################################################################### + # Assemble the design + ############################################################################### + set vars(ilm) false + set ilm_list [list] + set pac_list [list] + if {$vars(enable_pac)} { + foreach part $vars(partition_list) { + if {[info exists vars($part,pac_mode)]} { + if {$vars($part,pac_mode) == "ilm"} { + lappend ilm_list $part + } else { + lappend pac_list $part + } + } + } + } + if {[info exists vars(ilm_list)] && ($vars(ilm_list) != "")} { + foreach ilm $vars(ilm_list) { + if {([lsearch $ilm_list $ilm] == -1) && ([lsearch $pac_list $ilm] == -1)} { + lappend ilm_list $ilm + } + } + } + if {$ilm_list != ""} { + set vars(ilm) true + } + + # BCL: Added tail of subst of vars(dbs_dir) + # Note - EDIFF Hierarchical flow is currently INCOMPATIBLE with FF dir structure + # The following code appears to rely on vars(dbs_dir) always being under $vars(partition_dir)/$vars(design) + # This needs to be reconciled + + if {$vars(hier_flow_type) == "2pass"} { + set partition_dir $vars(partition_dir_pass2) + } else { + set partition_dir $vars(partition_dir) + } + set dir [file tail [subst $vars(dbs_dir)]] + + if {[lindex [split $vars(version) "."] 0] > 10} { + set command [FF_EDI::initialize_timing mmmc] + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set mmmc_file $vars(script_dir)/incr_view_definition.tcl + } else { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file $vars(view_definition_tcl) + } else { + set mmmc_file $vars(script_dir)/view_definition.tcl + } + } + } + if {([string compare -nocase $vars(dbs_format) "oa"]==0) && ([lindex [split $vars(version) "."] 0] > 10)} { + + if {[info exists vars($vars(design),assemble_step)]} { + set command "assembleDesign -topDesign {$vars(oa_partition_lib) $vars(design) $vars($vars(design),assemble_step)} -mmmcFile $mmmc_file" + } else { + set command "assembleDesign -topDesign {$vars(oa_partition_lib) $vars(design) signoff} -mmmcFile $mmmc_file" + } + foreach part $vars(partition_list) { + if {[lsearch $ilm_list $part] == -1} { + if {[info exists vars($part,assemble_step)]} { + append command "\\\n -block {$vars(oa_partition_lib) $part $vars($vars($part),assemble_step)}" + } else { + append command "\\\n -block {$vars(oa_partition_lib) $part signoff}" + } + } + } + } else { +# append commands [FF::wrap_command assemble,initialize_timing $command] + if {[lindex [split $vars(version) "."] 0] > 10} { + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set assemble_command "assembleDesign -cpfFile $vars(cpf_file)" + } else { + set assemble_command "assembleDesign -mmmcFile $mmmc_file" + } + } else { + set assemble_command "assembleDesign" + } + if {[info exists vars($vars(design),assemble_dbs)]} { + set command "$assemble_command -fe -topDir $vars($vars(design),assemble_dbs)" + } elseif {[info exists vars($vars(design),assemble_step)]} { + set command "$assemble_command -fe $partition_dir/$vars(design)/$dir/$vars($vars(design),assemble_step).enc.dat" + } else { + set command "$assemble_command -fe -topDir $partition_dir/$vars(design)/$dir/signoff.enc.dat " + } + foreach part $vars(partition_list) { + if {[lsearch $ilm_list $part] == -1} { + if {[info exists vars($part,assemble_dbs)]} { + append command "\\\n -blockDir $vars($part,assemble_dbs)" + } elseif {[info exists vars($part,assemble_step)]} { + append command "\\\n -blockDir $partition_dir/$part/$dir/$vars($part,assemble_step).enc.dat" + } else { + append command "\\\n -blockDir $partition_dir/$part/$dir/signoff.enc.dat" + } + } + } + } + if {$vars(enable_pac)} { + append command "\\\n -hierDir $vars(pac_scratch_dir)" + } + append command "\n\n" + + append commands [FF::wrap_command assemble,assemble_design $command] + + if {([lindex [split $vars(version) "."] 0] > 10) && $vars(cpf_timing)} { + append commands "source $mmmc_file\n" + } + if {$vars(flow) == "mmmc"} { + set command [FF_EDI::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } + if {$vars(capture_metrics)} { + if {[lindex [split $vars(version) "."] 0] > 13} { + append commands "um::enable_metrics -on\n" + append commands "um::push_snapshot_stack\n" + } + } + + append commands [FF::source_plug always_source_tcl] + + ############################################################################### + # Load "post assemble" plug-in script + ############################################################################### + append commands [FF::source_plug post_assemble_tcl 0] + + ############################################################################### + # Specify ILMs if defined + ############################################################################### + if {$vars(ilm)} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# SPECIFYING ILMs\n" + append commands "#\n" + } + set command "" + foreach cell $ilm_list { + if {[info exists vars($cell,ilm_dir)] && [file isdirectory $vars($cell,ilm_dir)]} { + append command "specifyIlm -cell $cell -dir $vars($cell,ilm_dir)\n" + } else { + puts " WARNING: ILM DIRECTORY MISSING FOR $cell ... SKIPPING" + } + } + + append commands [FF::wrap_command assemble,specify_ilm $command] + + if {[info exists vars(ilm_non_sdc_file)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" + } else { + set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" + } + append commands [FF::wrap_command assemble,load_ilm_non_sdc_file $command] + } + } + + if {[lindex [split $vars(version) "."] 0] < 14} { + append commands [FF_EDI::load_power_intent] + } else { + append commands [FF_NOVUS::load_power_intent] + } + + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command [FF_EDI::initialize_timing mmmc] + append commands [FF::wrap_command assemble,initialize_timing $command] + } elseif {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set command [FF_EDI::initialize_timing mmmc] + append commands [FF::wrap_command assemble,initialize_timing $command] + } + + set command [FF_EDI::update_timing mmmc 1 ] + append commands [FF::wrap_command assemble,update_timing $command] + + if {[info exists vars(enable_signoff_eco)] && $vars(enable_signoff_eco)} { + append commands [FF::source_plug pre_signoff_eco_tcl 0] + set command "verifyConnectivity\n" + append commands [FF::wrap_command assemble,pre_signoff_eco_verify_connectivity $command] + set command "[verify_geometry_command]\n" + append commands [FF::wrap_command assemble,pre_signoff_eco_verify_geometry $command] + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING SIGN-OFF ECO\n" + append commands "#\n" + } + + set command [FF_EDI::delete_filler_cells] + append commands [FF::wrap_command assemble,delete_filler_cells $command] + set command "extractRC\n" + append commands [FF::wrap_command assemble,extract_rc $command] + set op [open ptn.txt w] +# dbForEachHeadPtn [dbgHead] ptr { +# set ptn [dbPtnName $ptr] +# puts $op "$ptn" +# } + foreach ptn $vars(partition_list) { + puts $op "$ptn" + } + close $op + set command "setSignoffOptMode -partitionListFile \"ptn.txt\" -optimizeReplicatedModules true\n" + append commands [FF::wrap_command assemble,signoff_time_design $command] + set command "signoffTimeDesign -reportOnly\n" + append commands [FF::wrap_command assemble,signoff_time_design $command] + set command "signoffOptDesign -setup -noEcoRoute\n" + append commands [FF::wrap_command assemble,signoff_opt_design $command] +# set command "addFiller\n" +# append commands [FF::wrap_command assemble,add_filler_cells $command] + set command "ecoRoute -handlePartition\n" + #set command "ecoRoute\n" + append commands [FF::wrap_command assemble,eco_route $command] + + ######################################################################### + # Optionally run LPA + ######################################################################### + + if {$vars(verify_litho)} { + # BCL: Added subst to handle dererencing variables + file mkdir [subst $vars(rpt_dir)]/LPA/DMC + set command "verifyLitho -routingLayersOnly -techFile $vars(lpa_tech_file) -dir $vars(rpt_dir)/LPA\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append commands [FF::wrap_command assemble,verify_litho $command] + } + + append commands [FF::source_plug post_signoff_eco_tcl 0] + set command "verifyConnectivity\n" + append commands [FF::wrap_command assemble,post_signoff_eco_verify_connectivity $command] + set command "[verify_geometry_command]\n" + append commands [FF::wrap_command assemble,post_signoff_eco_verify_geometry $command] + } elseif {$vars(enable_pac)} { + set command "verifyConnectivity\n" + append commands [FF::wrap_command assemble,pre_pac_verify_connectivity $command] + set command "[verify_geometry_command]\n" + append commands [FF::wrap_command assemble,pre_pac_verify_geometry $command] + + if {$vars(verbose)} { + append commands "#\n" + append commands "# DEFINING PAC MODES\n" + append commands "#\n" + } + append commands [FF::source_plug pre_pac_tcl 0] + set command "" + foreach part $pac_list { + append command "set hinst \[dbHInstName \[dbCellHInst \[dbGetCellByName $part\]\]\]\n" + if {[info exists vars($part,pac_mode)]} { + if {$vars($part,pac_mode) == "read_only"} { set vars($part,pac_mode) "readOnly" } + append command "setModuleView -hinst \$hinst -type $vars($part,pac_mode)\n" + } + } + + append command "getModuleView\n" + append commands [FF::wrap_command assemble,set_module_view $command] + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST ASSEMBLY CLOSURE\n" + append commands "#\n" + } + set command [FF_EDI::delete_filler_cells] + append commands [FF::wrap_command assemble,delete_filler_cells $command] + set command "optDesign -postRoute -outDir $vars(rpt_dir) -prefix pac\n" + append commands [FF::wrap_command assemble,opt_design $command] + set command [FF_EDI::add_filler_cells] + append commands [FF::wrap_command assemble,add_filler_cells $command] + + ######################################################################### + # Optionally run LPA + ######################################################################### + + if {$vars(verify_litho)} { + # BCL: Added subst to handle dererencing variables + file mkdir [subst $vars(rpt_dir)]/LPA/DMC + set command "verifyLitho -routingLayersOnly -techFile $vars(lpa_tech_file) -dir $vars(rpt_dir)/LPA\n" + append command "violationBrowser -all -no_display_false\n" + append command "loadViolationReport -type CDNLitho -filename $vars(rpt_dir)/LPA/DMC/merged.hif\n" + append commands [FF::wrap_command assemble,verify_litho $command] + } + + append commands [FF::source_plug post_pac_tcl 0] + set command "verifyConnectivity\n" + append commands [FF::wrap_command assemble,post_pac_verify_connectivity $command] + set command "[verify_geometry_command]\n" + append commands [FF::wrap_command assemble,post_pac_verify_geometry $command] + } + + if {!$vars(codegen)} { + uplevel #0 eval $commands + set commands "" + } + + append commands [FF_EDI::run_signoff $format] + +# if {$vars(makefile)} { +# append commands "if {\[info exists env(VPATH)\]} {\n" +# append commands "exec /bin/touch \$env(VPATH)/assemble\n" +# append commands "}\n" +# } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_rebudget {{format 1}} { + + global vars + global errors + global env + + set vars(step) rebudget + set commands "" +# append commands "set vars(step) $vars(step)\n" + + FF_EDI::initialize_step $vars(step) + +# if {$vars(report_run_time)} { +# append commands "set vars($vars(step),start_time) \[clock seconds\]\n" +# } + if {!$vars(enable_flexilm)} { + append commands "\nif {\[file isfile $vars(pac_scratch_dir)/.pacFlowLock\]} {\n" + append commands " file delete $vars(pac_scratch_dir)/.pacFlowLock\n" + append commands "}\n" + } else { +# append commands "if {\[file isfile $vars(script_dir)/view_definition.tcl]} {\n" +# append commands " file copy -force $vars(script_dir)/view_definition.tcl $vars(partition_dir)/$vars(design)/viewDefinition.tcl\n" +# append commands "}\n" + } + + if {$vars(verbose)} { + append commands "#\n" + append commands "# ASSEMBLING DESIGN\n" + append commands "#\n" + } + ############################################################################### + # Load "pre rebudget" plug-in script + ############################################################################### + append commands [FF::source_plug pre_rebudget_tcl] + + ############################################################################### + # Get the FlexILM ECO paths + ############################################################################### + if {$vars(enable_flexilm)} { + append commands "if {\[file isfile \$env(VPATH)/flexilm\]} {\n" + append commands " source \$env(VPATH)/flexilm\n" + append commands "}\n" + } + + ############################################################################### + # Assemble the design + ############################################################################### + set vars(ilm) false + set ilm_list [list] + set pac_list [list] + if {$vars(enable_pac)} { + foreach part $vars(partition_list) { + if {[info exists vars($part,pac_mode)]} { + if {$vars($part,pac_mode) == "ilm"} { + lappend ilm_list $part + } else { + lappend pac_list $part + } + } + } + } + if {[info exists vars(ilm_list)] && ($vars(ilm_list) != "")} { + foreach ilm $vars(ilm_list) { + if {([lsearch $ilm_list $ilm] == -1) && ([lsearch $pac_list $ilm] == -1)} { + lappend ilm_list $ilm + } + } + } + if {$ilm_list != ""} { + set vars(ilm) true + } + + # BCL: Added tail of subst of vars(dbs_dir) + # Note - EDIFF Hierarchical flow is currently INCOMPATIBLE with FF dir structure + # The following code appears to rely on vars(dbs_dir) always being under $vars(partition_dir)/$vars(design) + # This needs to be reconciled + set dir [file tail [subst $vars(dbs_dir)]] + + if {[lindex [split $vars(version) "."] 0] > 10} { + set command [FF_EDI::initialize_timing mmmc] + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set mmmc_file $vars(script_dir)/incr_view_definition.tcl + } else { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file $vars(view_definition_tcl) + } else { + set mmmc_file $vars(script_dir)/view_definition.tcl + } + } + } + if {([string compare -nocase $vars(dbs_format) "oa"]==0) && ([lindex [split $vars(version) "."] 0] > 10)} { + + if {[info exists vars($vars(design),rebudget_assemble_step)]} { + set command "assembleDesign -topDesign {$vars(oa_partition_lib) $vars(design) $vars($vars(design),rebudget_assemble_step)} -mmmcFile $mmmc_file" + } else { + set command "assembleDesign -topDesign {$vars(oa_partition_lib) $vars(design) cts} -mmmcFile $mmmc_file" + } + foreach part $vars(partition_list) { + if {[lsearch $ilm_list $part] == -1} { + if {[info exists vars($part,rebudget_assemble_step)]} { + append command "\\\n -block {$vars(oa_partition_lib) $part $vars($vars($part),rebudget_assemble_step)}" + } else { + append command "\\\n -block {$vars(oa_partition_lib) $part cts}" + } + } + } + } else { +# append commands [FF::wrap_command rebudget,initialize_timing $command] + if {[lindex [split $vars(version) "."] 0] > 10} { + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set assemble_command "assembleDesign -cpfFile $vars(cpf_file)" + } else { + set assemble_command "assembleDesign -mmmcFile $mmmc_file" + } + } else { + set assemble_command "assembleDesign" + } + if {[info exists vars($vars(design),rebudget_assemble_dbs)]} { + set command "$assemble_command -fe -topDir $vars($vars(design),rebudget_assemble_dbs)" + } elseif {[info exists vars($vars(design),rebudget_assemble_step)]} { + set command "$assemble_command -fe $vars(partition_dir)/$vars(design)/$dir/$vars($vars(design),rebudget_assemble_step).enc.dat" + } else { + if {$vars(enable_flexilm)} { +# set command "$assemble_command \\\n -fe \\\n -topDir $vars(partition_dir_pass2)/$vars(design) " + set command "$assemble_command \\\n -fe \\\n -topDir $vars(partition_dir)_FLEXILM/$vars(design) " + } else { + set command "$assemble_command -fe -topDir $vars(partition_dir)/$vars(design)/$dir/cts.enc.dat " + } + } + foreach part $vars(partition_list) { + if {[lsearch $ilm_list $part] == -1} { + if {[info exists vars($part,rebudget_assemble_dbs)]} { + append command "\\\n -blockDir $vars($part,rebudget_assemble_dbs)" + } elseif {[info exists vars($part,rebudget_assemble_step)]} { + append command "\\\n -blockDir $vars(partition_dir)/$part/$dir/$vars($part,rebudget_assemble_step).enc.dat" + } else { + if {$vars(enable_flexilm)} { + append command "\\\n -blockDir \$vars($part,cdtv) " + } else { + append command "\\\n -blockDir $vars(partition_dir)/$part/$dir/cts.enc.dat" + } + } + } + } + } + if {$vars(enable_pac)} { + append command "\\\n -hierDir $vars(pac_scratch_dir)" + } + append command "\n" + + append commands [FF::wrap_command $vars(step),assemble_design $command] + if {([lindex [split $vars(version) "."] 0] > 10) && $vars(cpf_timing)} { + append commands "source $mmmc_file\n" + } + if {$vars(flow) == "mmmc"} { + set command [FF_EDI::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } + + append commands [FF::source_plug always_source_tcl] + + ############################################################################### + # Load "post rebudget" plug-in script + ############################################################################### + append commands [FF::source_plug post_rebudget_tcl 0] + + ############################################################################### + # Specify ILMs if defined + ############################################################################### + if {$vars(ilm)} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# SPECIFYING ILMs\n" + append commands "#\n" + } + set command "" + foreach cell $ilm_list { + if {[info exists vars($cell,ilm_dir)] && [file isdirectory $vars($cell,ilm_dir)]} { + append command "specifyIlm -cell $cell -dir $vars($cell,ilm_dir)\n" + } else { + puts " WARNING: ILM DIRECTORY MISSING FOR $cell ... SKIPPING" + } + } + + append commands [FF::wrap_command $vars(step),specify_ilm $command] + + if {[info exists vars(ilm_non_sdc_file)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" + } else { + set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" + } + append commands [FF::wrap_command $vars(step),load_ilm_non_sdc_file $command] + } + } + + if {[lindex [split $vars(version) "."] 0] < 14} { + append commands [FF_EDI::load_power_intent] + } else { + append commands [FF_NOVUS::load_power_intent] + } + + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command [FF_EDI::initialize_timing mmmc] + append commands [FF::wrap_command $vars(step),initialize_timing $command] + } elseif {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set command [FF_EDI::initialize_timing mmmc] + append commands [FF::wrap_command $vars(step),initialize_timing $command] + } + + if {!$vars(enable_flexilm)} { + set command [FF_EDI::update_timing mmmc ] + append commands [FF::wrap_command $vars(step),update_timing $command] + } + + if {$vars(enable_pac)} { + + if {$vars(verbose)} { + append commands "#\n" + append commands "# DEFINING PAC MODES\n" + append commands "#\n" + } + append commands [FF::source_plug pre_pac_tcl 0] + set command "" + foreach part $pac_list { + append command "set hinst \[dbHInstName \[dbCellHInst \[dbGetCellByName $part\]\]\]\n" + if {[info exists vars($part,pac_mode)]} { + if {$vars($part,pac_mode) == "read_only"} { set vars($part,pac_mode) "readOnly" } + append command "setModuleView -hinst \$hinst -type $vars($part,pac_mode)\n" + } + } + + append command "getModuleView\n" + append commands [FF::wrap_command $vars(step),set_module_view $command] + + if {!$vars(enable_flexilm)} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING POST ASSEMBLY CLOSURE\n" + append commands "#\n" + } + set command "optDesign -postCTS -outDir $vars(rpt_dir) -prefix pac\n" + append commands [FF::wrap_command $vars(step),opt_design $command] + + append commands [FF::source_plug post_pac_tcl 0] + } + } + + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "setTrialRouteMode -handlePartitionComplex true -honorPin true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode1 $command] + set command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route1 $command] + } else { + set command "setRouteMode -earlyGlobalRoutePartitionHonorFence . -earlyGlobalRoutePartitionHonorPin .\n" + append commands [FF::wrap_command $vars(step),set_route_mode1 $command] + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route1 $command] + } + + append command "deriveTimingBudget -noTrialIPO -noConstantModel\n" + append commands [FF::wrap_command $vars(step),derive_timing_budget $command] + + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + set command "saveDesign -cellview {$vars(oa_design_lib) $vars(design) budget}\n" + } else { + set command "saveOaDesign $vars(oa_design_lib) $vars(design) budget\n" + } + } else { + set command "saveDesign $vars(dbs_dir)/budget.enc -compress\n" + } + append commands [FF::wrap_command $vars(step),save_design,budget $command] + + ############################################################################### + # Partition and save the partitions into the + # directory PARTITION + ############################################################################### +# append commands [FF::source_plug pre_partition_tcl] + +# set command "set ptngPtnTimingLibFormat lib\npartition -buildScan\n" + set command "partition -buildScan\n" + append commands [FF::wrap_command $vars(step),partition $command] + if {[lindex [split $vars(version) "."] 0] > 10} { + if {([string compare $vars(dbs_format) "oa"]==0)} { + if {$vars(hier_flow_type) == "1pass"} { + set command "savePartition -ptnLib $vars(oa_partition_lib) -dir $vars(partition_dir)\n" + } else { + set command "savePartition -ptnLib $vars(oa_partition_lib) -dir $vars(partition_dir_pass2)\n" + } + } else { + if {$vars(hier_flow_type) == "1pass"} { + set command "savePartition -dir $vars(partition_dir) -def -scanDef\n" + } else { + set command "savePartition -dir $vars(partition_dir_pass2) -def -scanDef\n" + } + } + } else { + set command "savePartition -dir $vars(partition_dir) -def -scanDef\n" + } + append commands [FF::wrap_command $vars(step),save_partition $command] +# append commands [FF::source_plug post_partition_tcl] + + if {$vars(use_flexmodels) && $vars(flexmodel_as_ptn)} { +# set command "replace_proto_model \\\n" +# append command " -pre_ft_dir $vars(eco_dir)/pre_ft \\\n" +# append command " -post_ft_dir $vars(eco_dir)/post_ft \\\n" +# append command " -ptn_dir $vars(partition_dir) \\\n" +# append command " -ptn_full_netlist_dir ./temp_netlist_dir \\\n" +# append command " -out_dir $vars(partition_dir)\n" + + set command "replace_proto_model \\\n" + append command " -ptn_dir $vars(partition_dir) \\\n" + append command " -out_dir $vars(partition_dir)\n" + + append commands [FF::wrap_command $vars(step),replace_proto_model $command] + } + + append commands "#---------------------------------------------------------------------\n" + append commands "# GENERATING REPORTS\n" + append commands "#---------------------------------------------------------------------\n" + + if {$vars(report_power)} { + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + set command "report_power -view $vars(power_analysis_view) -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } else { + set command "report_power -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } + append commands [FF::wrap_command $vars(step),report_power $command] + } + + if {[FF::is_lp_flow] && [info exists vars(power_domains)] && [llength $vars(power_domains)] > 1} { + + ###################################################################### + # Verify power domain + ###################################################################### + + set command "verifyPowerDomain -bind -gconn" + append command " -isoNetPD $vars(rpt_dir)/$vars(step).isonets.rpt" + append command " -xNetPD $vars(rpt_dir)/$vars(step).xnets.rpt\n" + + append commands [FF::wrap_command $vars(step),verify_power_domain $command] + + ###################################################################### + # Run CLP + ###################################################################### + + if {$vars(run_clp) && ([auto_execok lec] != "")} { + set command "runCLP " + if {[info exists vars(clp_options)]} { + append command $vars(clp_options) + } + append command "\n" + append commands [FF::wrap_command $vars(step),run_clp $command] + } else { + if {![info exists vars(clp_warning)]} { + puts " WARNING: UNABLE TO RUN CLP ... PLEASE MAKE SURE IT IS IN YOUR PATH" + set vars(clp_warning) true + } + } + } + if {!$vars(codegen)} { + uplevel #0 eval $commands + set commands "" + } + +# if {$vars(makefile)} { + append commands "if {\[info exists env(VPATH)\]} {\n" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)\n" + append commands "}\n" +# } + +# if {$vars(enable_flexilm)} { +# append commands "# Copy Makefiles in case they get deleted during the flow ...\n" +# foreach part [concat $vars(design) $vars(partition_list)] { +# append commands "file copy -force $vars(script_dir)/$part.Makefile $vars(partition_dir_pass2)/$part/Makefile\n" +# } +# append commands "file copy -force $vars(partition_dir)/Makefile $vars(partition_dir_pass2)/Makefile\n" +# append commands "file copy -force $vars(partition_dir)/Makefile.partition $vars(partition_dir_pass2)/Makefile.partition\n" +# } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_assemble_flexilm {{format 1}} { + + global vars + global errors + global env + + set vars(step) assemble_flexilm + set commands "" +# append commands "set vars(step) $vars(step)\n" + + FF_EDI::initialize_step $vars(step) + + if {$vars(verbose)} { + append commands "#\n" + append commands "# ASSEMBLING DESIGN\n" + append commands "#\n" + } + ############################################################################### + # Load "pre rebudget" plug-in script + ############################################################################### + append commands [FF::source_plug pre_rebudget_tcl] + + ############################################################################### + # Assemble the design + ############################################################################### + set vars(ilm) false + if {[info exists vars(ilm_list)] && ($vars(ilm_list) != "")} { + set vars(ilm) true + } else { + set vars(ilm_list) "" + } + + # BCL: Added tail of subst of vars(dbs_dir) + # Note - EDIFF Hierarchical flow is currently INCOMPATIBLE with FF dir structure + # The following code appears to rely on vars(dbs_dir) always being under $vars(partition_dir)/$vars(design) + # This needs to be reconciled + set dir [file tail [subst $vars(dbs_dir)]] + + if {[lindex [split $vars(version) "."] 0] > 10} { + set command [FF_EDI::initialize_timing mmmc] + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set mmmc_file $vars(script_dir)/incr_view_definition.tcl + } else { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file $vars(view_definition_tcl) + } else { + set mmmc_file $vars(script_dir)/view_definition.tcl + } + } + } + if {([string compare -nocase $vars(dbs_format) "oa"]==0) && ([lindex [split $vars(version) "."] 0] > 10)} { + + if {[info exists vars($vars(design),rebudget_assemble_step)]} { + set command "assembleDesign -topDesign {$vars(oa_partition_lib) $vars(design) $vars($vars(design),rebudget_assemble_step)} -mmmcFile $mmmc_file" + } else { + set command "assembleDesign -topDesign {$vars(oa_partition_lib) $vars(design) cts} -mmmcFile $mmmc_file" + } + foreach part $vars(partition_list) { + if {[lsearch $ilm_list $part] == -1} { + if {[info exists vars($part,rebudget_assemble_step)]} { + append command "\\\n -block {$vars(oa_partition_lib) $part $vars($vars($part),rebudget_assemble_step)}" + } else { + append command "\\\n -block {$vars(oa_partition_lib) $part cts}" + } + } + } + } else { +# append commands [FF::wrap_command rebudget,initialize_timing $command] + if {[lindex [split $vars(version) "."] 0] > 10} { + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set assemble_command "assembleDesign -cpfFile $vars(cpf_file)" + } else { + set assemble_command "assembleDesign -mmmcFile $mmmc_file" + } + } else { + set assemble_command "assembleDesign" + } + if {[info exists vars($vars(design),rebudget_assemble_dbs)]} { + set command "$assemble_command -defMerge -topDir $vars($vars(design),rebudget_assemble_dbs)" + } elseif {[info exists vars($vars(design),rebudget_assemble_step)]} { + set command "$assemble_command -defMerge $vars(partition_dir)/$vars(design)/$dir/$vars($vars(design),rebudget_assemble_step).enc.dat" + } else { + if {$vars(enable_flexilm)} { +# set command "$assemble_command \\\n -defMerge \\\n -topDir $vars(partition_dir_pass2)/$vars(design) " + set command "$assemble_command \\\n -defMerge \\\n -topDir $vars(partition_dir)_PRECTS/$vars(design) " + } else { + set command "$assemble_command -defMerge -topDir $vars(partition_dir)/$vars(design)/$dir/cts.enc.dat " + } + } + foreach part $vars(partition_list) { + if {[lsearch $vars(ilm_list) $part] == -1} { + if {[info exists vars($part,rebudget_assemble_dbs)]} { + append command "\\\n -blockDir $vars($part,rebudget_assemble_dbs)" + } elseif {[info exists vars($part,rebudget_assemble_step)]} { + append command "\\\n -blockDir $vars(partition_dir)/$part/$dir/$vars($part,rebudget_assemble_step).enc.dat" + } else { + if {$vars(enable_flexilm)} { + append command "\\\n -blockDir $vars(partition_dir)_PRECTS/$part/${part}_postECO.enc.dat" + } else { + append command "\\\n -blockDir $vars(partition_dir)/$part/$dir/cts.enc.dat" + } + } + } + } + } + append command "\n" + append commands [FF::wrap_command $vars(step),assemble_design $command] + + if {$vars(capture_metrics)} { + append commands "um::enable_metrics -on\n" + append commands "um::push_snapshot_stack\n" + } + + append commands [FF::source_plug always_source_tcl] + + set command "" + # Additional timing setup + if {[info exists vars($vars(design),latency_sdc)]} { + append command "foreach mode \[all_constraint_modes -active\] {\n" + append command " set sdc_files \[get_constraint_mode \$mode -sdc_files\]\n" + append command " set sdc_list \[concat \$sdc_files $vars($vars(design),latency_sdc)\]\n" + append command " update_constraint_mode -name \$mode -sdc_files \$sdc_list\n" + append command "}\n" + + append commands [FF::wrap_command $vars(step),update_constraint_mode $command] + } + + foreach view [concat $vars(setup_analysis_views) $vars(hold_analysis_views)] { + foreach ptn $vars(partition_list) { + if {[info exists vars($ptn,$view,latency_sdc)]} { + set latency($view,$ptn) $vars($ptn,$view,latency_sdc) + } elseif {[info exists vars($ptn,latency_sdc)]} { + set latency($view,$ptn) $vars($ptn,latency_sdc) + } else { + set latency($view,$ptn) "none" + } + } + } + + set command "" + foreach view [concat $vars(setup_analysis_views) $vars(hold_analysis_views)] { + foreach ptn $vars(partition_list) { + if {$latency($view,$ptn) != "none"} { + append command " setPtnUserCnsFile -view $view -fileName $latency($view,$ptn) -ptnName $ptn\n" + } + } + } + + if {$command != ""} { + append commands [FF::wrap_command $vars(step),set_ptn_user_cns_file $command] + } + + if {([lindex [split $vars(version) "."] 0] > 10) && $vars(cpf_timing)} { + append commands "source $mmmc_file\n" + } + if {$vars(flow) == "mmmc"} { + set command [FF_EDI::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + } + + ############################################################################### + # Load "post assemble_flexilm" plug-in script + ############################################################################### + append commands [FF::source_plug post_flexilm 0] + + ############################################################################### + # Specify ILMs if defined + ############################################################################### + if {$vars(ilm)} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# SPECIFYING ILMs\n" + append commands "#\n" + } + set command "" + foreach cell $vars(ilm_list) { + if {[info exists vars($cell,ilm_dir)] && [file isdirectory $vars($cell,ilm_dir)]} { + append command "specifyIlm -cell $cell -dir $vars($cell,ilm_dir)\n" + } else { + puts " WARNING: ILM DIRECTORY MISSING FOR $cell ... SKIPPING" + } + } + + append commands [FF::wrap_command $vars(step),specify_ilm $command] + + if {[info exists vars(ilm_non_sdc_file)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" + } else { + set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" + } + append commands [FF::wrap_command $vars(step),load_ilm_non_sdc_file $command] + } + } + + if {[lindex [split $vars(version) "."] 0] < 14} { + append commands [FF_EDI::load_power_intent] + } else { + append commands [FF_NOVUS::load_power_intent] + } + + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command [FF_EDI::initialize_timing mmmc] + append commands [FF::wrap_command $vars(step),initialize_timing $command] + } elseif {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set command [FF_EDI::initialize_timing mmmc] + append commands [FF::wrap_command $vars(step),initialize_timing $command] + } + +# if {!$vars(enable_flexilm)} { +# set command [FF_EDI::update_timing mmmc ] +# append commands [FF::wrap_command $vars(step),update_timing $command] +# } + + set command "" + foreach name $vars(partition_list) { + append command "setPtnPinStatus -cell $name -pin * -status placed\n" + } + append commands [FF::wrap_command $vars(step),set_ptn_pin_status $command] + set command "dbDeleteTrialRoute\n" + append commands [FF::wrap_command $vars(step),delete_trial_route $command] + + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "setTrialRouteMode -handlePartitionComplex true -honorPin false\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + set command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route $command] + } else { + set command "setRouteMode -earlyGlobalRoutePartitionHonorFence . -earlyGlobalRoutePartitionHonorPin {}\n" + append commands [FF::wrap_command $vars(step),set_route_mode $command] + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route $command] + } + + set command "" + append command "createActiveLogicView -type flatTop\n" + append command "timeDesign -preCTS -outDir $vars(rpt_dir) -prefix assemble_prects_flexilm\n" + append command "clearActiveLogicView\n" + append commands [FF::wrap_command $vars(step),create_active_logic_view $command] + + +# append command "deriveTimingBudget -noTrialIPO -noConstantModel\n" +# append commands [FF::wrap_command $vars(step),derive_timing_budget $command] + +# if {[string compare -nocase $vars(dbs_format) "oa"]==0} { +# if {[lindex [split $vars(version) "."] 0] > 10} { +# set command "saveDesign -cellview {$vars(oa_design_lib) $vars(design) budget}\n" +# } else { +# set command "saveOaDesign $vars(oa_design_lib) $vars(design) budget\n" +# } +# } else { +# set command "saveDesign $vars(dbs_dir)/budget.enc -compress\n" +# } +# append commands [FF::wrap_command $vars(step),save_design,budget $command] + + ############################################################################### + # Partition and save the partitions into the + # directory PARTITION + ############################################################################### +# append commands [FF::source_plug pre_partition_tcl] + +# set command "set ptngPtnTimingLibFormat lib\npartition -buildScan\n" +# set command "partition -buildScan\n" +# append commands [FF::wrap_command $vars(step),partition $command] +# if {[lindex [split $vars(version) "."] 0] > 10} { +# if {([string compare $vars(dbs_format) "oa"]==0)} { +# if {$vars(hier_flow_type) == "1pass"} { +# set command "savePartition -ptnLib $vars(oa_partition_lib) -dir $vars(partition_dir)\n" +# } else { +# set command "savePartition -ptnLib $vars(oa_partition_lib) -dir $vars(partition_dir_pass2)\n" +# } +# } else { +# if {$vars(hier_flow_type) == "1pass"} { +# set command "savePartition -dir $vars(partition_dir) -def -scanDef\n" +# } else { +# set command "savePartition -dir $vars(partition_dir_pass2) -def -scanDef\n" +# } +# } +# } else { +# set command "savePartition -dir $vars(partition_dir) -def -scanDef\n" +# } +# append commands [FF::wrap_command $vars(step),save_partition $command] +# append commands [FF::source_plug post_partition_tcl] + + append commands "#---------------------------------------------------------------------\n" + append commands "# GENERATING REPORTS\n" + append commands "#---------------------------------------------------------------------\n" + + if {$vars(report_power)} { + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + set command "report_power -view $vars(power_analysis_view) -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } else { + set command "report_power -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } + append commands [FF::wrap_command $vars(step),report_power $command] + } + + if {[FF::is_lp_flow] && [info exists vars(power_domains)] && [llength $vars(power_domains)] > 1} { + + ###################################################################### + # Verify power domain + ###################################################################### + + set command "verifyPowerDomain -bind -gconn" + append command " -isoNetPD $vars(rpt_dir)/$vars(step).isonets.rpt" + append command " -xNetPD $vars(rpt_dir)/$vars(step).xnets.rpt\n" + + append commands [FF::wrap_command $vars(step),verify_power_domain $command] + + ###################################################################### + # Run CLP + ###################################################################### + + if {$vars(run_clp) && ([auto_execok lec] != "")} { + set command "runCLP " + if {[info exists vars(clp_options)]} { + append command $vars(clp_options) + } + append command "\n" + append commands [FF::wrap_command $vars(step),run_clp $command] + } else { + if {![info exists vars(clp_warning)]} { + puts " WARNING: UNABLE TO RUN CLP ... PLEASE MAKE SURE IT IS IN YOUR PATH" + set vars(clp_warning) true + } + } + } + if {!$vars(codegen)} { + uplevel #0 eval $commands + set commands "" + } + +# if {$vars(makefile)} { + append commands "if {\[info exists env(VPATH)\]} {\n" + append commands "exec /bin/touch \$env(VPATH)/$vars(step)\n" + append commands "}\n" +# } + +# if {$vars(enable_flexilm)} { +# append commands "# Copy Makefiles in case they get deleted during the flow ...\n" +# foreach part [concat $vars(design) $vars(partition_list)] { +# append commands "file copy -force $vars(script_dir)/$part.Makefile $vars(partition_dir_pass2)/$part/Makefile\n" +# } +# append commands "file copy -force $vars(partition_dir)/Makefile $vars(partition_dir_pass2)/Makefile\n" +# append commands "file copy -force $vars(partition_dir)/Makefile.partition $vars(partition_dir_pass2)/Makefile.partition\n" +# } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_flexilm {{format 1}} { + + global vars + global errors + global env + + set vars(step) flexilm + set commands "" +# append commands "set vars(step) $vars(step)\n" + + FF_EDI::initialize_step flexilm + +# if {$vars(report_run_time)} { +# append commands "set vars($vars(step),start_time) \[clock seconds\]\n" +# } + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RESTORING DESIGN\n" + append commands "#\n" + } + ############################################################################### + # Load "pre flexilm" plug-in script + ############################################################################### + append commands [FF::source_plug pre_flexilm_tcl] + + ############################################################################### + # Restore the design + ############################################################################### + set vars(ilm) false + set ilm_list [list] + set pac_list [list] + if {$vars(enable_pac)} { + foreach part $vars(partition_list) { + if {[info exists vars($part,pac_mode)]} { + if {$vars($part,pac_mode) == "ilm"} { + lappend ilm_list $part + } else { + lappend pac_list $part + } + } + } + } + if {[info exists vars(ilm_list)] && ($vars(ilm_list) != "")} { + foreach ilm $vars(ilm_list) { + if {([lsearch $ilm_list $ilm] == -1) && ([lsearch $pac_list $ilm] == -1)} { + lappend ilm_list $ilm + } + } + } + if {$ilm_list != ""} { + set vars(ilm) true + } + + # BCL: Added tail of subst of vars(dbs_dir) + # Note - EDIFF Hierarchical flow is currently INCOMPATIBLE with FF dir structure + # The following code appears to rely on vars(dbs_dir) always being under $vars(partition_dir)/$vars(design) + # This needs to be reconciled + set dir [file tail [subst $vars(dbs_dir)]] + + if {[lindex [split $vars(version) "."] 0] > 10} { + set command [FF_EDI::initialize_timing mmmc] + if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set mmmc_file $vars(script_dir)/incr_view_definition.tcl + } else { + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file $vars(view_definition_tcl) + } else { + set mmmc_file $vars(script_dir)/view_definition.tcl + } + } + } + +# append commands "setLimitedAccessFeature encFlexILM 1\n" + + append commands "file copy -force $vars(script_dir)/view_definition.tcl $vars(partition_dir)/$vars(design)/$vars(dbs_dir)/prects.enc.dat/viewDefinition.tcl\n" + + set cwd [exec pwd] + append commands "cd $vars(partition_dir)/$vars(design)\n" + +# set command "restoreDesign . $vars(design)\n" + set command "restoreDesign $vars(dbs_dir)/prects.enc.dat $vars(design)\n" + append commands [FF::wrap_command flexilm,restore_design $command] + +# if {([lindex [split $vars(version) "."] 0] > 10) && $vars(cpf_timing)} { +# append commands "source $mmmc_file\n" +# } + append commands [FF::source_plug always_source_tcl] + + ############################################################################### + # Load "post flexilm" plug-in script + ############################################################################### + append commands [FF::source_plug post_flexilm 0] + + ############################################################################### + # Specify ILMs if defined + ############################################################################### + if {$vars(ilm)} { + if {$vars(verbose)} { + append commands "#\n" + append commands "# SPECIFYING ILMs\n" + append commands "#\n" + } + set command "" + foreach cell $ilm_list { + if {[info exists vars($cell,ilm_dir)] && [file isdirectory $vars($cell,ilm_dir)]} { + append command "specifyIlm -cell $cell -dir $vars($cell,ilm_dir)\n" + } else { + puts " WARNING: ILM DIRECTORY MISSING FOR $cell ... SKIPPING" + } + } + + append commands [FF::wrap_command $vars(step),specify_ilm $command] + + if {[info exists vars(ilm_non_sdc_file)]} { + if {[lindex [split $vars(version) "."] 0] <= 10} { + set command "loadTimingCon -ilmNonSdcFile $vars(ilm_non_sdc_file)\n" + } else { + set command "setIlmNonSdcConstraintFile $vars(ilm_non_sdc_file)\n" + } + append commands [FF::wrap_command $vars(step),load_ilm_non_sdc_file $command] + } + } + + if {[lindex [split $vars(version) "."] 0] < 14} { + append commands [FF_EDI::load_power_intent] + } else { + append commands [FF_NOVUS::load_power_intent] + } + +# if {[info exists vars(cpf_file)] && $vars(cpf_timing)} { + set command [FF_EDI::initialize_timing mmmc] + append commands [FF::wrap_command $vars(step),initialize_timing $command] +# } + +# set command [FF_EDI::update_timing mmmc ] +# append commands [FF::wrap_command $vars(step),update_timing $command] + + foreach mode [concat $vars(active_setup_views) $vars(active_hold_views)] { +# exec /bin/touch empty.sdc +# set command "update_constraint_mode -name $mode -sdc_files empty.sdc -ilm_sdc_files \[get_constraint_mode $mode -sdc_files\]\n" + set command "update_constraint_mode -name $mode -ilm_sdc_files \[get_constraint_mode $mode -sdc_files\]\n" + append commands [FF::wrap_command $vars(step),update_constraint_mode $command] + } + + append commands "cd $cwd\n" + + set command "" + foreach part $vars(partition_list) { + append command "set_module_model -cell $part \\\n" + append command "-type flexIlm \\\n" + append command "-dir $vars(partition_dir)/$part/$part.flexilm\n" + } + + append commands [FF::wrap_command $vars(step),set_module_model $command] + + set command "commit_module_model\n" + append commands [FF::wrap_command $vars(step),commit_module_model $command] + + set command "" + foreach part $vars(partition_list) { + append command "setModuleView -partition $part -type interface\n" + } + append commands [FF::wrap_command $vars(step),set_module_view $command] + + set command "getModuleView\n" + append commands [FF::wrap_command $vars(step),get_module_view $command] + + if {$vars(flow) == "mmmc"} { + set command [FF_EDI::derate_timing mmmc] + append commands [FF::wrap_command $vars(step),derate_timing $command] + set command "" +# foreach mode $vars(constraint_modes) { +# append command "update_constraint_mode -name $mode -sdc_files \"$vars($mode,pre_cts_sdc)\"\n" +# } +# append commands [FF::wrap_command $vars(step),update_constraint_mode $command] + } + + #set_analysis_view -setup [all_setup_analysis_views] -hold [all_hold_analysis_views] + #Puts " SETUP -> [all_setup_analysis_views]" + #Puts " HOLD -> [all_hold_analysis_views]" + + set command "createActiveLogicView -type topCritical -preCTS\n" + append commands [FF::wrap_command $vars(step),create_active_logic_view $command] + set command "setHierMode -optStage preCTS\n" + append commands [FF::wrap_command $vars(step),set_hier_mode $command] + set command "setOptMode -addInstancePreFix FlexILMI_ -addNetPreFix FlexILMN_\n" + append commands [FF::wrap_command $vars(step),set_opt_mode $command] + + append commands [FF::source_plug pre_flexilm_tcl 0] + set command "" + foreach part $pac_list { + append command "set hinst \[dbHInstName \[dbCellHInst \[dbGetCellByName $part\]\]\]\n" + if {[info exists vars($part,pac_mode)]} { + if {$vars($part,pac_mode) == "read_only"} { set vars($part,pac_mode) "readOnly" } + append command "setModuleView -hinst \$hinst -type $vars($part,pac_mode)\n" + } + } + + append command "getModuleView\n" + append commands [FF::wrap_command $vars(step),set_module_view $command] + + if {$vars(verbose)} { + append commands "#\n" + append commands "# RUNNING FLEXILM OPTIMIZATION\n" + append commands "#\n" + } + set command "optDesign -preCTS -outDir $vars(rpt_dir) -prefix flexilm\n" + append commands [FF::wrap_command $vars(step),opt_design $command] + + append commands [FF::source_plug post_flexilm_tcl 0] + +# set command "setTrialRouteMode -handlePartitionComplex true -honorPin true\n" +# append command "trialRoute\n" +# append command "deriveTimingBudget -noConstantModel\n" +# append commands [FF::wrap_command $vars(step),derive_timing_budget $command] + + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + set command "saveDesign -cellview {$vars(oa_design_lib) $vars(design) flexilm}\n" + } else { + set command "saveOaDesign $vars(oa_design_lib) $vars(design) flexilm\n" + } + } else { + set command "saveDesign $vars(dbs_dir)/flexilm.enc -compress\n" + } + append commands [FF::wrap_command $vars(step),save_design $command] + + set command "clearActiveLogicView\n" + append commands [FF::wrap_command $vars(step),clear_active_logic_view $command] + +### save postOpt data and commit ECO ### + +# set command "update_partition -flexIlmECO \\\n" +# append command " -goldenDir $vars(partition_dir) \\\n" +# append command " -flexIlmDir $vars(partition_dir)_FLEXILM\n" +# append commands [FF::wrap_command $vars(step),update_partition $command] + + set command "update_partition -flexIlmECO \\\n" + foreach part $vars(partition_list) { + append command " -goldenBlockDir $vars(partition_dir)/$part/$vars(dbs_dir)/prects.enc.dat \\\n" + } + append command " -flexIlmDir $vars(partition_dir)_FLEXILM\n" + append commands [FF::wrap_command $vars(step),update_partition $command] + + set command "report_resource -end opt_flexIlm\n" + append commands [FF::wrap_command $vars(step),report_resource $command] + + append commands "#---------------------------------------------------------------------\n" + append commands "# GENERATING REPORTS\n" + append commands "#---------------------------------------------------------------------\n" + + if {$vars(report_power)} { + if {[info exists vars(power_analysis_view)] && ($vars(power_analysis_view) != "")} { + set command "report_power -view $vars(power_analysis_view) -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } else { + set command "report_power -outfile $vars(rpt_dir)/$vars(step).power.rpt\n" + } + append commands [FF::wrap_command $vars(step),report_power $command] + } + + if {[FF::is_lp_flow] && [info exists vars(power_domains)] && [llength $vars(power_domains)] > 1} { + + ###################################################################### + # Verify power domain + ###################################################################### + + set command "verifyPowerDomain -bind -gconn" + append command " -isoNetPD $vars(rpt_dir)/$vars(step).isonets.rpt" + append command " -xNetPD $vars(rpt_dir)/$vars(step).xnets.rpt\n" + + append commands [FF::wrap_command $vars(step),verify_power_domain $command] + + ###################################################################### + # Run CLP + ###################################################################### + + if {$vars(run_clp) && ([auto_execok lec] != "")} { + set command "runCLP " + if {[info exists vars(clp_options)]} { + append command $vars(clp_options) + } + append command "\n" + append commands [FF::wrap_command $vars(step),run_clp $command] + } else { + if {![info exists vars(clp_warning)]} { + puts " WARNING: UNABLE TO RUN CLP ... PLEASE MAKE SURE IT IS IN YOUR PATH" + set vars(clp_warning) true + } + } + } + if {!$vars(codegen)} { + uplevel #0 eval $commands + set commands "" + } + +# if {$vars(makefile)} { + append commands "if {\[info exists env(VPATH)\]} {\n" + append commands "set op \[open $env(VPATH)/flexilm w\]\n" + foreach part $vars(partition_list) { + append commands "puts \$op \"set vars($part,cdtv) \$::Rda_CDTV::ilmDataInfo($part,blockDir)\"\n" + } + append commands "close \$op\n" +# foreach part $vars(partition_list) { +# append commands "file copy -force $vars(partition_dir_pass2)/$part/Makefile $vars(partition_dir_pass2)/$part.Makefile\n" +# } + + append commands "exec /bin/touch \$env(VPATH)/$vars(step)\n" + append commands "}\n" +# } + + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_partition_place {{format 1}} { + + global vars + global errors + global env + + + set vars(step) partition_place + set vars(hier) true + if {[info exists vars(time_design_options,setup)]} { + set tmp_time_design_options_setup $vars(time_design_options,setup) + } else { + set vars(time_design_options,setup) "" + } + + set commands "" + + if {!$vars(use_flexmodels)} { + # Initialise the design if not using flexmodels + if {$vars(codegen)} { + append commands [FF_EDI::run_init $format] + } else { + FF_EDI::run_init $format + } + } + + if {$vars(use_proto_net_delay_model)} { + if {!$vars(use_flexmodels)} { + set command "catch {exec rm -rf proto_model_BACKUP}\ncatch {exec mv -f proto_model proto_model_BACKUP}\n" + append commands [FF::wrap_command $vars(step),proto_model_BACKUP $command] + set command "create_ps_per_micron_model\n" + append commands [FF::wrap_command $vars(step),create_ps_per_micron_model $command] + } + set command "timeDesign -proto -prePlace -prefix preplace -outDir $vars(rpt_dir)\n" + append commands [FF::wrap_command $vars(step),time_design $command] + } else { + set command "timeDesign -prePlace -prefix preplace -outDir $vars(rpt_dir)\n" + append commands [FF::wrap_command $vars(step),time_design $command] + } + + if {$vars(use_flexmodels)} { + set command "report_proto_model -created\n" + append commands [FF::wrap_command $vars(step),report_proto_model $command] + } + + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + set command "saveDesign -cellview {$vars(oa_design_lib) $vars(design) init}\n" + } else { + set command "saveOaDesign $vars(oa_design_lib) $vars(design) init\n" + } + } else { + if {($vars(step) != "partition_place")} { + set command "saveDesign $vars(dbs_dir)/init.enc -compress\n" + } else { + set command "" + } + } + + append commands [FF::wrap_command $vars(step),save_design,init $command] + + set command "" + # Additional timing setup + if {[info exists vars($vars(design),latency_sdc)]} { + append command "foreach mode \[all_constraint_modes -active\] {\n" + append command " set sdc_files \[get_constraint_mode \$mode -sdc_files\]\n" + append command " set sdc_list \[concat \$sdc_files $vars($vars(design),latency_sdc)\]\n" + append command " update_constraint_mode -name \$mode -sdc_files \$sdc_list\n" + append command "}\n" + + append commands [FF::wrap_command $vars(step),update_constraint_mode $command] + } + + foreach view [concat $vars(setup_analysis_views) $vars(hold_analysis_views)] { + foreach ptn $vars(partition_list) { + if {[info exists vars($ptn,$view,latency_sdc)]} { + set latency($view,$ptn) $vars($ptn,$view,latency_sdc) + } elseif {[info exists vars($ptn,latency_sdc)]} { + set latency($view,$ptn) $vars($ptn,latency_sdc) + } else { + set latency($view,$ptn) "none" + } + } + } + + set command "" + foreach view [concat $vars(setup_analysis_views) $vars(hold_analysis_views)] { + foreach ptn $vars(partition_list) { + if {$latency($view,$ptn) != "none"} { + append command " setPtnUserCnsFile -view $view -fileName $latency($view,$ptn) -ptnName $ptn\n" + } + } + } + + if {$command != ""} { + append commands [FF::wrap_command $vars(step),set_ptn_user_cns_file $command] + } + + # Insert feedthrough and trial route, as appropriate + set do_trial_route_time_design 1 + + # Pre-placement + if {[info exists vars(place,set_place_mode,skip)]} { + set cache_skip_place_mode $vars(place,set_place_mode,skip) + } + set vars(place,set_place_mode,skip) 1 + if {[info exists vars(place,place_design,skip)]} { + set cache_skip_place_design $vars(place,place_design,skip) + } + set vars(place,place_design,skip) 1 + + append command "if {\[dbGet -e top.ptns.clones\] != \"\"} {\n" + append command " alignPtnClone\n" + append command "}\n" + append commands [FF::wrap_command $vars(step),align_partition_clone $command] + + set vars(hier_case) "$vars(use_flexmodels)$vars(placement_based_ptn)$vars(abutted_design)$vars(insert_feedthrough)" + + # Disable scan reorder for partitioning flow + # set command "setPlaceMode -reorderScan false\n" + # append commands [FF::wrap_command $vars(step),set_place_mode $command] + + switch $vars(hier_case) { + "0000" { + if {$vars(enable_nrgr)} { + set command "setDesignMode -useTurboNRGRFlow true\n" + append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + } + "0001" { + if {$vars(enable_nrgr)} { + set command "setDesignMode -useTurboNRGRFlow true\n" + append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + "0010" { + if {$vars(enable_nrgr)} { + set command "setDesignMode -useTurboNRGRFlow true\n" + append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + "0011" { + if {$vars(enable_nrgr)} { + set command "setDesignMode -useTurboNRGRFlow true\n" + append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + "0100" { + if {$vars(enable_nrgr)} { + set command "setDesignMode -useTurboNRGRFlow true\n" + append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true -fp true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + "0101" { + if {$vars(enable_nrgr)} { + set command "setDesignMode -useTurboNRGRFlow true\n" + append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true -fp true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + "0110" { + if {$vars(enable_nrgr)} { + set command "setDesignMode -useTurboNRGRFlow true\n" + append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true -fp true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + "0111" { + if {$vars(enable_nrgr)} { + set command "setDesignMode -useTurboNRGRFlow true\n" + append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true -fp true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + } + + "1000" { + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true \n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + set command "set_proto_mode -place_effort default\n" + append commands [FF::wrap_command $vars(step),set_proto_mode $command] + set command "setTrialRouteMode -floorplanMode true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + } + "1001" { + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true \n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + set command "set_proto_mode -place_effort default\n" + append commands [FF::wrap_command $vars(step),set_proto_mode $command] + set command "setTrialRouteMode -floorplanMode true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + } + "1010" { + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true \n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + set command "set_proto_mode -place_effort default\n" + append commands [FF::wrap_command $vars(step),set_proto_mode $command] + set command "setTrialRouteMode -floorplanMode true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + } + "1011" { + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true \n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + set command "set_proto_mode -place_effort default\n" + append commands [FF::wrap_command $vars(step),set_proto_mode $command] + set command "setTrialRouteMode -floorplanMode true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + } + "1100" { + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true -fp true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + } + "1101" { + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true -fp true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + } + "1110" { + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true -fp true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + } + } + "1111" { + set command "setPlaceMode -place_global_cong_effort auto -place_global_clock_gate_aware true -place_global_place_io_pins true -fp true\n" + append commands [FF::wrap_command $vars(step),set_place_mode $command] + if {!$vars(flexmodel_as_ptn)} { + set command "set_proto_model_physical_constraint -type soft_guide\n" + append commands [FF::wrap_command $vars(step),set_proto_model_physical_constraint $command] + } + } + } + + if {$vars(use_proto_net_delay_model)} { + set command "set_proto_mode -timing_net_delay_model use_actual_wire\n" + append commands [FF::wrap_command $vars(step),set_proto_model $command] + } + + # Place design + + set save $vars(place_opt_design) + if {$vars(codegen)} { + append commands [FF_EDI::run_place $format] + } else { + uplevel #0 eval $commands + FF_EDI::run_place $format + set commands "" + } + set vars(place_opt_design) $save + + if {[info exists cache_skip_place_mode]} { + set vars(place,set_place_mode,skip) $cache_skip_place_mode + } else { + set vars(place,set_place_mode,skip) false + } + if {[info exists cache_skip_place_mode]} { + set vars(place,place_design,skip) $cache_skip_place_design + } else { + set vars(place,place_design,skip) false + } + + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + set command "saveDesign -cellview {$vars(oa_design_lib) $vars(design) place}\n" + } else { + set command "saveOaDesign $vars(oa_design_lib) $vars(design) place\n" + } + } else { + set command "saveDesign $vars(dbs_dir)/place.enc -compress\n" + } + append commands [FF::wrap_command $vars(step),save_design $command] + + # Post-placement + switch $vars(hier_case) { + "0000" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "setTrialRouteMode -handlePartitionComplex true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + set command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route $command] + } else { + set command "setRouteMode -earlyGlobalRoutePartitionHonorFence .\n" + append commands [FF::wrap_command $vars(step),set_route_mode $command] + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route $command] + } + } + "0001" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route_1 $command] + set command "insertPtnFeedthrough -routeBased -saveTopoFile topo.txt -netMapping netmapping.txt -doubleBuffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "setTrialRouteMode -handlePartitionComplex true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + set command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route_2 $command] + } else { + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route_1 $command] + set command "insertPtnFeedthrough -routeBased -saveTopoFile topo.txt -netMapping netmapping.txt -doubleBuffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "setRouteMode -earlyGlobalRoutePartitionHonorFence .\n" + append commands [FF::wrap_command $vars(step),set_route_mode $command] + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route_2 $command] + } + + } + "0010" { +# set command "setTrialRouteMode -handlePartitionComplex true\n" +# append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] +# set command "trialRoute\n" +# append commands [FF::wrap_command $vars(step),trial_route $command] + } + "0011" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route_1 $command] + set command "insertPtnFeedthrough -routeBased -saveTopoFile topo.txt -netMapping netmapping.txt -doubleBuffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "setTrialRouteMode -handlePartitionComplex true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + set command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route_2 $command] + } else { + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route_1 $command] + set command "insertPtnFeedthrough -routeBased -saveTopoFile topo.txt -netMapping netmapping.txt -doubleBuffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "setRouteMode -earlyGlobalRoutePartitionHonorFence .\n" + append commands [FF::wrap_command $vars(step),set_route_mode $command] + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route_2 $command] + } + } + "0100" { +# append command "timeDesign -prects -prefix place -outDir $vars(rpt_dir)\n" +# append commands [FF::wrap_command $vars(step),time_design $command] + } + "0101" { + set command "insertPtnFeedthrough -saveTopoFile topo.txt -netMapping netmapping.txt -doubleBuffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + } + "0110" { +# append command "timeDesign -prects -prefix place -outDir $vars(rpt_dir)\n" +# append commands [FF::wrap_command $vars(step),time_design $command] + } + "0111" { + set command "insertPtnFeedthrough -saveTopoFile topo.txt -netMapping netmapping.txt -doubleBuffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + } + "1000" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "setTrialRouteMode -handlePartitionComplex true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + set command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route $command] + } else { + set command "setRouteMode -earlyGlobalRoutePartitionHonorFence .\n" + append commands [FF::wrap_command $vars(step),set_route_mode $command] + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route $command] + } + } + "1001" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route_1 $command] + set command "insertPtnFeedthrough -routeBased -saveTopoFile topo.txt -netMapping netmapping.txt -doubleBuffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "setTrialRouteMode -handlePartitionComplex true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + set command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route_2 $command] + } else { + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route_1 $command] + set command "insertPtnFeedthrough -routeBased -saveTopoFile topo.txt -netMapping netmapping.txt -doubleBuffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "setRouteMode -earlyGlobalRoutePartitionHonorFence .\n" + append commands [FF::wrap_command $vars(step),set_route_mode $command] + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route_2 $command] + } + } + "1010" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "setTrialRouteMode -handlePartitionComplex true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + set command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route $command] + } else { + set command "setRouteMode -earlyGlobalRoutePartitionHonorFence .\n" + append commands [FF::wrap_command $vars(step),set_route_mode $command] + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route $command] + } + } + "1011" { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route_1 $command] + set command "insertPtnFeedthrough -routeBased -saveTopoFile topo.txt -netMapping netmapping.txt -doubleBuffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "setTrialRouteMode -handlePartitionComplex true\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + set command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route_2 $command] + } else { + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route_1 $command] + set command "insertPtnFeedthrough -routeBased -saveTopoFile topo.txt -netMapping netmapping.txt -doubleBuffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + set command "setRouteMode -earlyGlobalRoutePartitionHonorFence .\n" + append commands [FF::wrap_command $vars(step),set_route_mode $command] + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route_2 $command] + } + } + "1100" { + } + "1101" { + set command "insertPtnFeedthrough -saveTopoFile topo.txt -netMapping netmapping.txt -doubleBuffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + } + "1110" { + set do_trial_route_time_design 0 + } + "1111" { + set command "insertPtnFeedthrough -saveTopoFile topo.txt -netMapping netmapping.txt -doubleBuffer\n" + append commands [FF::wrap_command $vars(step),insert_ptn_feedthrough $command] + } + } + if {$vars(use_proto_net_delay_model)} { + set command "timeDesign -proto -prects -prefix place -outDir $vars(rpt_dir)\n" + } else { + set command "timeDesign -prects -prefix place -outDir $vars(rpt_dir)\n" + } + append commands [FF::wrap_command $vars(step),time_design $command] + + # Output or run the generated commands + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + + } + + proc run_assign_pin {{format 1}} { + global vars + global errors + global env + + set vars(step) assign_pin + set vars(hier) true + set commands "" + + ############################################################################### + # Assign partition pins via plug-in as this the + # pitch, depth, and layer values are design specific + # Also, verify the pin assignment and fix them + ############################################################################### + + append commands [FF::source_plug pre_assign_pin_tcl] + + set command "assignPtnPin\n" + append commands [FF::wrap_command $vars(step),assign_ptn_pins $command] + + append commands [FF::source_plug post_assign_pin_tcl] + + set command "checkPinAssignment -outFile pincheck.rpt\n" + append commands [FF::wrap_command $vars(step),check_pin_assignment $command] + + set command "reportUnalignedNets -rptFile $vars(rpt_dir)/unaligned.rpt\n" + append commands [FF::wrap_command $vars(step),report_unaligned_nets $command] + + if {!([info exists vars(placement_based_ptn)] && $vars(placement_based_ptn))} { + if {[lindex [split $vars(version) "."] 0] < 16} { + set command "setTrialRouteMode -honorPin true -handlePartitionComplex true\n" + append command "trialRoute\n" + append commands [FF::wrap_command $vars(step),trial_route $command] + } else { + set command "setRouteMode -earlyGlobalRoutePartitionHonorFence . -earlyGlobalRoutePartitionHonorPin .\n" + append commands [FF::wrap_command $vars(step),set_route_mode $command] + set command "earlyGlobalRoute\n" + append commands [FF::wrap_command $vars(step),early_global_route $command] + } + } + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_model_gen {{format 1}} { + + global vars + global errors + global env + + set vars(step) model_gen + set vars(hier) true + set commands "" + + # Initialise the design + if {$vars(use_flexmodels)} { + # Initialise the design if not using flexmodel prototype + if {$vars(codegen)} { + append commands [FF_EDI::run_init $format] + } else { + FF_EDI::run_init $format + } + + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + set command "saveDesign -cellview {$vars(oa_design_lib) $vars(design) init}\n" + } else { + set command "saveOaDesign $vars(oa_design_lib) $vars(design) init\n" + } + } else { + set command "saveDesign $vars(dbs_dir)/init.enc -compress\n" + } + + append commands [FF::wrap_command $vars(step),save_design,init $command] + } + + if {$vars(use_proto_net_delay_model) && $vars(use_flexmodels)} { + set command "catch {exec rm -rf proto_model_BACKUP}\ncatch {exec mv -f proto_model proto_model_BACKUP}\n" + append commands [FF::wrap_command $vars(step),proto_model_BACKUP $command] + set command "create_ps_per_micron_model\n" + append commands [FF::wrap_command $vars(step),create_ps_per_micron_model $command] +# set command "timeDesign -proto -prePlace -prefix preplace -outDir $vars(rpt_dir)\n" +# append commands [FF::wrap_command $vars(step),time_design $command] + } + + append commands [FF::source_plug pre_model_gen_tcl] + + if {$vars(enable_nrgr)} { + set command "setDesignMode -useTurboNRGRFlow true\n" + append commands [FF::wrap_command $vars(step),set_design_mode $command] + } + + set vars(hier_case) "$vars(flexmodel_as_ptn)$vars(insert_feedthrough)" + + switch $vars(hier_case) { + "00" { + set command "identify_proto_model\n" + append commands [FF::wrap_command $vars(step),identify_proto_model $command] + } + "01" { + set command "identify_proto_model\n" + append commands [FF::wrap_command $vars(step),identify_proto_model $command] + } + "10" { + set command "set_proto_mode -create_partition_as_flexmodel true\n" + append commands [FF::wrap_command $vars(step),set_proto_mode $command] +# if {[info exists vars(partition_list)] && ($vars(partition_list) != "")} { +# foreach ptn $vars(partition_list) { +# set command "set_proto_model -model $ptn -type flex_module\n" +# append commands [FF::wrap_command $vars(step),set_proto_model $command] +# } +# } else { +# puts " ERROR: Flexmodel partition flow enabled but no partitions are defined" +# set errors($vars(error_count)) "Flexmodel partition flow enabled but no partitions are defined" +# incr vars(error_count) +# } + } + "11" { + set command "set_proto_mode -create_partition_as_flexmodel true\n" + append commands [FF::wrap_command $vars(step),set_proto_mode $command] +# if {[info exists vars(partition_list)] && ($vars(partition_list) != "")} { +# foreach ptn $vars(partition_list) { +# set command "set_proto_model -model $ptn -type flex_module\n" +# append commands [FF::wrap_command $vars(step),set_proto_model $command] +# } +# } else { +# puts " ERROR: Flexmodel partition flow enabled but no partitions are defined" +# set errors($vars(error_count)) "Flexmodel partition flow enabled but no partitions are defined" +# incr vars(error_count) +# } +# } + } + +# if {[info exists vars(model_gen,min_inst)]} { +# set min_inst $vars(model_gen,min_inst) +# } else { +# set min_inst 1000 +# } +# set command "setIlmMode -highFanoutPort false\n" +# append commands [FF::wrap_command $vars(step),setIlmMode $command] + + set command "setIlmMode -keepHighFanoutPorts false\n" + append commands [FF::wrap_command $vars(step),set_ilm_mode $command] + if {$vars(flexmodel_art_based)} { + set command "create_proto_model -out_dir $vars(dbs_dir)/model_gen.enc\n" + } else { + set command "create_proto_model -partition_based\ncommit_proto_model\n" + } + append commands [FF::wrap_command $vars(step),create_proto_model $command] + if {$vars(create_flexfiller_blockage)} { + set command "create_flexfiller_route_blockage\n" + append commands [FF::wrap_command $vars(step),create_flexfiller_route_blockage $command] + } + + append commands [FF::source_plug post_model_gen_tcl] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_prototype {{format 1}} { + + global vars + global errors + global env + + set vars(step) prototype + set vars(hier) true + set commands "" + + append commands [FF::source_plug pre_prototype_tcl] + + set command "report_proto_model -created\n" + append commands [FF::wrap_command $vars(step),report_proto_model $command] + set command "ungroup -type flex_model\n" + append commands [FF::wrap_command $vars(step),ungroup_flexilm_1 $command] + + set command "timeDesign -proto -preplace \n" + append commands [FF::wrap_command $vars(step),time_design $command] +# set command "definePartition -proto [list $vars(partition_list)]\n" + set command "" + foreach ptn $vars(partition_list) { + append command "definePartition -proto \[dbGet \[dbGetCellByName $ptn\].hinst.name\]\n" + } + append commands [FF::wrap_command $vars(step),define_partition $command] + + set command "set_proto_mode -proto_design_level $vars(flexmodel_prototype_flow_style)\n" + append commands [FF::wrap_command $vars(step),set_proto_mode $command] + set command "set_proto_design_mode -reset\n" + if {$vars(flexmodel_prototype_congestion_aware)} { + append command "set_proto_design_mode -congestion_aware true\n" + } + if {$vars(flexmodel_prototype_timing_aware)} { + append command "set_proto_design_mode -timing_aware true\n" + } + +# Following 2 settings will be removed + append command "set_proto_design_mode -new_algorithm true\n" + append command "set_proto_design_mode -report_timing false\n" + + append commands [FF::wrap_command $vars(step),set_proto_design_mode $command] + + if {$vars(flexmodel_prototype_flow_style) == "top_to_bottom"} { +# if {![info exists vars(flexmodel_prototype_max_level)]} { +# set vars(flexmodel_prototype_max_level) 1 +# } +# set command "set max_level $vars(flexmodel_prototype_max_level)\n" + set command "set max_level \[get_flexmodel_max_level\]\n" + append command "set level 0\n" + append command "while {\$level < \$max_level} {\n" + append command "set_proto_mode -partition_level_num \$level\n" + append command "proto_design -constraints $vars(flexmodel_prototype_user_contraints)\n" + append command "checkFPlan -outFile $vars(rpt_dir)/check_fplan_proto_design_level_\${level}.rpt \n" + append command "placeDesign -noPrePlaceOpt\n" + append command "timeDesign -proto -prects -prefix proto_design_level_\${level} -outDir $vars(rpt_dir)\n" + append command "load_timing_debug_report -proto \n" + append command "file copy -force $vars(plug_dir)/post_proto_design_level.tcl .post_proto_design_level_\${level}.tcl\n" + append command "source .post_proto_design_level_\${level}.tcl\n" + append command "incr level 1\n" + append command "}\n" + } else { + set command "set level $vars(flexmodel_prototype_flow_style)\n" + append command "proto_design -constraints $vars(flexmodel_prototype_user_contraints)\n" + append command "checkFPlan -outFile $vars(rpt_dir)/check_fplan_proto_design_level_\${level}.rpt \n" + append command "placeDesign\n" + append command "timeDesign -proto -prects -prefix proto_design_level_\${level} -outDir $vars(rpt_dir)\n" + append command "load_timing_debug_report -proto \n" + append command "source $vars(plug_dir)/post_proto_design_level.tcl\n" + } + append commands [FF::wrap_command $vars(step),proto_loop $command] + + set command "ungroup -type flex_model -display_all_constraints\n" + append commands [FF::wrap_command $vars(step),ungroup_flexilm_2 $command] + + set command "set_proto_timing_settings -reset\n" + + append commands [FF::source_plug post_prototype_tcl] + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + } + + proc run_partition {{format 1}} { + + global vars + global errors + global env + + set vars(step) partition + set vars(hier) true + + set commands "" + + ############################################################################### + # Budget the blocks based on the mode + ############################################################################### + + set command "" + append command "set_global timing_support_hierarchical_pin_constraints true\n" + append command "set tbgPrintExceptionInfoInJustify 1\n" + append commands [FF::wrap_command $vars(step),set_budget_vars $command] + + if {$vars(budget_mode) == "proto_net_delay_model" && $vars(use_proto_net_delay_model)} { + set command "timeDesign -proto -prefix budget -outDir $vars(rpt_dir)\n" + append commands [FF::wrap_command $vars(step),time_design $command] + } + + # Define budgeting options ... + set command "" + + append command "setBudgetingMode -writeLatencyPerClock true\n" + + append command "if {\[dbGet -e top.ptns.clones\] != \"\"} {\n" + append command " setBudgetingMode -mergeClones true\n" + append command "}\n" + + if {[info exists vars(abutted_design)] && $vars(abutted_design)} { + append command "setBudgetingMode -abutted true\n" + } + + switch [string tolower $vars(budget_mode)] { + giga_opt { + # This is default behavior now +# append command "setBudgetingMode -virtualOptEngine gigaOpt\n" + } + trial_ipo { + append command "setBudgetingMode -virtualOptEngine trialIPO\n" + } + proto_net_delay_model { + if {$vars(use_proto_net_delay_model)} { + append command "setBudgetingMode -virtualOptEngine none\n" + } + } + } +# append command "setBudgetingMode -enableMTBudgeting true\n" + append commands [FF::wrap_command $vars(step),set_budgeting_mode $command] + + if {([string tolower $vars(budget_mode)] != "proto_net_delay_model") && $vars(use_proto_net_delay_model)} { + set command "set_proto_timing_settings -reset\n" + append commands [FF::wrap_command $vars(step),set_proto_timing_settings $command] + } + set command "deriveTimingBudget -justify\n" + append commands [FF::wrap_command $vars(step),derive_timing_budget $command] + + ############################################################################### + # Run CLP + ############################################################################### + if {[FF::is_lp_flow] && [info exists vars(power_domains)] && [llength $vars(power_domains)] > 1} { + if {$vars(run_clp) && ([auto_execok lec] != "")} { + set command "runCLP " + if {[info exists vars(clp_options)]} { + append command $vars(clp_options) + } + append command "\n" + append commands [FF::wrap_command $vars(step),run_clp $command] + } + } + + if {$vars(use_flexmodels) || $vars(placement_based_ptn)} { + set command "set max_layer \[getTrialRouteMode -maxRouteLayer\]\n" + append command "setPlaceMode -reset \n" + append command "setTrialRouteMode -reset \n" + append command "setTrialRouteMode -maxRouteLayer \$max_layer\n" + append commands [FF::wrap_command $vars(step),set_trial_route_mode $command] + } + + if {$vars(use_proto_net_delay_model)} { + set command "set_proto_timing_settings -reset\n" + append commands [FF::wrap_command $vars(step),set_proto_timing_settings $command] + } + + ############################################################################### + # Partition and save the partitions into the + # directory PARTITION + ############################################################################### + append commands [FF::source_plug pre_partition_tcl] + + +# set command "set ptngPtnTimingLibFormat lib\npartition -buildScan\n" + set command "partition -buildScan\n" + append commands [FF::wrap_command $vars(step),partition $command] + if {[lindex [split $vars(version) "."] 0] > 10} { + if {([string compare $vars(dbs_format) "oa"]==0)} { + set command "savePartition -ptnLib $vars(oa_partition_lib) -dir $vars(partition_dir)\n" + } else { + set command "savePartition -dir $vars(partition_dir) -def -scanDef\n" + } + } else { + set command "savePartition -dir $vars(partition_dir) -def -scanDef\n" + } + append commands [FF::wrap_command $vars(step),save_partition $command] + + if {$vars(use_flexmodels) && $vars(flexmodel_as_ptn)} { +# set command "replace_proto_model \\\n" +# append command " -pre_ft_dir $vars(eco_dir)/pre_ft \\\n" +# append command " -post_ft_dir $vars(eco_dir)/post_ft \\\n" +# append command " -ptn_dir $vars(partition_dir) \\\n" +# append command " -ptn_full_netlist_dir ./temp_netlist_dir \\\n" +# append command " -out_dir $vars(partition_dir)\n" + + set command "replace_proto_model \\\n" + append command " -ptn_dir $vars(partition_dir) \\\n" + append command " -out_dir $vars(partition_dir)\n" + + append commands [FF::wrap_command $vars(step),replace_proto_model $command] + } + + append commands [FF::source_plug post_partition_tcl] + + if {!$vars(codegen)} { + uplevel #0 eval $commands + } + + set path [file normalize $vars(script_path)] + + file mkdir $vars(partition_dir) + + if {![file exists $vars(partition_dir)/Makefile.partition]} { + file copy $vars(script_path)/ETC/INNOVUS/Makefile.partition $vars(partition_dir) + } + set op [open $vars(partition_dir)/Makefile w] + if {![info exists env(VPATH)]} { + set env(VPATH) "make" + } + puts $op "VPATH=$env(VPATH)" + puts $op "BLOCKS = $vars(partition_list)" + puts $op "" + puts $op "include Makefile.partition" + close $op + + foreach var [array names vars] { + set svars($var) $vars($var) + } + set vars(mode) flat +# set vars(hier) true + set link [file normalize $vars(script_root)] + foreach block [concat $vars(design) $vars(partition_list)] { + exec mkdir -p $vars(partition_dir)/$block +# if {[file exists .ff.tcl]} { +# file copy -force .ff.tcl $vars(partition_dir)/$block +# } + if {[file exists $vars(partition_dir)/$block/Makefile]} { + file delete $vars(partition_dir)/$block/Makefile + } + if {[info exists vars($block,innovus_config_tcl)] && [file exists $vars($block,innovus_config_tcl)]} { + puts " Sourcing $vars($block,innovus_config_tcl)" + source $vars($block,innovus_config_tcl) + } + set cwd [pwd] + + if {([lindex [split $vars(version) "."] 0] > 10) && ([string compare $vars(dbs_format) "oa"]==0)} { + if {[file exists cds.lib]} { + set ip [open cds.lib r] + set i 0 + while {[gets $ip line]>=0} { + set cds_lib($i) $line + incr i + } + close $ip + } else { + puts " ERROR: A cds.lib file is required for open access flows ..." + } + } + cd $vars(partition_dir)/$block + set vars(design) $block + if {$vars(codegen)} { + if {[info exists vars(proc_file)]} { + unset vars(proc_file) + } + unset vars(steps) + } + if {[info exists vars(cts_spec)]} { + unset vars(cts_spec) + } + if {[info exists vars($block,cts_spec)]} { + set vars(cts_spec) $vars($block,cts_spec) + } + + if {!$vars(codegen)} { + exec ln -s $link SCRIPTS + exec ln -s SCRIPTS/Makefile.edi.flat Makefile + } else { + set vars(mode) flat + set vars(hier) true + unset vars(step) + execute_flow all $vars(format_lines) + FF::dump_vars + } + cd $cwd +# set actions $vars(actions) + foreach var [array names vars] { + unset vars($var) + } +# set vars(actions) $actions + foreach var [array names svars] { + set vars($var) $svars($var) + } + } + if {$vars(hier_flow_type) == "2pass"} { + foreach block [concat $vars(design) $vars(partition_list)] { + exec mkdir -p $vars(partition_dir_pass2)/$block/$vars(script_dir)/INNOVUS + exec mkdir -p $vars(partition_dir_pass2)/$block/$vars(rpt_dir) + if {[file isdirectory $vars(partition_dir_pass2)/$block/$vars(script_dir)/ETC]} { + file delete -force $vars(partition_dir_pass2)/$block/$vars(script_dir)/ETC + } +# file copy -force $vars(partition_dir)/$block/$vars(script_dir)/ETC $vars(partition_dir_pass2)/$block/$vars(script_dir)/ETC + foreach file [glob $vars(partition_dir)/Make*] { + if {[file isfile $file]} { + file copy -force $file $vars(partition_dir_pass2) + } + } + foreach file [glob $vars(partition_dir)/$block/$vars(script_dir)/*] { + if {[file isfile $file]} { + file copy -force $file $vars(partition_dir_pass2)/$block/$vars(script_dir) + } + } + if {[file isfile $vars(partition_dir)/$block/.ilm_non_sdc_file.tcl]} { + file copy -force $vars(partition_dir)/$block/.ilm_non_sdc_file.tcl $vars(partition_dir_pass2)/$block + } + if {[file isfile $vars(partition_dir)/$block/empty.sdc]} { + file copy -force $vars(partition_dir)/$block/empty.sdc $vars(partition_dir_pass2)/$block + } + if {[file isfile $vars(partition_dir)/$block/Makefile.pass2]} { + file copy -force $vars(partition_dir)/$block/Makefile.pass2 $vars(partition_dir_pass2)/$block/Makefile + file delete $vars(partition_dir)/$block/Makefile.pass2 + } + cd $vars(partition_dir_pass2)/$block + if {$vars(enable_flexilm)} { + set index [lsearch [FF::adjust_steps] cts] + } else { +# set index [lsearch [FF::adjust_steps] postcts] +# set index [lsearch [FF::adjust_steps] postcts_hold] + set index [expr [lsearch [FF::adjust_steps] cts]+2] + } + cd $cwd +#puts "SPLIT FLOWS: $index, [FF::adjust_steps]" + foreach step [lrange $vars(steps) $index end] { + if {[lsearch $vars(fsteps) $step] != -1} { + if {[file isfile $vars(partition_dir)/$block/$vars(script_dir)/INNOVUS/run_$step.tcl]} { +#puts "COPY: $vars(partition_dir)/$block/$vars(script_dir)/INNOVUS/run_$step.tcl $vars(partition_dir_pass2)/$block/$vars(script_dir)/INNOVUS" + file copy -force $vars(partition_dir)/$block/$vars(script_dir)/INNOVUS/run_$step.tcl \ + $vars(partition_dir_pass2)/$block/$vars(script_dir)/INNOVUS +#puts "DELETE: $vars(partition_dir)/$block/$vars(script_dir)/INNOVUS/run_$step.tcl" + file delete -force $vars(partition_dir)/$block/$vars(script_dir)/INNOVUS/run_$step.tcl + } + } + } +# set adjusted [FF::adjust_steps] +# cd $vars(partition_dir)/$block +#puts "1: $adjusted : [lrange $adjusted 0 $index]" +# FF::gen_makefile [lrange $adjusted $index end] flat +# cd $cwd +# cd $vars(partition_dir_pass2)/$block +#puts "2: $adjusted : [lrange $adjusted $index end]" +# FF::gen_makefile [lrange $adjusted $index end] flat +# cd $cwd + } + } + + foreach var [array names vars] { + unset vars($var) + } + foreach var [array names svars] { + set vars($var) $svars($var) + } + + if {$vars(codegen)} { +# if {$vars(makefile)} { +# append commands "\nexec /bin/touch $env(VPATH)/partition\n" +# } + return $commands + } else { + exec /bin/touch $env(VPATH)/partition + } + } + + proc run_debug {{format 1}} { + + global vars + global errors + global env + + set vars(step) debug + + set commands "" + append commands "\nglobal env\n" + + append commands "if {\[info exists env(STEP)\]} {\n" + append commands "[FF_EDI::load_design \$env(STEP)]\n" + append commands "}\n" + +# append commands "[FF::source_plug always_source_tcl]\n" + + append commands "win\n" + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + + } + + proc run_lec {} { + + global vars + global errors + global env + + set commands "" + + append commands "vpxmode\n" + append commands "set dofile abort exit\n" + append commands "set undefined cell black_box -noascend -both\n" + append commands "tclmode\n" + append commands "// setup variables \n" + append commands "global vars\n" + append commands "proc Puts {args} {\n" + append commands " puts \$args\n" + append commands "}\n" + + append command "// Define the netlist to be verify\n" + append commands "if {\[info exists env(STEP)\] && \[file exists $vars(dbs_dir)/LEC/\$env(STEP).v.gz\]} {\n" + append commands " set revisedNetlist $vars(dbs_dir)/LEC/\$env(STEP).v.gz\n" + append commands "} else {\n" + append commands " Puts \" Failed to find netlist DBS/LEC/\$env(STEP).v.gz\"\n" + append commands "}\n" + + if {[info exists vars(threads)]} { + append commands "vpx set compare option -threads $vars(threads)\n" + } + + append commands "// read liberty cell definitions\n" + if {[info exists vars($vars(default_setup_view),delay_corner)]} { + if {[info exists vars($vars($vars(default_setup_view),delay_corner),library_set)]} { + set set $vars($vars($vars(default_setup_view),delay_corner),library_set) + } else { + return + } + } else { + return + } + append commands "vpx read library -statetable -both -liberty \[list $vars($set,timing)\]\n" + + append commands "// read reference netlist\n" + append commands "vpx read design -verilog -sensitive -golden $vars(netlist)\n" + + append commands "// read post-implementation netlist\n" + append commands "vpx read design -verilog -sensitive -revised \$revisedNetlist\n" + + append commands "//set top level\n" + append commands "vpx set root module $vars(design) -both\n" + + regsub -all "#" [FF::source_plug pre_lec_tcl] "//" temp + append commands $temp + + append commands "vpxmode\n" + append commands "report design data\n" + append commands "report black box\n" + + append commands "set mapping method -name first\n" + append commands "set flatten model -seq_constant -seq_constant_x_to 0\n" + append commands "set flatten model -nodff_to_dlat_zero -nodff_to_dlat_feedback\n" + append commands "set flatten model -gated_clock\n" + append commands "set system mode lec\n" + append commands "add compare point -all\n" + append commands "compare -gate_to_gate\n" + append commands "usage\n" + append commands "// vpx report compare data" + append commands "report compare data -class nonequivalent -class abort -class notcompared\n" + append commands "report verification -verbose\n" + append commands "report statistics\n" + + append commands "tclmode\n" + append commands "set points_count \[get_compare_points -count\]\n" + append commands "set diff_count \[get_compare_points -diff -count\]\n" + append commands "set abort_count \[get_compare_points -abort -count\]\n" + append commands "set unknown_count \[get_compare_points -unknown -count\]\n" + append commands "if {\$points_count == 0} {\n" + append commands " puts \"---------------------------------\"\n" + append commands " puts \"ERROR: No compare points detected\"\n" + append commands " puts \"---------------------------------\"\n" + append commands "}\n" + append commands "if {\$diff_count > 0} {\n" + append commands " puts \"------------------------------------\"\n" + append commands " puts \"ERROR: Different Key Points detected\"\n" + append commands " puts \"------------------------------------\"\n" + append commands "}\n" + append commands "if {\$abort_count > 0} {\n" + append commands " puts \"-----------------------------\"\n" + append commands " puts \"ERROR: Abort Points detected \"\n" + append commands " puts \"-----------------------------\"\n" + append commands "}\n" + append commands "if {\$unknown_count > 0} {\n" + append commands " puts \"----------------------------------\"\n" + append commands " puts \"ERROR: Unknown Key Points detected\"\n" + append commands " puts \"----------------------------------\"\n" + append commands "}\n" + append commands "puts \"No of compare points = \$points_count\"\n" + append commands "puts \"No of diff points = \$diff_count\"\n" + append commands "puts \"No of abort points = \$abort_count\"\n" + append commands "puts \"No of unknown points = \$unknown_count\"\n" + append commands "exit 0\n" + + if {$vars(codegen)} { + return $commands + } else { + uplevel #0 eval $commands + } + + } + + proc dump_config {} { + + global vars + global udm + global rda_Input + global rda_defaults + +# set commands "" + file mkdir $vars(script_dir) + if {[info command FFF::get_tool] ne "" && [FFF::get_tool] eq "rc"} { + tcl_source $vars(script_path)/ETC/INNOVUS/udm.tcl + } else { + source $vars(script_path)/ETC/INNOVUS/udm.tcl + } + if {[info exists vars(cpf_file)]} { + if {$vars(cpf_timing)} { + unset init(mmmc_file) + } else { + unset init(cpf_file) + } + } + if {[lindex [split $vars(version) "."] 0] > 10} { + if {[info exists vars(view_definition_tcl)]} { + set init(mmmc_file) $vars(view_definition_tcl) + } + set op [open $vars(script_dir)/init.tcl w] + # BCL: Trying to fix embedded paths... + set relativizeMesgLog "" + set relativizeMesgLog "$relativizeMesgLog [FF::remove_outer_braces [FF::relativizeFileOrDir -arr init -vardir ff_exe_dir -relativePathsOk]]" + + foreach var [array names init] { + if {[file exists $init($var)]} { + set nvar [list] + foreach file $init($var) { + if {![regexp "oa_" $var]} { + lappend nvar [file normalize $file] + puts $op "set init_$var \"$nvar\"" + } else { + puts $op "set init_$var \"$init($var)\"" + } + } + } else { + if {$vars(netlist_type) == "verilog"} { + if {$var == "oa_design_lib"} { continue } + if {$var == "oa_design_cell"} { continue } + if {$var == "oa_design_view"} { continue } + } + puts $op "set init_$var \"$init($var)\"" + } + } +# foreach var [array names ninit] { +# puts $np "set_db init_$var \"$ninit($var)\"" +# } + foreach var [array names conf] { + puts $op "set conf_$var \"$conf($var)\"" + } + foreach var [array names cts] { + puts $op "set cts_$var \"$cts($var)\"" + } + foreach var [array names delaycal] { + puts $op "set delaycal_$var \"$delaycal($var)\"" + } + foreach var [array names extract] { + puts $op "set extract_$var \"$extract($var)\"" + } +# foreach var [array names fp] { +# puts $op "set fp_$var \{$fp($var)\}" +# } + foreach var [array names opt] { + puts $op "set opt_$var \"$opt($var)\"" + } +# foreach var [array names rda_Input] { +# puts $op "set rda_Input($var) \{$rda_Input($var)\}" +# } +# foreach var [array names rda_defaults] { +# puts $op "set rda_Input($var) \{$vars($var)\}" +# } + } else { + set op [open $vars(script_dir)/run.conf w] + #BCL: Added .ff.tcl sourcing in run.conf in order to pull in codegen variables + puts $op "# Set up codegen variables (possibly) needed to resolve some conf variables" + #puts $op "if {\[file exists .ff.tcl\]} {" + #puts $op " source .ff.tcl" + #puts $op "}" + #BCL: Only enclose in curlies if subst is not part of the netlist name + foreach var [array names rda_Input] { + # BCL: only use curlies if the variable doesn't contain subst (otherwise subst will not be performed) + if {[regexp {subst} $rda_Input($var)]} { + puts $op "set rda_Input($var) \"$rda_Input($var)\"" + } else { + puts $op "set rda_Input($var) \{$rda_Input($var)\}" + } + } +# if {$vars(flat) != "full"} { +# puts $op "set rda_Input(ui_view_definition_file) \"$vars(script_dir)/view_definition.tcl\"" +# } + } + close $op +# close $np + } + + proc get_required_procs {file} { + # + # Given a list of required procedures, return the lines that represent + # those procedures from the utils.tcl file + # + + global vars + global errors + + # + # Read the file and gather all of the contents + # + + set all_lines "" + set length 0 + set ip [open $file] + while {[gets $ip line]>=0} { + set utils_lines($length) $line + incr length + } + close $ip + + # + # Iterate across each line and pull out relevant procedures + # + + set lines "" + set i 0 + while {$i < $length} { + set line $utils_lines($i) + foreach proc $vars(required_procs) { + if {[regexp "proc $proc" $line] > 0} { + append lines " $line\n" + incr i + while {$i < $length} { + set line $utils_lines($i) + if {[regexp "proc " $line] > 0} { + incr i -1 + break + } + if {![regexp "^#" [string trimleft $line] ] && ($i != [expr $length-1])} { + append lines "$line\n" + } + incr i + } + break + } + } + incr i + } + + set lines [string trimright $lines] + return "$lines\n" + } + + proc normalize_files {} { + + global vars + global errors + + if {[info exists vars(normalize_files)] && !$vars(normalize_files)} { + return + } + + if {[info exists vars(view_definition_tcl)]} { + set mmmc_file [file normalize $vars(view_definition_tcl)] + } else { + set mmmc_file [file normalize $vars(script_dir)/view_definition.tcl] + } + set vars(mmmc_file) $mmmc_file + + foreach file_var [list cpf_file def_files netlist cts_spec lef_files \ + gds_files activity_file ilm_non_sdc_file ] { + if {[info exists vars($file_var)]} { + set temp [list] + foreach file $vars($file_var) { + lappend temp [file normalize $file] + } + set vars($file_var) $temp + } + } + } + + proc normalize_constraints {} { + + global vars + + set cwd [pwd] + cd $vars(cwd) + + foreach mode $vars(constraint_modes) { + foreach var "pre_cts_sdc pre_cts_ilm_sdc incr_cts_sdc post_cts_sdc" { + if {[info exists vars($mode,$var)]} { + set temp [list] + foreach file $vars($mode,$var) { + lappend temp [file normalize $file] + } + set vars($mode,$var) $temp + } + } + } + cd $cwd + } + + proc denormalize_files {} { + + global vars + global tvars + + foreach var [array names vars] { + if {($var != "setup_path") && ($var != "script_dir") && ($var != "script_path") && ($var == "execute_string")} { + set tvars($var) $vars($var) + } + } + +# set op [open .setup.ff.tcl w] + catch {unset path_array} + set path_list [list] + set path_vars [list] + foreach var [array names tvars] { + if [file isdirectory $tvars($var)] { + set path_array($tvars($var)) $var + lappend path_vars $var + lappend path_list $tvars($var) + } + } + + set sorted_path_list [lsort -decreasing $path_list] +# puts "-> Found [llength $sorted_path_list]" + foreach path $sorted_path_list { +# puts "$path -> $path_array($path) ([string length $path])" +# puts $op "set vars($path_array($path)) $path" + } + + foreach var [array names tvars] { + set found 0 + foreach path $sorted_path_list { + if {($var == $path_array($path)) || ([string first "\[" $var] != -1)} { + break + } + # puts $op "[format "regsub -all \"%s\" \"%s\" \\$%s" $path [join $tvars($var)] $path_array($path) temp]" + if {[catch {set command [format "regsub -all \"%s\" \"%s\" \\\$vars(%s) temp" $path [join $tvars($var)] $path_array($path)]}]} { + break + } + set foo [eval $command] + if {$foo > 0} { +# puts $op "set vars($var) \"[join $temp]\"" + if {[llength $temp] > 1} { + set vars($var) [join $temp] + } else { + set vars($var) $temp + } + set found 1 + } + } +# if {!$found} { +# puts $op "set vars($var) \"[join $vars($var)]\"" +# } + } +# foreach path $sorted_path_list { +# set vars($path_array($path)) $path +# } +# close $op +# source .setup.ff.tcl + } + + proc source_config_files {} { + + global vars + global env + global user_vars + global desc + global errors + + puts " LOADING CONFIGURATION FILES:" + set vars(config_files) [list] + foreach file "setup.tcl innovus_config.tcl lp_config.tcl genus_config.tcl" { + set temp [regsub "\\." $file "_"] + set vars($temp) [list] + if {[file exists $vars(setup_path)/$file]} { + FF::source_file $vars(setup_path)/$file + lappend vars($temp) $vars(setup_path)/$file + lappend vars(config_files) $vars(setup_path)/$file + } + if {($vars(setup_path) != ".") && [file exists $file]} { + FF::source_file $file + lappend vars($temp) $file + lappend vars(config_files) $file + } + if {$vars($temp) != ""} { + puts " $temp -> $vars($temp)" + } + } + + foreach var [array names vars] { + set user_vars($var) $vars($var) +# puts $var + } + + if {[FF::is_lp_flow]} { + set vars(required_procs) \ + "source_file system_info get_clock_ports get_power_domains modify_power_domains add_power_switches \ + route_secondary_pg_nets insert_welltaps_endcaps report_time buffer_always_on_nets \ + save_results load_applet get_tool load_path_groups" + } else { + set vars(required_procs) \ + "source_file system_info get_clock_ports report_time insert_welltaps_endcaps \ + save_results load_applet get_tool load_path_groups " + } + } + + proc execute_flow {step {format 1} {abort ""}} { + + # + # This is the entry point, responsible for calling functions and + # aggregating results for each step in the flow + # + global vars + global dargs + global fargs + global svars + global env + global errors + + if {![info exists vars(sourced)]} { set vars(sourced) 0 } +# if {![info exists vars(single)]} { set vars(single) 0 } + if {![info exists vars(catch_errors)]} { set vars(catch_errors) 0 } + if {![info exists vars(stop_step)]} { set vars(stop_step) "signoff" } + if {![info exists vars(initialized)]} { set vars(initialized) 0 } + if {![info exists vars(loaded)]} { set vars(loaded) 0 } + if {![info exists vars(bsteps)]} { set vars(bsteps) [list] } + if {![info exists env(VPATH)]} { set env(VPATH) make } + + # + # If no steps are defined, set the steps to execute based upon the + # mode that the system is running in. We need to do this because the + # hierarchical flow will unset the vars() array before recursively + # calling this routine. + # + + if {![info exists vars(steps)]} { + # BCL: Moved the following if / else up (it must always execute) + if {![info exists vars(mode)]} { + if {[info exists fargs(mode)]} { + set vars(mode) $fargs(mode) + } else { + set vars(mode) $dargs(mode) + } + } +# if {[info exists vars(hier)] && !$vars(hier)} { +# FF::set_steps $vars(mode) $format +# unset vars(mode) +# } else { +# FF::set_steps $vars(mode) $format +# } + } + + # + # Set the procedures that we will need to include within each file that + # we create to run a step. + # + +# set vars(required_procs) \ +# "source_plug get_clock_ports get_power_domains report_time" + + # + # Make sure that the variables are actually sourced from the + # configuration files + # + + if {!$vars(sourced) && ($step != "source")} { + execute_flow "source" $format $abort + } + + if {$vars(sourced)} { + if {[info exists vars(hier)] && !$vars(hier)} { + FF::set_steps $vars(mode) $format + unset vars(mode) + } else { + FF::set_steps $vars(mode) $format + } + } + # + # Execute the appropriate step per the command + # + + set action "" + switch -- $step { + "source" { + if {!$vars(sourced)} { + FF_EDI::source_config_files + if {[info exists fargs(version)]} { + if {![regexp "^10" $fargs(version)] && ![regexp "^9" $fargs(version)]} { + FF_EDI::denormalize_files + } + } elseif {[info exists dargs(version)]} { + if {![regexp "^10" $dargs(version)] && ![regexp "^9" $dargs(version)]} { + FF_EDI::denormalize_files + } + } + foreach arg [join $vars(arg_list)] { + if {[info exists vars($arg)]} { + if {[info exists fargs($arg)]} { + if {$vars($arg) != $fargs($arg)} { + puts " WARNING: Overwriting vars($arg) from $vars($arg) to $fargs($arg) ..." + } + set vars($arg) $fargs($arg) + } else { + # Only set the farg if it wasn't set in a config file + if {![info exists vars($arg)]} { + set vars($arg) $dargs($arg) + } + } + } else { + if {[info exists fargs($arg)]} { + set vars($arg) $fargs($arg) + } else { + set vars($arg) $dargs($arg) + } + } + } + FF_EDI::seed_variables +# FF_EDI::check_setup +# FF_EDI::normalize_files + set vars(sourced) true + set vars(top_cell) $vars(design) + } + } + "source_only" { + # BCL: Added this in since i want to source the variables w/out calling check_setup + if {!$vars(sourced)} { + FF_EDI::source_config_files + if {[info exists fargs(version)]} { + if {![regexp "^10" $fargs(version)] && ![regexp "^9" $fargs(version)]} { + FF_EDI::denormalize_files + } + } elseif {[info exists dargs(version)]} { + if {![regexp "^10" $dargs(version)] && ![regexp "^9" $dargs(version)]} { + FF_EDI::denormalize_files + } + } + foreach arg [join $vars(arg_list)] { + if {[info exists vars($arg)]} { + if {[info exists fargs($arg)]} { + if {$vars($arg) != $fargs($arg)} { + puts " WARNING: Overwriting vars($arg) from $vars($arg) to $fargs($arg) ..." + } + set vars($arg) $fargs($arg) + } else { + # Only set the farg if it wasn't set in a config file + if {![info exists vars($arg)]} { + set vars($arg) $dargs($arg) + } + } + } else { + if {[info exists fargs($arg)]} { + set vars($arg) $fargs($arg) + } else { + set vars($arg) $dargs($arg) + } + } + } + FF_EDI::seed_variables +# FF_EDI::check_setup +# FF_EDI::normalize_files +# set vars(sourced) true + set vars(top_cell) $vars(design) + } + } + "check" { + if {$abort == ""} { + set abort $vars(abort) + } + set save $vars(abort) + set vars(abort) $abort + set vars(abort) $save + if {![info exists vars(mode)]} { + if {[info exists fargs(mode)]} { + set vars(mode) $fargs(mode) + } else { + set vars(mode) $dargs(mode) + } + } + if {$vars(mode) == "hier"} { + if {![info exists vars(partition_list)]} { + puts " FLOW MODE $vars(mode) SELECTED BUT \$vars(partition_list) NOT DEFINED" + exit 99 + } + if {[file tail [file dirname [pwd]]] != "$vars(partition_dir)"} { + FF_EDI::check_setup + } + } else { + FF_EDI::check_setup + } + + FF::process_file_lists + } + + "all" { + + # + # We have already sourced in all of the files. Now execute the + # rest of the steps, including check + # + + puts "-------------------------------------------------" + puts " Generating scripts for $vars(design)" + puts "-------------------------------------------------" + execute_flow check $format $abort + # BCL: changed to file mkdir + file mkdir $vars(script_dir)/INNOVUS + + set vars(steps) [join $vars(steps)] + set vars(all) true + set commands "" + set top 0 + + if {$vars(mode) == "hier"} { + if {[file tail [file dirname [pwd]]] == "$vars(partition_dir)"} { + set all_steps $vars(fsteps) + } else { + set all_steps $vars(hsteps) + } + } else { + set fhr [open $vars(script_path)/INNOVUS/run_all.tcl r] + set fhw [open $vars(script_dir)/INNOVUS/run_all.tcl w] + while {[gets $fhr line]>=0} { + regsub "source FF" $line "source $vars(script_dir)" line + puts $fhw " $line" + } + close $fhr + close $fhw + set all_steps $vars(steps) + } + # + # Execute each step of the flow and get a composite list of the + # actual steps that had actions generated for them. Then create + # a Makefile for those steps + # + if {[info exists vars(rc_steps)]} { + set actions $vars(rc_steps) + } else { + set actions [list] + } + # + + foreach step $all_steps { + set commands [execute_flow $step $format $abort] + if {$commands != ""} { + lappend actions $commands + } + } + + if {($vars(user_mode) == "hier") && ($vars(hier_flow_type) == "2pass")} { + # Only generate steps up to (and including) cts for 2pass flows + # Go ahead and generate both Makefiles as the actions are known + if {$vars(enable_flexilm)} { + if {$vars(place_opt_design)} { +# if {[file tail [pwd]] == $vars(top_cell)} { +# set index [lsearch $actions "prects"] +# } else { + set index [lsearch $actions "place"] +# } + } else { + set index [lsearch $actions "prects"] + } +#puts "1: $actions : [lrange $actions [expr $index+1] end] ([pwd])" + FF::gen_makefile [lrange $actions [expr $index+1] end] $vars(mode) + file copy -force Makefile Makefile.pass2 + if {[llength [lrange $actions 0 $index]] != 0} { +#puts "2: $actions : [lrange $actions 0 $index] ([pwd])" + FF::gen_makefile [lrange $actions 0 $index] $vars(mode) + } + } else { + set index [lsearch $actions "cts"] +#puts "3: $actions : [lrange $actions [expr $index+1] end] ([pwd])" + FF::gen_makefile [lrange $actions [expr $index+1] end] $vars(mode) + if {$vars(mode) != "hier"} { + file copy -force Makefile Makefile.pass2 + } + if {[llength [lrange $actions 0 $index]] != 0} { +#puts "4: $actions : [lrange $actions 0 $index] ([pwd])" + FF::gen_makefile [lrange $actions 0 $index] $vars(mode) + } + } + } else { +#puts "5: $actions ([pwd])" + FF::gen_makefile $actions $vars(mode) + } + + if {$vars(enable_qor_check)} { + FF_EDI::gen_check + } + execute_flow debug $format $abort + if {[info exists vars(run_lec)] && $vars(run_lec)} { + execute_flow lec $format $abort + } + } + "lec" { +# puts "-------------------------------------------------" +# puts " Generating scripts for $vars(design)" + puts "-------------------------------------------------" + if {![info exists vars(netlist)]} { + puts " Cannot generate 'lec' step w/o verilog netlist defined" + } else { + # BCL: Changed to tcl file mkdir + file mkdir $vars(script_dir)/INNOVUS + set op [open $vars(script_dir)/INNOVUS/run_lec.tcl w] + puts $op "//" + puts $op "// Innovus Foundation Flow Code Generator, [exec date]" + puts $op "//" + if {$step == "lec"} { + puts $op "tclmode" + } + #puts $op "if {\[file exists .ff.tcl\]} {" + #puts $op " source .ff.tcl" + #puts $op "}" + set varsFile [FF::relPathTo [file normalize $vars(script_dir)/vars.tcl] [file normalize $vars(rundir)]] + puts $op "if {\[file exists $varsFile\]} {" + puts $op " source $varsFile" + puts $op "}" +# puts $op "source \$vars(script_dir)/procs.tcl" + if {![regexp syn_ $step]} { + puts $op "source $vars(script_dir)/procs.tcl" + } + puts " Generating step $step" + set commands [FF_EDI::run_lec] + puts $op [FF::pretty_print $commands $format] + close $op + } +# FF::gen_makefile lec $vars(mode) + } + "default" { + + # + # Run each step either singuarly or recursively + # + # + # Create the list of commands that happen at the begining of + # each script + # + + if {([lsearch $vars(steps) $step] == -1) && ($step != "debug")} { + puts " ERROR: Unknown Foundation Flow step \"$step\"." + exit 99 + } + +# if {([lsearch $vars(steps) $step] == -1) && ($step != "debug")} { +# puts " ERROR: Unknown Foundation Flow step \"$step\"." +# exit 99 +# } else { +# if {($vars(fix_hold) || (!$vars(fix_hold) && ![regexp "_hold" $step])) && +# !($vars(skip_cts) && (($step == "cts") || [regexp "postcts" $step]))} { +# puts " Generating step $step" +# } +# } + + # + # We need to ensure that we check the variable contents and + # initialize the flow at least once in a given run, no matter + # what step the user wants to execute + # + +# set header "\n#\n# Commands for $step\n#\n\n" + + if {![info exists vars(all)]} { + execute_flow check $format $abort + } + # BCL: Changed to tcl file mkdir + file mkdir $vars(script_dir)/INNOVUS + set commands "" +# set commands "post-10.10-b009\n" + if {!$vars(initialized)} { + set vars(step) $step + append commands [FF_EDI::initialize_flow] +# unset vars(step) + set vars(init_commands) $commands + set vars(initialized) 1 + if {![info exists vars(warning_count)]} { + set vars(warning_count) 0 + } + if {![info exists vars(error_count)]} { + set vars(error_count) 0 + } + } + + # + # Get the commands to execute the step. We also need to get the + # commands to load the database for that step, assuming that a + # database exists from a prior step. Those load commands are + # prepended to the execution commands. Save commands are + # appended + # + + if {[info commands ::FF_EDI::run_$step] ne ""} { + set temp_commands [FF_EDI::run_$step $format] + if {$temp_commands == ""} { + return "" + } else { + if {$vars(step) != "init"} { + set step_commands "\n#-------------------------------------------------------------\n" + if {$vars(report_run_time)} { + append step_commands "set vars(step) ${step}\n" + append step_commands "set vars(${step},start_time) \[clock seconds\]\n" + } + if {$vars(capture_metrics)} { + if {[lindex [split $vars(version) "."] 0] > 13} { +# append step_commands "um::enable_metrics -on\n" + # GG7 +# if {![info exists vars(pushed)] || ([info exists vars(pushed)] && !$vars(pushed)) } { + append step_commands "um::push_snapshot_stack\n" +# set vars(pushed) true +# } + } + } + append step_commands "#-------------------------------------------------------------\n\n" + } + append step_commands $temp_commands + append step_commands "#-------------------------------------------------------------\n\n" + puts " Generating step $step" + } + } elseif {[info exists vars(custom_step_dir)]} { + if {[file isfile $vars(custom_step_dir)/run_${step}.tcl]} { + puts " Generating step $step" + set fhr [open $vars(custom_step_dir)/run_$step.tcl r] + set step_commands "\n#-------------------------------------------------------------\n" + append step_commands "# Sourcing custom script ...\n" + append step_commands "#-------------------------------------------------------------\n" + if {$vars(report_run_time) && ($step != "init")} { + append step_commands "set vars(step) ${step}\n" + append step_commands "set vars(${step},start_time) \[clock seconds\]\n" + } + if {$vars(capture_metrics) && ($vars(step) != "init")} { + if {[lindex [split $vars(version) "."] 0] > 13} { + append step_commands "um::enable_metric -on\n" + append step_commands "um::push_snapshot_stack\n" + } + } + append step_commands "#-------------------------------------------------------------\n\n" + while {[gets $fhr line]>=0} { + append step_commands "$line\n" + } +# append step_commands "source $vars(custom_step_dir)/run_$step.tcl\n" + append step_commands "#-------------------------------------------------------------\n\n" + } else { + puts " ERROR: Unable to generate step $step" + set errors($vars(error_count)) "Unable to generate step $step - procedure 'run_$step' must be defined or a \$vars(custom_step_dir)/run_$step.tcl file must be provided" + incr vars(error_count) + return "" + } + } else { + puts " ERROR: Unable to generate step $step" + set errors($vars(error_count)) "Unable to generate step $step - procedure 'run_$step' must be defined or a \$vars(custom_step_dir)/run_$step.tcl file must be provided" + incr vars(error_count) + return "" + } +# set this_index [lsearch $vars(steps) $step] +# set prior [lindex $vars(steps) [expr $this_index - 1]] +## if {!$vars(fix_hold) && [regexp _hold $prior]} { +## set prior [lindex $vars(steps) [expr $this_index - 2]] +## if {[regexp _hold $prior]} { +## set prior [lindex $vars(steps) [expr $this_index - 3]] +## } +## } +# if {[regexp _hold $prior] && ([lsearch $vars(fix_hold) [regsub _hold $prior ""]]<0)} { +# set prior [lindex $vars(steps) [expr $this_index - 2]] +# if {[regexp _hold $prior] && ([lsearch $vars(fix_hold) [regsub _hold $prior ""]]<0)} { +# set prior [lindex $vars(steps) [expr $this_index - 3]] +# } +# } +# if {($step == "cts") && $vars(place_opt_design)} { +# set prior "place" +# } +# if {($step == "route") && $vars(skip_cts)} { +# set prior "prects" +# } +## if {($step == "route") && [regexp "^ccopt" [string tolower $vars(cts_engine)]]} { +## set prior "cts" +## } +# if {[regexp "^ccopt" [string tolower $vars(cts_engine)]]} { +# if {([string tolower $vars(fix_hold)] != "false")} { +# if {($step == "postcts_hold") && [lsearch $vars(fix_hold) $step]} { +# set prior cts +# } else { +# if {($step == "route")} { +# set prior cts +# } +# } +# } else { +# if {($step == "route")} { +# set prior cts +# } +# } +# } + + set this_index [lsearch [FF::adjust_steps] $step] + set prior [lindex [FF::adjust_steps] [expr $this_index - 1]] + set no_db_steps [list "init" "rebudget" "flexilm" "assemble" "assemble_flexilm" "debug"] + if {[info exists vars(use_flexmodels)] && $vars(use_flexmodels)} { + lappend no_db_steps "model_gen" + } else { + lappend no_db_steps "feedthrough" + } + if {([lsearch $no_db_steps $step] == -1) && ($prior != "")} { + set load_commands [FF_EDI::load_design $prior $step] +# set restore_commands [lindex [FF_EDI::load_design $format $prior] 1] + } else { + set load_commands "" +# set restore_commands "" + } + + if {!$vars(loaded)} { + set vars(loaded) 1 + append commands $load_commands + } + + # model_gen saves its database explicitly +# set no_save_steps [list "debug" "model_gen"] + set no_save_steps [list "debug"] + if {[lsearch $no_save_steps $step] == -1} { + set save_commands [FF_EDI::save_results $step $format] + } else { + set save_commands "" + } + + # + # Write the commands to a file, named for the step we are + # executing + # + + if {[regexp "^syn" $step]} { + file mkdir $vars(script_dir)/GENUS + set op [open $vars(script_dir)/GENUS/run_${step}.tcl w] + } else { + set op [open $vars(script_dir)/INNOVUS/run_${step}.tcl w] + } + + if {$vars(debug)} { +# puts " Opening file: $vars(script_dir)/INNOVUS/run_${step}.tcl in [exec pwd] -> $op" + } + + puts $op [string repeat "#" 68] + puts $op "# Innovus Foundation Flow Code Generator, [exec date]" + puts $op "# Version : 17.10-p003_1" + puts $op [string repeat "#" 68] + + if {[file tail [file dirname [pwd]]] != "$vars(partition_dir)"} { + set varsFile [FF::relPathTo [file normalize $vars(script_dir)/vars.tcl] [file normalize $vars(rundir)]] + } else { + set varsFile $vars(script_dir)/vars.tcl + } + puts $op "\nif {\[file exists $varsFile\]} {" + puts $op " source $varsFile" + puts $op "}" + #puts $op "if {\[file exists \$vars(script_dir)/vars.tcl\]} {" + #puts $op " source \$vars(script_dir)/vars.tcl" + #puts $op "}\n" + if {!$vars(freeze_vars)} { + if {([file tail [file dirname [pwd]]] != "$vars(partition_dir)") && ![regexp syn_ $step]} { + puts $op "foreach file \$vars(config_files) {" + puts $op " source \$file" + puts $op "}\n" + } + } +# puts $op "source \$vars(script_dir)/procs.tcl" + puts $op "source $vars(script_dir)/procs.tcl" + if {!$format} { + puts $op $header + } + regsub -all "init," $vars(init_commands) "$step," commands + set of [open $vars(script_dir)/INNOVUS/.head w] + puts $of [FF::pretty_print $vars(init_commands) $format] + close $of + append commands $load_commands $step_commands $save_commands + lappend vars(bsteps) $step + set of [open $vars(script_dir)/INNOVUS/.load_$step w] +# puts $of [FF::pretty_print $restore_commands $format] + puts $of [FF::pretty_print $load_commands $format] + close $of + set of [open $vars(script_dir)/INNOVUS/.$step w] + puts $of [FF::pretty_print $step_commands $format] + puts $of [FF::pretty_print $save_commands $format] + close $of +# if {[regexp "postroute_si" $step] && $skip_commands != ""} { +# set commands $skip_commands +# } + if {!$format} { + set commands [FF::strip_lines $commands [list "puts" "#"]] + } + if {$vars(catch_errors) && ($step != "debug")} { + puts $op "\nif { \[catch {\n" + puts $op [FF::pretty_print $commands $format] + puts $op "} step_error\]} {\n" + puts $op " Puts \" =========== STEP EXECUTION ERROR ============\"" + puts $op " Puts \" ERROR RUNNING STEP '$step'\"" + if {$vars(save_on_catch)} { + if {[regexp "^syn" $vars(step)]} { + puts $op " write_db $vars(design) -all_root_attributes -to_file $vars(dbs_dir)/$vars(step).catch.db\n" + } else { + puts $op " Puts \" ---------------------------------------------\"" + puts $op " Puts \" ... SAVING DESIGN TO $vars(dbs_dir)/$vars(step).catch.enc\"" + if {[string compare -nocase $vars(dbs_format) "oa"]==0} { + if {[lindex [split $vars(version) "."] 0] > 10} { + puts $op " saveDesign -cellview {$vars(oa_design_lib) $vars(design) $vars(step).catch}\n" + } else { + puts $op " saveOaDesign $vars(oa_design_lib) $vars(design) $vars(step).catch\n" + } + } else { + puts $op " saveDesign $vars(dbs_dir)/$vars(step).catch.enc -compress\n" + } + } + } + puts $op " Puts \" ---------------------------------------------\"" + puts $op " Puts \" \$step_error\"" + puts $op " Puts \" ------------------- DETAILS ------------------\"" + puts $op " Puts \" \$errorInfo\"" + puts $op " Puts \" ==============================================\"" + if {$vars(batch)} { +# if {$vars(exit_on_error)} { + puts $op " exit -1" +# } + } + puts $op "}" + } else { + puts $op [FF::pretty_print $commands $format] + } + if {$vars(batch) && ($step != "debug")} { + puts $op "if {!\[info exists vars(single)\]} {\n exit 0\n}\n" + } + close $op + set scommands [split $commands "\n"] + if $vars(generate_flow_steps) { + if {[regexp syn_ $step]} { + append vars(flow_steps) "\ncreate_flow_step -name $step \{\n" + } else { + append vars(flow_steps) "\ncreate_flow_step -name $step \{\n eval_legacy \{\n " + } + if {[info exists vars(hsteps)] && ([lsearch $vars(hsteps) $step] != -1)} { + append vars(flow_steps,hier) "\ncreate_flow_step -name $step \{\n eval_legacy \{\n " + } else { + if {[regexp syn_ $step]} { + append vars(flow_steps,flat) "\ncreate_flow_step -name $step \{\n" + } else { + append vars(flow_steps,flat) "\ncreate_flow_step -name $step \{\n eval_legacy \{\n " + } + } + set skip 0 + foreach line $scommands { + if {$skip != 0} { + set skip [expr $skip-1] + continue + } + if {[regexp ff_procs $line]} { continue } + if {[regexp "#" $line]} { continue } + if {[regexp "Puts" $line]} { continue } + if {[regexp "VPATH" $line]} { continue } + if {[regexp "set vars" $line] && ![regexp ",post_cts_sdc" $line]} { continue } + if {$step != "init"} { +# if {[regexp "restore_design" $line]} { set skip 7; continue } + if {!(($step == "cts") && $vars(enable_flexilm))} { + if {[regexp "restoreDesign" $line]} { continue } + } else { + if {[regexp "restoreDesign" $line]} { +# set line [string trim [lindex $line 2]] + set line "restoreDesign \[file tail \[pwd\]\]_postECO.enc.dat \[file tail \[pwd\]\]" + } + } + } else { + if {[regexp "restoreDesign" $line]} { + set line "restoreDesign . \[file tail \[pwd\]]" + } + } + if {[regexp "saveDesign" $line]} { continue } + if {[regexp "metric" $line]} { continue } + if {[regexp "snapshot" $line]} { continue } + if {[regexp "report_metric" $line]} { continue } + if {$line == ""} { continue } + append vars(flow_steps) "\t$line\n" + if {[info exists vars(hsteps)] && ([lsearch $vars(hsteps) $step] != -1)} { + append vars(flow_steps,hier) "\t$line\n" + } else { + append vars(flow_steps,flat) "\t$line\n" + } + } + append vars(flow_steps) "\}\n" + if {[info exists vars(hsteps)] && ([lsearch $vars(hsteps) $step] != -1)} { + append vars(flow_steps,hier) "\n \}\n" + if {$step == "partition"} { + foreach p $vars(partition_list) { +# append vars(flow_steps,hier) "\n schedule_flow -flow $p -dir $vars(partition_dir)/$p" + append vars(flow_steps,hier) "\n schedule_flow -flow block -dir $vars(partition_dir)/$p" + } + } + append vars(flow_steps,hier) "\n\}\n" + } else { + if {([file tail [file dirname [pwd]]] == "$vars(partition_dir)") && ($step == "signoff")} { + if {[lsearch $vars(partition_list) $vars(design)] == -1} { + append vars(flow_steps,flat) "\n \}\n" + append vars(flow_steps,flat) "\n schedule_flow -flow final_assembly" + append vars(flow_steps,flat) "\n\}\n" + } else { + append vars(flow_steps,flat) "\n \}\n" +# append vars(flow_steps,flat) "\n schedule_flow -flow $vars(top_cell) -dir $vars(partition_dir)/$vars(top_cell)" + append vars(flow_steps,flat) "\n schedule_flow -flow top -dir $vars(partition_dir)/$vars(top_cell)" + append vars(flow_steps,flat) "\n\}\n" + } + } else { + if {[regexp syn_ $step]} { + if {$vars(rc)} { + if {$vars(enable_rcp) && ($step == "syn_place")} { + append vars(flow_steps,flat) "\n schedule_flow -flow innovus -db \"$vars(dbs_dir)/syn_place/syn_place.novus_setup.tcl\"\n" + } elseif {!$vars(enable_rcp) && ($vars(step) == "syn_incr")} { + append vars(flow_steps,flat) "\n schedule_flow -flow innovus -db \"$vars(dbs_dir)/syn_incr/syn_incr.novus_setup.tcl\"\n" + } + } + append vars(flow_steps,flat) "\}\n" + } else { + append vars(flow_steps,flat) "\}\n\}\n" + } + } + } + } + + set action $step + + } + } + + # + # Create a file that sets up all of the variable settings that were + # used in this invocation + # + + # GDG - is this needed anymore + if {0} { + # BCL: Changed to tcl file mkdir + file mkdir $vars(script_dir) + set op [open $vars(script_dir)/vars.tcl w] + puts $op "# this is the one" + puts $op "if {!\[info exists vars\]} {" + puts $op " global vars" + puts $op "}" +# if {[info exists vars(user_arrays)]} { +# foreach array $vars(user_arrays) { +# puts $op "#----------------------------------------------" +# puts $op "global $array" +# set cmd "array names $array" +# set uvars [eval $cmd] +# foreach var $uvars { +# if {[regexp {\$} $vars($var)]} { +# puts $op "set $array($var) \"$$array($var)\"" +# } else { +# puts $op "set $array($var) \{$array($var)\}" +# } +# } +# } +# } + ## BCL: Added sourcing .ff.tcl to vars.tcl + #puts $op "if {\[file exists .ff.tcl\]} {" + #puts $op " source .ff.tcl" + #puts $op "}" + puts $op "global env\n\n" + puts $op "#----------------------------------------------" + puts $op "set env(VPATH) $env(VPATH)" + puts $op "set vars(rundir) $vars(rundir)" + foreach var [lsort [array names vars]] { + # BCL: Only write out variable values in curlies if not using $vars() in the value of the variable + if {[regexp {\$} $vars($var)]} { + puts $op "set vars($var) \"$vars($var)\"" + } else { + puts $op "set vars($var) \{$vars($var)\}" + } + } + puts $op "set vars(restore_design) {true}" +# if {[info exists vars(cpf_file)]} { +# puts $op "catch {alias ff_modify_power_domains FF_EDI::modify_power_domains}" +# puts $op "catch {alias ff_add_power_switches FF_EDI::add_power_switches}" +# puts $op "catch {alias ff_route_secondary_pg_nets FF_EDI::route_secondary_pg_nets}" +# puts $op "catch {alias ff_get_power_domains FF_EDI::get_power_domains}" +# puts $op "catch {alias ff_buffer_always_on_nets FF_EDI::buffer_always_on_nets}" +# puts $op "catch {alias ff_insert_welltaps_endcaps FF_EDI::insert_welltaps_endcaps}" +# } + close $op + } + + return $action + } + + proc insert_comments {} { + + global vars + + set comments "" + append comments "######################################################################\n" + append comments "# Variables affecting this step:\n" + append comments "#---------------------------------------------------------------------\n" + if {[info exists vars(comments)]} { + append comments $vars(comments) + unset vars(comments) + } else { + append comments "# No variables defined for this step ...\n" + } + append comments "######################################################################\n" + if {[info exists vars(ucomments)]} { + append comments "# Additional variables for this step:\n" + append comments "#---------------------------------------------------------------------\n" + append comments $vars(ucomments) + append comments "######################################################################\n" + unset vars(ucomments) + } + return $comments + } + +# proc run_all {} { +# +# global vars +# +# set time 0 +# set index 0 +# set stop_step signoff +# set vars(codegen) false +# if {![info exists vars(vpath)]} { set vars(vpath) make } +# +# foreach step $vars(steps) { +# if {[file exists $vars(vpath)/$step]} { +# if {[file mtime $vars(vpath)/$step] > $time} { +# if {[lindex $vars(steps) $index] == "signoff"} { +# Puts " STEP signoff COMPLETE ... NOTHING TO DO" +# } else { +# set start_step [lindex $vars(steps) [expr $index + 1]] +# } +# } +# } else { +# set start_step $step +# break +# } +# incr index +# } +# +# puts " -----------------------------------------------------" +# if {$start_step == $stop_step} { +# puts " RUNNING STEP $start_step ..." +# } else { +# puts " RUNNING STEP $start_step through $stop_step ..." +# } +# puts " -----------------------------------------------------" +# sleep 5 +# +# # +# # Emulate the functionality of the "make" program. If a file doesn't exist, +# # or if it's predecessor step has executed more recently, run the current +# # step and update the time/date stamps of the files we track progress with +# # +# +# set vars(stop_step) $stop_step +# +# set last_step "" +# set vars(restore_design) 1 +# if {$vars(enable_qor_check)} { +# set check_qor $vars(script_dir)/check_qor.tcl +# } +# exec mkdir -p make +# foreach step $vars(steps) { +# set vars(step) $step +# Puts " STEP $vars(step) ..." +# set this_semaphore "$vars(vpath)/$step" +# set last_semaphore "$vars(vpath)/$last_step" +# +# set run_step false +# if {![file exists $this_semaphore]} { +# set run_step true +# } elseif {$last_step != ""} { +# file stat $this_semaphore this_stat +# file stat $last_semaphore last_stat +# if {$this_stat(mtime) < $last_stat(mtime)} { +# set run_step true +# } +# } +# +# # +# # Check the quality of results from the last step. If the results aren't +# # as expected, don't proceed to the next step +# # +# if {$vars(enable_qor_check)} { +# if {$step != "init"} { +# set qor [catch {exec $check_qor $last_semaphore} msg] +# if {$qor} { +# puts " ERROR: QOR RESULT CHECK INDICATES A PROBLEM IN STEP $last_step" +# exit -111 +# } +# } +# } +# +# set last_step $step +# if {!$run_step} { +# continue +# } +# +# # +# # Source the control file that runs the step. If it had an error, exit +# # immediately. Otherwise, update the time/date stamp of the corresponding +# # +# # +# +# if {[catch {FF_EDI::run_$step} message]} { +# puts $message +# exit -111 +# } +# set vars(restore_design) 0 +# +# # +# # If there is a QOR check file for this step, execute it and place the +# # result into the make file. Otherwise just touch the file +# # +# +# if {$vars(enable_qor_check)} { +# if {[info exists vars($step,qor_tcl]} { +# set qor_file $vars($step,qor_tcl) +# if {[file exists $qor_file]} { +# set qor [catch {exec $qor_file} msg] +# set make_file [open $this_semaphore w] +# puts $make_file "$qor" +# close $make_file +# } +# } +# } +# exec /bin/touch $this_semaphore +# +# if {$step == $stop_step} { +# Puts " Done" +# } +# } +# } + + proc load_power_intent {} { + + global vars + + set commands "" + + if {[info exists vars(cpf_file)]} { + set command "loadCPF $vars(cpf_file)\n" + append commands [FF::wrap_command $vars(step),load_cpf $command] + set command "commitCPF" + if {$vars(cpf_keep_rows)} { + append command " -keepRows" + } + if {$vars(cpf_power_domain)} { + append command " -powerDomain" + } + if {$vars(cpf_isolation)} { + append command " -isolation" + } + if {$vars(cpf_state_retention)} { + append command " -state_retention" + } + if {$vars(cpf_level_shifter)} { + append command " -level_shifter" + } + if {$vars(cpf_power_switch)} { + append command " -power_switch" + } + append command "\n" + append commands [FF::wrap_command $vars(step),commit_cpf $command] + append comments "# - vars(cpf_file)\n" + append comments "# - vars(cpf_isolation)\n" + append comments "# - vars(cpf_state_retention)\n" + append comments "# - vars(cpf_level_shifter)\n" + append comments "# - vars(cpf_power_switch)\n" + append comments "# - vars(cpf_power_domain)\n" + append comments "# - vars(cpf_keep_rows)\n" + } elseif {[info exists vars(ieee1801_file)]} { + set command "read_power_intent $vars(ieee1801_file) -1801\n" + append commands [FF::wrap_command $vars(step),load_ieee1801 $command] + set command "commit_power_intent" + if {$vars(ieee1801_keep_rows)} { + append command " -keepRows" + } + if {$vars(ieee1801_power_domain)} { + append command " -power_domain" + } + if {$vars(ieee1801_isolation)} { + append command " -isolation" + } + if {$vars(ieee1801_state_retention)} { + append command " -state_retention" + } + if {$vars(ieee1801_level_shifter)} { + append command " -level_shifter" + } + if {$vars(ieee1801_power_switch)} { + append command " -power_switch" + } + append command "\n" + append commands [FF::wrap_command $vars(step),commit_ieee1801 $command] + append comments "# - vars(ieee1801_file)\n" + append comments "# - vars(ieee1801_isolation)\n" + append comments "# - vars(ieee1801_state_retention)\n" + append comments "# - vars(ieee1801_level_shifter)\n" + append comments "# - vars(ieee1801_power_switch)\n" + append comments "# - vars(ieee1801_power_domain)\n" + append comments "# - vars(ieee1801_keep_rows)\n" + } else { + append ucomments "# - vars(cpf_file)\n" + append ucomments "# - vars(cpf_isolation)\n" + append ucomments "# - vars(cpf_state_retention)\n" + append ucomments "# - vars(cpf_level_shifter)\n" + append ucomments "# - vars(cpf_power_switch)\n" + append ucomments "# - vars(cpf_power_domain)\n" + append ucomments "# - vars(cpf_keep_rows)\n" + } + return $commands + } + + proc set_design_mode {} { + + global vars + + set commands "" + set comments "" + set ucomments "" + + set process [regsub "nm" $vars(process) ""] + append comments "# - vars(process)\n" + if {[lindex [split $vars(version) "."] 0] < 15} { + if {$vars(high_timing_effort)} { + append comments "# - vars(high_timing_effort)\n" + if {![regexp "9.1" $vars(version)]} { + set command "setDesignMode -process $process -flowEffort high\n" + } else { + set command "setDesignMode -process $process\n" + } + } else { + set command "setDesignMode -process $process\n" + } + } else { + if {[string tolower $vars(flow_effort)] != "standard"} { + set command "setDesignMode -process $process -flowEffort [string tolower $vars(flow_effort)]" + append comments "# - vars(flow_effort)\n" + } else { + set command "setDesignMode -process $process" + } + if {$vars(power_effort) != "none"} { + append comments "# - vars(power_effort)\n" + append command " -powerEffort $vars(power_effort)" + } else { + append ucomments "# - vars(power_effort) \"low or high\"\n" + } + } +# uplevel #0 append commands [FF::wrap_command $vars(step),set_design_mode "$command\n"] + append commands [FF::wrap_command $vars(step),set_design_mode "$command\n"] + + return [list $commands $comments $ucomments] + } + + #--------------------------------------------------------------------------------------------------- + # This script will prepare a digital block for LVS. It can be added to the FF by adding the tag: + # + # set vars(signoff,save_design,post_tcl) /createSymbolAndCDF.tcl + # + # Note, it must be run after the design is saved in the signoff step. + # + # The script does the following: + # + # 1) Creates the SKILL script: ggCreateSymbolAndCDF.il + # + # When this script is called by Virtuoso (later in the flow), it will perform + # the following: + # + # -copy view: signoff + # to: layout + # + # -Remaster the instances of the view "layout" to reference 'layout' views + # rather than 'abstract' views + # + # -Create ihdl parameter and command files which are used by verilogIn + # + # -Create a verilog stub file from the physical netlist + # + # -Run ihdl (verilogIn) on the stub file to create the 'symbol' view + # + # -Copy the symbol view to create the auCdl view + # + # -Use either v2cdl or v2lvs to convert the verilog netlist to CDL + # and store it in the auCdl view + # + # -Create the base level CDF to support auCdl netlisting + # + # + # 2) Saves a physical netlist that excludes filler cells. This will be used later + # to create the CDL view. + # + # 3) Creates the .simrc file used by ihdl. + # + # 4) Creates the SKILL script: PostProcessInVirtuoso.il. + # + # This script reads/executes the script ggCreateSymbolAndCDF.il. + # + # + # 5) If Virtuoso is in the user's path, it will execute the script: + # + # PostProcessInVirtuoso.il + # + # + # + # Created by: Bill Wareham 01/26/2015 + # Vikram Agarwal + # Greg Gorton + # + #--------------------------------------------------------------------------------------------------- + + proc create_lvs_data {} { + + global vars + global infos + global warnings + + # Create the ggCreateSymbolAndCDF.il skill code + + set infos($vars(info_count)) "Created the $vars(script_dir)/ggCreateSymbolAndSDF.il SKILL script\n" + incr vars(info_count) + set op [open $vars(script_dir)/ggCreateSymbolAndCDF.il w] + puts $op ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + puts $op ";;;" + puts $op ";;; Function: ggCreateSymbolAndCDF - performs several functions to prepare a digital" + puts $op ";;; block saved from Innovus in OA for follow on integration in a top level Virtuoso" + puts $op ";;; schematic to support PVS LVS." + puts $op ";;;" + puts $op ";;; Inputs:" + puts $op ";;; library : Name of the library with the digital block" + puts $op ";;; cellName : Name of the digital block" + puts $op ";;; viewName : Name of the digital block unremastered layout view" + puts $op ";;; verilogFile : Name of the verilog netlist" + puts $op ";;; overwrite : Overwrite existing library" + puts $op ";;;" + puts $op ";;; Outputs:" + puts $op ";;; layout view : \"layout\" view with abstracts remastered to type layout" + puts $op ";;; symbol view : \"symbol\" view with pins to match verilogFil" + puts $op ";;; auCdl view : copy of symbol view for cdl netlisting stop and view lists" + puts $op ";;; auCdl CDF : base CDF auCdl simulation properties for netlisting" + puts $op ";;;" + puts $op ";;; ggCreateSymbolAndCDF(\"libname\" \"cellName\" \"viewName\" \"/path_to_file/myname.v\")" + puts $op ";;;" + puts $op ";;; Notes:" + puts $op ";;;" + puts $op ";;; The input layout file from Innovus on OA created with the following comnmand:" + puts $op ";;; saveDesign -cellview { library cellName viewName }" + puts $op ";;; Used viewName \"edi_routed\" to signify routed design from EDI." + puts $op ";;; This file can be used to restore design in Innovus. You can also run oaOut" + puts $op ";;; from Innovus and have it create a layout view with the abstracts remastered." + puts $op ";;; This script will take care of this step in Virtuoso so you don't have to run" + puts $op ";;; the second save from Innovus." + puts $op ";;;" + puts $op ";;; The verilogFile was created from Innovus using the following command:" + puts $op ";;; saveNetlist myname.v -excludeLeafCell -phys -excludeCellInst \"FILL1 ...\"" + puts $op ";;; Used \"cellName_phys_nofill.v\" as an example." + puts $op ";;; This creates a physical verilog netlist with power and ground pins, excludes" + puts $op ";;; leaf cells (standard cells) and removes the FILL cells listed." + puts $op ";;;" + puts $op ";;; The script is written to accept the inputs from the command line. This can be" + puts $op ";;; modified to pull from the active window and/or a form." + puts $op ";;;" + puts $op ";;; The layout saved from Innovus should be named something other than \"layout\". It is" + puts $op ";;; assumed that all the instances are of type \"abstract\" and need to be remastered" + puts $op ";;; to type \"layout\". To change the default name for the remastered layout view from" + puts $op ";;; \"layout\", change the \"newView\" variable." + puts $op ";;;" + puts $op ";;; The symbol view is created using VerilogIn. The physical Verilog netlist from EDI" + puts $op ";;; is parsed and a temporary netlist created that only has the module and pins" + puts $op ";;; defined for the digital block \"cellName\". The regular expression checks to start" + puts $op ";;; and stop the parsing of the input verilog netlist to just extract the pin" + puts $op ";;; definitions is basic and specific to the syntax seen in a couple examples from" + puts $op ";;; EDI. See comments in the \"Creating /tmp/ihdl_verilog.v\" section for details." + puts $op ";;;" + puts $op ";;; Two log files are created during VerilogIn:" + puts $op ";;; VerilogIn.log" + puts $op ";;; VerilogIn_stdout.log" + puts $op ";;;" + puts $op ";;; The default is to overwrite the existing symbol during VerilogIn if it was" + puts $op ";;; previously created by VerilogIn \"overwrite_symbol := 1\". To not overwrite the" + puts $op ";;; symbol, regardless of the source set it to \"overwrite_symbol := 0\"." + puts $op ";;;" + puts $op ";;; VerilogIn is run via the unix command line using ihdl. The ihdl input files are" + puts $op ";;; created in /tmp." + puts $op ";;;" + puts $op ";;; See \"Verilog In for Virtuoso Design Environment User Guide and Reference\"." + puts $op ";;;" + puts $op ";;; The auCdl view is just a copy of the symbol view created by VerilogIn." + puts $op ";;;" + puts $op ";;; The CDF auCdl simulation parameters are created at the \"base\" cell level to" + puts $op ";;; enable cdl netlisting of just the subckt name and pins. When running LVS the" + puts $op ";;; associated Verilog netlist and IP cdl views should be included." + puts $op ";;; " + puts $op ";;; Written by: Greg Gorton, 5/18/14" + puts $op ";;;" + puts $op ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + puts $op "" + puts $op "procedure(ggCreateSymbolAndCDF(library cellName viewName verilogFile @optional (overwrite nil))" + puts $op "" + puts $op " prog( (cv newView cv2 ihs startString printModule cv3 cv4 cid cdlpath portorder OUTFILE INFILE baseCDFid nextLine)" + puts $op "" + puts $op " ; view name to use for copy of saved Innovus layout view that needs to be remastered" + puts $op " newView=\"layout\"" + puts $op "" + puts $op " ; Get library cell and view from the active window" + puts $op " ; Add cw to the let statement" + puts $op " ; cw=hiGetCurrentWindow()" + puts $op " ; cv=cw->cellView" + puts $op " ; library=cv->libName" + puts $op " ; cellName=cv->cellName" + puts $op " ; viewName=cv->viewName" + puts $op " ; verilogFile=\"./SCRIPT/countersTest.v\"" + puts $op "" + puts $op " ; Verify the existance of the input parameters" + puts $op " unless(isFile(verilogFile)" + puts $op " printf(\"The verilog file %s does not exist.\\n\" verilogFile)" + puts $op " printf(\"Please fix and run again.\\n\")" + puts $op " return()" + puts $op " )" + puts $op " unless(cv=dbOpenCellViewByType( library cellName viewName )" + puts $op " printf(\"The %s %s %s cell view does not exist.\\n\" library cellName viewName)" + puts $op " printf(\"Please fix and run again.\\n\")" + puts $op " return()" + puts $op " )" + puts $op "" + puts $op " ; Copy present view to a layout view (or value defined by parameter newView)" + puts $op " printf(\" Running ggCreateSymbolAndCDF:\\n\")" + puts $op " printf(\" Copy %s %s %s to %s %s %s.\\n\" library cellName viewName library cellName newView)" + puts $op " unless(dbCopyCellView(cv library cellName newView nil nil overwrite)" + puts $op " printf(\"Can't create the new %s view.\\n\" newView)" + puts $op " printf(\"Please use the overwrite parameter: ggCreateSymbolAndCDF(lib cell view verilogfile t) and check permissions.\\n\")" + puts $op " return()" + puts $op " )" + puts $op "" + puts $op " ; Remaster instances from type abstract to layout in the layout view" + puts $op " cv2=dbOpenCellViewByType( library cellName newView \"maskLayout\" \"a\")" + puts $op " printf(\" Open %s %s %s for edit.\\n\" library cellName newView)" + puts $op "" + puts $op " ihs=setof(ih cv2~>instHeaders ih~>viewName==\"abstract\")" + puts $op " foreach(ih ihs" + puts $op " when(ddGetObj(ih~>libName ih~>cellName \"layout\" )" + puts $op " ih~>master = dbOpenCellViewByType( ih~>libName ih~>cellName \"layout\" )" + puts $op " )" + puts $op " )" + puts $op "" + puts $op " dbSave(cv2)" + puts $op " dbClose(cv2)" + puts $op "" + puts $op " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + puts $op " ; Use verilogIn to create a symbol" + puts $op " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + puts $op " printf(\" Running VerilogIn to create the %s %s symbol view.\\n\" library cellName)" + puts $op "" + puts $op " ; Create the ihdl command file in /tmp" + puts $op " printf(\" Creating /tmp/ihdl_files_%s\\n\" cellName)" + puts $op " OUTFILE=outfile(strcat(\"/tmp/ihdl_files_\" cellName))" + puts $op " fprintf( OUTFILE \"-param /tmp/ihdl_params_%s\\n\" cellName)" + puts $op " fprintf( OUTFILE \"-cdslib ./cds.lib\\n\")" + puts $op " close(OUTFILE)" + puts $op " OUTFILE=nil" + puts $op "" + puts $op " ; Create the ihdl parameters file in /tmp" + puts $op " ; Need to set power and ground nets to a name not used in the input" + puts $op " ; verilog netlist or the power and ground pins will be changed to" + puts $op " ; global names on the symbol pins." + puts $op " printf(\" Creating /tmp/ihdl_params_%s\\n\" cellName)" + puts $op " OUTFILE=outfile(strcat(\"/tmp/ihdl_params_\" cellName))" + puts $op " fprintf( OUTFILE \"dest_sch_lib := %s\\n\" library)" + puts $op " fprintf( OUTFILE \"ref_lib_list := basic\\n\")" + puts $op " fprintf( OUTFILE \"structural_views := 4\\n\")" + puts $op " fprintf( OUTFILE \"functional_view_name := functional_toponly\\n\")" + puts $op " fprintf( OUTFILE \"symbol_view_name := symbol\\n\")" + puts $op " fprintf( OUTFILE \"overwrite_symbol := 1\\n\")" + puts $op " fprintf( OUTFILE \"power_net := Pxx_dummyValue\\n\")" + puts $op " fprintf( OUTFILE \"ground_net := Gxx_dummyValue\\n\")" + puts $op " fprintf( OUTFILE \"log_file_name := ./VerilogIn.log\\n\")" + puts $op " close(OUTFILE)" + puts $op " OUTFILE=nil" + puts $op "" + puts $op " ; Parse the Verilog file from Innovus and create a Verilog file with just the" + puts $op " ; top module definition for \"cellName\" with only the pins define." + puts $op " ; The regular expression checks to start and stop printing the Verilog" + puts $op " ; module are simple and tied to the syntax from EDI. It starts on the exact" + puts $op " ; string \"module cellName\" where cellName is your cellName. It stops at the" + puts $op " ; first comment line which has been \"// Internal wires\" or" + puts $op " ; \"// Module instantiations\" in my examples. These come after the pin" + puts $op " ; definitions." + puts $op " printf(\" Creating /tmp/ihdl_verilog_%s.v\\n\" cellName)" + puts $op " INFILE=infile(verilogFile)" + puts $op " OUTFILE=outfile(sprintf(nil \"/tmp/ihdl_verilog_%s.v\" cellName))" + puts $op " startString=buildString( list(\"module\" cellName) )" + puts $op " printModule=\"no\"" + puts $op " when( INFILE" + puts $op " while( gets(nextLine INFILE)" + puts $op " if((rexMatchp(startString nextLine) || printModule==\"yes\") then" + puts $op " if(rexMatchp(\"//\" nextLine) then" + puts $op " printModule=\"no\"" + puts $op " fprintf(OUTFILE \"endmodule\\n\")" + puts $op " else" + puts $op " printModule=\"yes\"" + puts $op " fprintf(OUTFILE nextLine)" + puts $op " )" + puts $op " ) ; if module cellName" + puts $op " ) ; while nextLine" + puts $op " close(INFILE)" + puts $op " ) ; when INFILE" + puts $op " close(OUTFILE)" + puts $op " OUTFILE=nil" + puts $op "" + puts $op " ; Run ihdl to create the symbol view and temporary functional view." + puts $op " ; Function will overwrite existing symbol view if previously created by VerilogIn." + puts $op " printf(\" Running ihdl -f /tmp/ihdl_files_%s /tmp/ihdl_verilog_%s.v >& VerilogIn_stdout_%s.log\\n\" cellName cellName cellName)" + puts $op " system(sprintf(nil \"ihdl -f /tmp/ihdl_files_%s /tmp/ihdl_verilog_%s.v >& VerilogIn_stdout_%s.log\" cellName cellName cellName ))" + puts $op "" + puts $op " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + puts $op " ; Copy the symbol view to an auCdl view" + puts $op " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + puts $op "" + puts $op " printf(\" Copy %s %s symbol to %s %s auCdl.\\n\" library cellName library cellName)" + puts $op " newView=\"auCdl\"" + puts $op " cv3=dbOpenCellViewByType( library cellName \"symbol\")" + puts $op " cv4=dbCopyCellView( cv3 library cellName newView nil nil overwrite)" + puts $op " dbCreateProp(cv4 \"CDL_NETLIST_FILE\" 'string \"cdl.netlist\")" + puts $op " portorder = cv4~>portOrder" + puts $op " dbClose(cv3)" + puts $op " dbSave(cv4)" + puts $op " dbClose(cv4)" + puts $op "" + puts $op " ;Convert the verilog netlist to cdl netlist and store it in the auCdl cellview." + puts $op " cdlpath = ddGetObjReadPath(ddGetObj( library cellName newView ))" + puts $op "" + puts $op " let((paths)" + puts $op " paths = parseString(getShellEnvVar(\"PATH\") \":\")" + puts $op " if( isFileName(\"v2cdl\" paths) then" + puts $op " system(sprintf(nil \"v2cdl -v %s -o %s/cdl.netlist -a \\\"\<\>\\\" \>\& v2cdl.log\" verilogFile cdlpath))" + puts $op " else" + puts $op " if( isFileName(\"v2lvs\" paths) then" + puts $op " system(sprintf(nil \"v2lvs -v %s -o %s/cdl.netlist -a \\\"\<\>\\\" \>\& v2cdl.log\" verilogFile cdlpath))" + puts $op " else" + puts $op " printf(\" ERROR: Unable to find Verilog -> CDL translator!!!\\n\")" + puts $op " printf(\" Neither v2cdl nor v2lvs were found in your path.\\n\\n\\n\")" + puts $op " )" + puts $op " )" + puts $op "" + puts $op " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + puts $op " ; Create the base level CDF for auCdl netlisting" + puts $op " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + puts $op " ; The subckt of the top module is netlisted. When running PVS LVS include" + puts $op " ; the top level Verilog netlist and associated IP cdl netlists." + puts $op " printf(\" Create Base level CDF for %s %s to support cdl netlisting.\\n\" library cellName)" + puts $op " cid=ddGetObj(library cellName)" + puts $op " unless(baseCDFid=cdfGetBaseCellCDF(cid)" + puts $op " baseCDFid=cdfCreateBaseCellCDF(cid)" + puts $op " baseCDFid->simInfo = list( nil )" + puts $op " baseCDFid->simInfo->auCdl = '(nil)" + puts $op " )" + puts $op " baseCDFid->simInfo->auCdl->netlistProcedure=\"ansCdlSubcktCall\"" + puts $op " baseCDFid->simInfo->auCdl->namePrefix=\"X\"" + puts $op " baseCDFid->simInfo->auCdl->componentName=\"subcircuit\"" + puts $op " baseCDFid->simInfo->auCdl->termOrder=portorder" + puts $op " ;baseCDFid->simInfo->auCdl->modelName=\"counters\"" + puts $op " cdfSaveCDF(baseCDFid)" + puts $op "" + puts $op " ) ; prog" + puts $op "" + puts $op ") ; procedure ggCreateSymbolAndCDF()" + close $op + + set commands "" + + set netlist $vars(dbs_dir)/$vars(design)_phys_nofill.v + + # Create the netlist + #----------------------------------------------------------------------------------------------- + append commands "saveNetlist $netlist -excludeLeafCell -phys -excludeCellInst \[dbGet -u -e top.physInsts.cell.name\]\n" + + # Create the .simrc file + #----------------------------------------------------------------------------------------------- + set op [open .simrc w] + puts $op "auCdlEnableNetlistInclusion=t" + puts $op "auCdlCDFPinCntrl=t" + close $op + + # Create the Virtuoso replay file + #----------------------------------------------------------------------------------------------- + set op [open $vars(script_dir)/PostProcessInVirtuoso.il w] + puts $op "load(\"$vars(script_dir)/ggCreateSymbolAndCDF.il\")" + puts $op "ggCreateSymbolAndCDF(\"$vars(oa_design_lib)\" \"$vars(design)\" \"signoff\" \"$netlist\" t)" + puts $op "exit()" + close $op + + # Call Virtuoso + #----------------------------------------------------------------------------------------------- + if ![string match [auto_execok virtuoso] ""] { + append commands "\nexec virtuoso -replay $vars(script_dir)/PostProcessInVirtuoso.il -nograph -log $vars(log_dir)/PostProcessInVirtuoso.log\n" + return $commands + } else { + set warnings($vars(warning_count)) "Unable to find Virtuoso executable! The remastered layout view, symbol, auCdl views and auCdl CDF will not be created" + incr vars(warning_count) + return $commands + } + } + +} diff --git a/sky130_cds/pnr/SCRIPTS/INNOVUS/run_all.tcl b/sky130_cds/pnr/SCRIPTS/INNOVUS/run_all.tcl new file mode 100755 index 000000000..2bea19e1f --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/INNOVUS/run_all.tcl @@ -0,0 +1,184 @@ +#!/usr/bin/env tclsh +# -*-TCL-*- +# +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +source FF/vars.tcl + +if {![info exists env(VPATH)]} { + set env(VPATH) "make" +} + +if {[info exists env(FF_START)]} { + if {[file exists $env(VPATH)/$env(FF_START)]} { + exec rm $env(VPATH)/$env(FF_START) + } + set start_step $env(FF_START) +} else { + set start_step init +} +if {[info exists env(FF_STOP)]} { + set stop_step $env(FF_STOP) +} else { + set stop_step signoff +} + +# +# Start with all possible steps in the flow that we can execute. Then find +# the subset of steps that we generated a Tcl control file for +# + +set vars(single) true + +set found_steps [list] +foreach step $vars(bsteps) { + set run_file($step) "$vars(script_dir)/INNOVUS/run_$step.tcl" + if {[file exists $run_file($step)]} { + lappend found_steps $step + } +} +#set steps $found_steps + +set time 0 +set index 0 +foreach step $found_steps { + if {[file exists $env(VPATH)/$step]} { + if {[file mtime $env(VPATH)/$step] > $time} { + if {[lindex $found_steps $index] == "signoff"} { + puts " STEP signoff COMPLETE ... NOTHING TO DO" + exit + } else { + set start_step [lindex $found_steps [expr $index + 1]] + } + } + } else { + set start_step $step + break + } + incr index +} + +puts " -----------------------------------------------------" +if {$start_step == $stop_step} { + puts " RUNNING STEP $start_step ..." +} else { + puts " RUNNING STEP $start_step through $stop_step ..." +} +puts " -----------------------------------------------------" +sleep 5 + +# +# Emulate the functionality of the "make" program. If a file doesn't exist, +# or if it's predecessor step has executed more recently, run the current +# step and update the time/date stamps of the files we track progress with +# + +set vars(stop_step) $stop_step + +set last_step "" +set vars(single) 1 +if {$vars(enable_qor_check)} { + set check_qor $vars(script_dir)/check_qor.tcl +} +exec mkdir -p make +foreach step $found_steps { + set vars(step) $step + puts " STEP $vars(step) ..." + set this_semaphore "$env(VPATH)/$step" + set last_semaphore "$env(VPATH)/$last_step" + + set run_step false + if {![file exists $this_semaphore]} { + set run_step true + } elseif {$last_step != ""} { + file stat $this_semaphore this_stat + file stat $last_semaphore last_stat + if {$this_stat(mtime) < $last_stat(mtime)} { + set run_step true + } + } + + # + # Check the quality of results from the last step. If the results aren't + # as expected, don't proceed to the next step + # + if {$vars(enable_qor_check)} { + if {$step != "init"} { + set qor [catch {exec $check_qor $last_semaphore} msg] + if {$qor} { + puts " ERROR: QOR RESULT CHECK INDICATES A PROBLEM IN STEP $last_step" + exit -111 + } + } + } + + set last_step $step + if {!$run_step} { + continue + } + + # + # Source the control file that runs the step. If it had an error, exit + # immediately. Otherwise, update the time/date stamp of the corresponding + # + # + + if {[catch {source $run_file($step)} message]} { + puts $message + exit -111 + } + + # + # If there is a QOR check file for this step, execute it and place the + # result into the make file. Otherwise just touch the file + # + + if {$vars(enable_qor_check)} { + if {[info exists vars($step,qor_tcl]} { + set qor_file $vars($step,qor_tcl) + if {[file exists $qor_file]} { + set qor [catch {exec $qor_file} msg] + set make_file [open $this_semaphore w] + puts $make_file "$qor" + close $make_file + } + } + } + exec /bin/touch $this_semaphore + + if {$step == $stop_step} { + exit + } +} diff --git a/sky130_cds/pnr/SCRIPTS/INNOVUS/run_debug.tcl b/sky130_cds/pnr/SCRIPTS/INNOVUS/run_debug.tcl new file mode 100755 index 000000000..51cb1a22a --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/INNOVUS/run_debug.tcl @@ -0,0 +1,86 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +set vars(step) debug + +############################################################################### +# Source script to define design specific variables +############################################################################### +if {[info exists env(FF_SETUP_PATH)]} { + if {[file exists $env(FF_SETUP_PATH)]} { + Puts " LOADING $env(FF_SETUP_PATH)/setup.tcl ..." + if { [ catch { source $env(FF_SETUP_PATH)/setup.tcl} setup_error ] } { + Puts " ============= SETUP ERROR ==================" + Puts " $errorInfo" + Puts " $setup_error" + Puts " ==============================================" + set return_code 99 + exit $return_code + } + } else { + Puts " ERROR: $env(FF_SETUP_PATH)/setup.tcl does not exist" + exit + } +} else { + if {[file exists setup.tcl]} { + Puts " LOADING setup.tcl ..." + if { [ catch { source setup.tcl} setup_error ] } { + Puts " ============= SETUP ERROR ==================" + Puts " $errorInfo" + Puts " $setup_error" + Puts " ==============================================" + set return_code 99 + exit $return_code + } + } else { + Puts " ERROR: setup.tcl does not exist" + exit + } +} + +source $vars(script_root)/EDI/procs.tcl +source $vars(script_root)/ETC/utils.tcl + +::FF_EDI::initialize_flow + +if {[info exists env(STEP)]} { + ::FF_EDI::load_design 0 $env(STEP) +} + +############################################################################### +# Load "always source" plug-in script +############################################################################### +::FF::source_plug always_source_tcl + +win diff --git a/sky130_cds/pnr/SCRIPTS/INNOVUS/run_lec.tcl b/sky130_cds/pnr/SCRIPTS/INNOVUS/run_lec.tcl new file mode 100755 index 000000000..58273c736 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/INNOVUS/run_lec.tcl @@ -0,0 +1,139 @@ +//############################################################################## +// CADENCE COPYRIGHT NOTICE +// © 2008-2009 Cadence Design Systems, Inc. All rights reserved. +//------------------------------------------------------------------------------ +// +// This Foundation Flow is provided as an example of how to perform specialized +// tasks within Innovus System. +// +// This work may not be copied, re-published, uploaded, or distributed in any way, +// in any medium, whether in whole or in part, without prior written permission +// from Cadence. Notwithstanding any restrictions herein, subject to compliance +// with the terms and conditions of the Cadence software license agreement under +// which this material was provided, this material may be copied and internally +// distributed solely for internal purposes for use with Cadence tools. +// +// This work is Cadence intellectual property and may under no circumstances be +// given to third parties, neither in original nor in modified versions, without +// explicit written permission from Cadence. The information contained herein is +// the proprietary and confidential information of Cadence or its licensors, and +// is supplied subject to, and may be used only by Cadence's current customers +// in accordance with, a previously executed license agreement between Cadence +// and its customer. +// +//------------------------------------------------------------------------------ +// THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +// OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//############################################################################## + +vpxmode +set dofile abort exit +set undefined cell black_box -noascend -both +tclmode +// setup variables +global vars +proc Puts {args} { + puts $args +} +//############################################################################## +// Source script to define design specific variables +//############################################################################## +if {[info exists env(FF_SETUP_PATH)]} { + if {[file exists $env(FF_SETUP_PATH)]} { + Puts " LOADING $env(FF_SETUP_PATH)/setup.tcl ..." + catch {source $env(FF_SETUP_PATH)/setup.tcl} + } else { + Puts " ERROR: $env(FF_SETUP_PATH)/setup.tcl does not exist" + exit + } +} else { + if {[file exists setup.tcl]} { + catch {source setup.tcl} + } else { + Puts " ERROR: setup.tcl does not exist" + exit + } +} + +//Define the netlist to be verify +if {[info exists env(STEP)] && [file exists DBS/$env(STEP).enc.dat/$vars(design).v.gz]} { + set revisedNetlist DBS/$env(STEP).enc.dat/$vars(design).v.gz +} else { + Puts " Failed to find netlist DBS/$env(STEP).enc.dat/$vars(design).v.gz" +} + +set rc [catch {source $vars(script_root)/ETC/utils.tcl}] +if {[info exists vars(threads)]} { + vpx set compare option -threads $vars(threads) +} + + +// read Liberty cell definitions +set libSet $vars($vars($vars(default_setup_view),delay_corner),library_set) +vpx read library -statetable -both -liberty $vars(${libSet},timing) + +// read reference netlist +vpx read design -verilog -sensitive -golden $vars(netlist) + +// read post-implementation netlist +vpx read design -verilog -sensitive -revised $revisedNetlist + +//set top level +vpx set root module $vars(design) -both + +ff_source_plug pre_lec_check_tcl + +vpxmode +report design data +report black box + +set mapping method -name first +set flatten model -seq_constant -seq_constant_x_to 0 +set flatten model -nodff_to_dlat_zero -nodff_to_dlat_feedback +set flatten model -gated_clock + +set system mode lec +add compare point -all +compare -gate_to_gate +usage +// vpx report compare data +report compare data -class nonequivalent -class abort -class notcompared +report verification -verbose +report statistics + +tclmode +set points_count [get_compare_points -count] +set diff_count [get_compare_points -diff -count] +set abort_count [get_compare_points -abort -count] +set unknown_count [get_compare_points -unknown -count] +if {$points_count == 0} { + puts "---------------------------------" + puts "ERROR: No compare points detected" + puts "---------------------------------" +} +if {$diff_count > 0} { + puts "------------------------------------" + puts "ERROR: Different Key Points detected" + puts "------------------------------------" +} +if {$abort_count > 0} { + puts "-----------------------------" + puts "ERROR: Abort Points detected " + puts "-----------------------------" +} +if {$unknown_count > 0} { + puts "----------------------------------" + puts "ERROR: Unknown Key Points detected" + puts "----------------------------------" +} +puts "No of compare points = $points_count" +puts "No of diff points = $diff_count" +puts "No of abort points = $abort_count" +puts "No of unknown points = $unknown_count" +exit 0 diff --git a/sky130_cds/pnr/SCRIPTS/INNOVUS/run_single.tcl b/sky130_cds/pnr/SCRIPTS/INNOVUS/run_single.tcl new file mode 100755 index 000000000..4dc6ee435 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/INNOVUS/run_single.tcl @@ -0,0 +1,154 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2009 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks within Innovus System. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +global env + +if {![info exists env(VPATH)]} { + set env(VPATH) "./make" +} + +if {![info exists vars]} { + source FF/vars.tcl +} +foreach file $vars(config_files) { + source $file +} + +set vars(codegen) false + +if {[info exists env(FF_START)]} { + if {[file exists $env(VPATH)/$env(FF_START)]} { + exec rm $env(VPATH)/$env(FF_START) + } + set start_step $env(FF_START) +} else { + set start_step init +} +if {[info exists env(FF_STOP)]} { + set stop_step $env(FF_STOP) +} else { + set stop_step signoff +} + +source $vars(script_root)/INNOVUS/procs.tcl + +set step_list $vars(bsteps) + +set time 0 +set index 0 +foreach step $step_list { + if {[file exists $env(VPATH)/$step]} { + if {[file mtime $env(VPATH)/$step] > $time} { + if {[lindex $step_list $index] == "signoff"} { + Puts " Step signoff complete ... nothing to do" + exit + } else { + set start_step [lindex $step_list [expr $index + 1]] + } + } + } else { + set start_step $step + break + } + incr index +} + +if {[lsearch $step_list $start_step] > [lsearch $step_list $stop_step]} { + Puts " -----------------------------------------------------" + Puts " $stop_step step is up to date" + Puts " -----------------------------------------------------" + exit +} +Puts " -----------------------------------------------------" +if {$start_step == $stop_step} { + Puts " RUNNING STEP $start_step ..." +} else { + Puts " RUNNING STEP $start_step through $stop_step ..." +} +Puts " -----------------------------------------------------" +sleep 5 + +if {[info exists vars(script_root)]} { + source $vars(script_root)/INNOVUS/procs.tcl + source $vars(script_root)/ETC/utils.tcl +# source $vars(script_root)/ETC/INNOVUS/utils.tcl +} else { + Puts " ERROR: vars(script_root) not defined ... please define your in setup.tcl" + exit 1 +} + +set found 0 +set index 0 +set proc_list [list] +foreach step $step_list { + if {$step == $start_step} { + set vars(step) $step + eval "::FF_EDI::initialize_flow" + if {$step == "init"} { + eval ::FF_EDI::run_init 0 + } else { + set next_step [lindex $step_list [expr $index-1]] + if {!$vars(fix_hold)} { + switch $step { + "route" { set next_step "postcts" } + "postroute_si" { set next_step "postroute" } + } + } + eval "::FF_EDI::load_design 0 $next_step" + eval "::FF_EDI::run_$step 0" + } + eval "::FF_EDI::save_results 0 $step" + if {$step == $stop_step} { + Puts " ==============================================" + Puts " FOUNDATION FLOW COMPLETE" + Puts " ==============================================" + exit + } + set found 1 + } else { + if {$found} { + eval "::FF_EDI::run_$step 0" + eval "::FF_EDI::save_results 0 $step" + if {$step == $stop_step} { + Puts " ==============================================" + Puts " FOUNDATION FLOW COMPLETE" + Puts " ==============================================" + set found 0 + } + } + } + incr index +} + +exit diff --git a/sky130_cds/pnr/SCRIPTS/gen_flow.tcl b/sky130_cds/pnr/SCRIPTS/gen_flow.tcl new file mode 100755 index 000000000..13d5c1809 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/gen_flow.tcl @@ -0,0 +1,112 @@ +#!/usr/bin/env tclsh +# -*-TCL-*- + +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +############################################################################ +# Foundation Flow Code Generator +# Version : 17.10-p003_1 +############################################################################# + +############################################################################## +# Parse the arguments passed in to the script. These set up the environment # +# for the rest of the system # +############################################################################## + +if {([file tail [info nameofexecutable]] == "encounter") || ([file tail [info nameofexecutable]] == "velocity") ||\ + ([file tail [info nameofexecutable]] == "genus") || ([file tail [info nameofexecutable]] == "innovus")} { + puts " ===================================================" + puts " Loading the Foundation Flow Code Generator" + puts " Version : 17.10-p003_1" +# puts " Available Procedures:" + puts " ===================================================" + if {[info exists vars(script_root)]} { + set default_script_path $vars(script_root) + set vars(execute_string) [format "%s %s" $vars(script_root)/gen_edi_flow.tcl $argv] + } else { + if {[info exists vars(script_path)]} { + set vars(script_root) $vars(script_path) + set default_script_path $vars(script_path) + set vars(execute_string) [format "%s %s" $vars(script_path)/gen_edi_flow.tcl $argv] + } else { +# puts " Variable vars(script_root) required for Makefile generation ..." + puts " Variable vars(script_root) not defined ... setting to [file dirname [file dirname [file dirname [file dirname [file dirname [info nameofexecutable]]]]]]/share/FoundationFlows/SCRIPTS" + set default_script_path [file dirname [file dirname [file dirname [file dirname [file dirname [info nameofexecutable]]]]]]/share/FoundationFlows/SCRIPTS + set vars(script_root) $default_script_path + } + } +} else { + set vars(execute_string) [format "%s %s %s" [info nameofexecutable] [file normalize $argv0] $argv] + + set normalized [file normalize $argv0] + if {[file isdirectory $normalized]} { + set default_script_path $normalized + } elseif {[file isdirectory [file dirname $normalized]]} { + set default_script_path [file dirname $normalized] + } + +} + +set vars(script_path) $default_script_path +#puts $vars(script_path) +# +# Check the paths to make sure that the files that we need actually exist +# +if {![file exists $vars(script_path)/INNOVUS/procs.tcl]} { + puts [format $FFMM::missingFiles $vars(script_path)/INNOVUS/procs.tcl] + exit -1 +} +if {![file exists $vars(script_path)/ETC/utils.tcl]} { + puts [format $FFMM::missingFiles $vars(script_path)/ETC/utils.tcl] + exit -1 +} + +# +# Source the other Tcl files to execute the flow. Then do so +# +#puts " Sourcing $vars(script_path)/INNOVUS/procs.tcl" +source "$vars(script_path)/INNOVUS/procs.tcl" +if {[file exists $vars(script_path)/RC/procs.tcl]} { +# puts " Sourcing $vars(script_path)/RC/procs.tcl" + source "$vars(script_path)/RC/procs.tcl" +} +#puts " Sourcing $vars(script_path)/INNOVUS/utils.tcl" +source "$vars(script_path)/ETC/utils.tcl" + +if {([file tail [info nameofexecutable]] == "tclsh")} { + set command "FF::gen_flow $argv" + eval $command + exit 0 +} diff --git a/sky130_cds/pnr/SCRIPTS/gen_innovus_flow.tcl b/sky130_cds/pnr/SCRIPTS/gen_innovus_flow.tcl new file mode 100755 index 000000000..13d5c1809 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/gen_innovus_flow.tcl @@ -0,0 +1,112 @@ +#!/usr/bin/env tclsh +# -*-TCL-*- + +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +############################################################################ +# Foundation Flow Code Generator +# Version : 17.10-p003_1 +############################################################################# + +############################################################################## +# Parse the arguments passed in to the script. These set up the environment # +# for the rest of the system # +############################################################################## + +if {([file tail [info nameofexecutable]] == "encounter") || ([file tail [info nameofexecutable]] == "velocity") ||\ + ([file tail [info nameofexecutable]] == "genus") || ([file tail [info nameofexecutable]] == "innovus")} { + puts " ===================================================" + puts " Loading the Foundation Flow Code Generator" + puts " Version : 17.10-p003_1" +# puts " Available Procedures:" + puts " ===================================================" + if {[info exists vars(script_root)]} { + set default_script_path $vars(script_root) + set vars(execute_string) [format "%s %s" $vars(script_root)/gen_edi_flow.tcl $argv] + } else { + if {[info exists vars(script_path)]} { + set vars(script_root) $vars(script_path) + set default_script_path $vars(script_path) + set vars(execute_string) [format "%s %s" $vars(script_path)/gen_edi_flow.tcl $argv] + } else { +# puts " Variable vars(script_root) required for Makefile generation ..." + puts " Variable vars(script_root) not defined ... setting to [file dirname [file dirname [file dirname [file dirname [file dirname [info nameofexecutable]]]]]]/share/FoundationFlows/SCRIPTS" + set default_script_path [file dirname [file dirname [file dirname [file dirname [file dirname [info nameofexecutable]]]]]]/share/FoundationFlows/SCRIPTS + set vars(script_root) $default_script_path + } + } +} else { + set vars(execute_string) [format "%s %s %s" [info nameofexecutable] [file normalize $argv0] $argv] + + set normalized [file normalize $argv0] + if {[file isdirectory $normalized]} { + set default_script_path $normalized + } elseif {[file isdirectory [file dirname $normalized]]} { + set default_script_path [file dirname $normalized] + } + +} + +set vars(script_path) $default_script_path +#puts $vars(script_path) +# +# Check the paths to make sure that the files that we need actually exist +# +if {![file exists $vars(script_path)/INNOVUS/procs.tcl]} { + puts [format $FFMM::missingFiles $vars(script_path)/INNOVUS/procs.tcl] + exit -1 +} +if {![file exists $vars(script_path)/ETC/utils.tcl]} { + puts [format $FFMM::missingFiles $vars(script_path)/ETC/utils.tcl] + exit -1 +} + +# +# Source the other Tcl files to execute the flow. Then do so +# +#puts " Sourcing $vars(script_path)/INNOVUS/procs.tcl" +source "$vars(script_path)/INNOVUS/procs.tcl" +if {[file exists $vars(script_path)/RC/procs.tcl]} { +# puts " Sourcing $vars(script_path)/RC/procs.tcl" + source "$vars(script_path)/RC/procs.tcl" +} +#puts " Sourcing $vars(script_path)/INNOVUS/utils.tcl" +source "$vars(script_path)/ETC/utils.tcl" + +if {([file tail [info nameofexecutable]] == "tclsh")} { + set command "FF::gen_flow $argv" + eval $command + exit 0 +} diff --git a/sky130_cds/pnr/SCRIPTS/gen_innovus_setup.tcl b/sky130_cds/pnr/SCRIPTS/gen_innovus_setup.tcl new file mode 100755 index 000000000..0992050d7 --- /dev/null +++ b/sky130_cds/pnr/SCRIPTS/gen_innovus_setup.tcl @@ -0,0 +1,2189 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +proc conv2mmmc {} { + + global rda_Input + + if {![info exists slow_libs]} { + set slow_libs [list] + } + if {![info exists fast_libs]} { + set fast_libs [list] + } + + if {$rda_Input(ui_timelib,max) != ""} { + foreach lib $rda_Input(ui_timelib,max) { + foreach glob_lib [glob $lib] { + if {[file isdirectory $glob_lib]} { + foreach nested_glob_lib [glob $glob_lib/\*] { + lappend slow_libs $nested_glob_lib + } + } else { + lappend slow_libs $glob_lib + } + } + } + foreach lib $rda_Input(ui_timelib) { + foreach glob_lib [glob $lib] { + if {[file isdirectory $glob_lib]} { + foreach nested_glob_lib [glob $glob_lib/\*] { + lappend slow_libs $nested_glob_lib + } + } else { + lappend slow_libs $glob_lib + } + } + } + # set slow_libs [concat $rda_Input(ui_timelib,max) $rda_Input(ui_timelib)] + } else { + foreach lib $rda_Input(ui_timelib) { + foreach glob_lib [glob $lib] { + if {[file isdirectory $glob_lib]} { + foreach nested_glob_lib [glob $glob_lib/\*] { + lappend slow_libs $nested_glob_lib + } + } else { + lappend slow_libs $glob_lib + } + } + } + # set slow_libs $rda_Input(ui_timelib) + } + if {$rda_Input(ui_timelib,min) != ""} { + foreach lib $rda_Input(ui_timelib,min) { + foreach glob_lib [glob $lib] { + if {[file isdirectory $glob_lib]} { + foreach nested_glob_lib [glob $glob_lib/\*] { + lappend fast_libs $nested_glob_lib + } + } else { + lappend fast_libs $glob_lib + } + } + } + foreach lib $rda_Input(ui_timelib) { + foreach glob_lib [glob $lib] { + if {[file isdirectory $glob_lib]} { + foreach nested_glob_lib [glob $glob_lib/\*] { + lappend fast_libs $nested_glob_lib + } + } else { + lappend fast_libs $glob_lib + } + } + } + # set fast_libs [concat $rda_Input(ui_timelib,min) $rda_Input(ui_timelib)] + } else { + set fast_libs $slow_libs + } + + #puts "--------------------------------------------------------------------------------------" + #puts "PQRS: $slow_libs" + #puts "PQRS: $fast_libs" + #puts "--------------------------------------------------------------------------------------" + + set sdc_files [list] + foreach file $rda_Input(ui_timingcon_file) { + lappend sdc_files $file + } + + set ilm_sdc_files [list] + if {[info exists rda_Input(ui_timingcon_file,full)]} { + foreach file $rda_Input(ui_timingcon_file,full) { + lappend ilm_sdc_files $file + } + } + + if {$rda_Input(ui_cdb_file,max) != ""} { + set slow_cdbs [concat $rda_Input(ui_cdb_file,max) $rda_Input(ui_cdb_file)] + } else { + if {$rda_Input(ui_cdb_file) != ""} { + set slow_cdbs $rda_Input(ui_cdb_file) + } + } + if {$rda_Input(ui_cdb_file,min) != ""} { + set fast_cdbs [concat $rda_Input(ui_cdb_file,min) $rda_Input(ui_cdb_file)] + } else { + if {$rda_Input(ui_cdb_file) != ""} { + set fast_cdbs $rda_Input(ui_cdb_file) + } else { + if {[info exists slow_cdbs] && ($slow_cdbs != "")} { + set fast_cdbs $slow_cdbs + } + } + } + + set bc_cap_table "" + set wc_cap_table "" + + if {[llength $rda_Input(ui_captbl_file)] > 1} { + for {set i 0} {$i<[llength $rda_Input(ui_captbl_file)]} {incr i} { + if {[lindex $rda_Input(ui_captbl_file) $i] == "-best"} { + set bc_cap_table [file normalize [lindex $rda_Input(ui_captbl_file) [expr $i+1]]] + } + if {[lindex $rda_Input(ui_captbl_file) $i] == "-worst"} { + set wc_cap_table [file normalize [lindex $rda_Input(ui_captbl_file) [expr $i+1]]] + } + } + } else { + set wc_cap_table [file normalize $rda_Input(ui_captbl_file)] + set bc_cap_table [file normalize $rda_Input(ui_captbl_file)] + } + + set bc_qx_tech_file "" + set wc_qx_tech_file "" + + if {[llength $rda_Input(ui_qxtech_file)] > 1} { + for {set i 0} {$i<[llength $rda_Input(ui_qxtech_file)]} {incr i} { + if {[lindex $rda_Input(ui_qxtech_file) $i] == "-best"} { + set bc_qx_tech_file [file normalize [lindex $rda_Input(ui_qxtech_file) [expr $i+1]]] + } + if {[lindex $rda_Input(ui_qxtech_file) $i] == "-worst"} { + set wc_qx_tech_file [file normalize [lindex $rda_Input(ui_qxtech_file) [expr $i+1]]] + } + } + } else { + set wc_qx_tech_file [file normalize $rda_Input(ui_qxtech_file)] + set bc_qx_tech_file [file normalize $rda_Input(ui_qxtech_file)] + } + + +# if {$wc_cap_table == ""} { +# Puts "--------------------------------------------------------------------------------------" +# Puts "\[PQRS\]\[ERROR\] No cap tables defined for this testcase ... aborting" +# Puts "--------------------------------------------------------------------------------------" +# exit 1 +# } + + if {([info exists dgn_max_temp] == 0) || ([info exists dgn_max_temp] && $dgn_max_temp == "")} { + set max_temp "" + } else { + set max_temp $dgn_max_temp + } + + if {([info exists dgn_min_temp] == 0) || ([info exists dgn_min_temp] && $dgn_min_temp == "")} { + set min_temp "" + } else { + set min_temp [expr abs($dgn_min_temp)] + } + + set pre_route_res_factor $rda_Input(ui_preRoute_res) + set pre_route_clk_res_factor 1.0 + set post_route_res_factor $rda_Input(ui_postRoute_res) + set post_route_clk_res_factor "1.0 1.0 1.0" + set pre_route_cap_factor $rda_Input(ui_preRoute_cap) + set pre_route_clk_cap_factor 1.0 + set post_route_cap_factor $rda_Input(ui_postRoute_cap) + set post_route_clk_cap_factor "1.0 1.0 1.0" + set post_route_xcap_factor $rda_Input(ui_postRoute_xcap) + set shrink_factor $rda_Input(ui_shr_scale) +# set relative_c_thresh $rda_Input(ui_rel_c_thresh) +# set total_c_thresh $rda_Input(ui_tot_c_thresh) +# set coupling_c_thresh $rda_Input(ui_cpl_c_thresh) + + create_rc_corner -name rc_max \ + -preRoute_res $pre_route_res_factor \ + -preRoute_clkres $pre_route_clk_res_factor \ + -preRoute_cap $pre_route_cap_factor \ + -preRoute_clkcap $pre_route_clk_cap_factor \ + -postRoute_res $post_route_res_factor \ + -postRoute_clkres $post_route_clk_res_factor \ + -postRoute_cap $post_route_cap_factor \ + -postRoute_clkcap $post_route_clk_cap_factor \ + -postRoute_xcap $post_route_xcap_factor + + if {$wc_cap_table != ""} { + update_rc_corner -name rc_max -cap_table $wc_cap_table + } + if {$max_temp != ""} { + update_rc_corner -name rc_max -T $max_temp + } + + if {$wc_qx_tech_file != "" } { + update_rc_corner -name rc_max -qx_tech_file $wc_qx_tech_file + } + + create_rc_corner -name rc_min \ + -preRoute_res $pre_route_res_factor \ + -preRoute_clkres $pre_route_clk_res_factor \ + -preRoute_cap $pre_route_cap_factor \ + -preRoute_clkcap $pre_route_clk_cap_factor \ + -postRoute_res $post_route_res_factor \ + -postRoute_clkres $post_route_clk_res_factor \ + -postRoute_cap $post_route_cap_factor \ + -postRoute_clkcap $post_route_clk_cap_factor \ + -postRoute_xcap $post_route_xcap_factor + + if {$bc_cap_table != ""} { + update_rc_corner -name rc_min -cap_table $bc_cap_table + } + if {$min_temp != ""} { + update_rc_corner -name rc_min -T $min_temp + } + + if {$bc_qx_tech_file != "" } { + update_rc_corner -name rc_min -qx_tech_file $bc_qx_tech_file + } + + if {[info exists slow_cdbs] && ($slow_cdbs != "")} { + create_library_set -name libs_max -timing $slow_libs -si $slow_cdbs + create_library_set -name libs_min -timing $fast_libs -si $fast_cdbs + } else { + create_library_set -name libs_max -timing $slow_libs + create_library_set -name libs_min -timing $fast_libs + } + + create_delay_corner -name corner_max -library_set libs_max -rc_corner rc_max + create_delay_corner -name corner_min -library_set libs_min -rc_corner rc_min + Puts "\[INFO\] create_constraint_mode setup_func_mode with " + Puts "\[INFO\] SDC files: $sdc_files" + if {$ilm_sdc_files != ""} { + Puts "\[INFO\] ILM SDC files: $ilm_sdc_files" + create_constraint_mode -name setup_func_mode -sdc_files $sdc_files -ilm_sdc_files ilm_sdc_files + } else { + create_constraint_mode -name setup_func_mode -sdc_files $sdc_files + } + create_analysis_view -name setup_func -constraint_mode setup_func_mode -delay_corner corner_max +# Puts "\[INFO\] create_constraint_mode hold_func_mode with " +# Puts "\[INFO\] SDC files: $sdc_files" +# if {$ilm_sdc_files != ""} { +# Puts "\[INFO\] ILM SDC files: $ilm_sdc_files" +# create_constraint_mode -name hold_func_mode -sdc_files $sdc_files -ilm_sdc_files ilm_sdc_files +# } else { +# create_constraint_mode -name hold_func_mode -sdc_files $sdc_files +# } + create_analysis_view -name hold_func -constraint_mode setup_func_mode -delay_corner corner_min + set_analysis_view -setup {setup_func} -hold {hold_func} + set_default_view -setup {setup_func} -hold {hold_func} + set_interactive_constraint_modes [all_constraint_modes -active] +} + +proc create_lp_config_file {} { + + global vars + + set op [open lp_config.auto.tcl w] + + if {[file exists setup.auto.tcl]} { + source setup.auto.tcl + } + if {[file exists innovus_config.auto.tcl]} { + source innovus_config.auto.tcl + } + + puts $op "##########################################################################################" + puts $op "# Low power configuration file overlay. This file contains foundation flow variables" + puts $op "# that are specific to the LP flow and should be used in addition to the setup.tcl" + puts $op "##########################################################################################" + puts $op "# Tie cell information" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# The variable vars(tie_cells) is defined in the setup.tcl and is used to define a " + puts $op "# \"global\" tie cell list. This list will be used by default for each power domain." + puts $op "# It can be overridden for a given power domain by setting vars(,tie_cells)." + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "#" + puts $op "##########################################################################################" + puts $op "# Placement Options" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "#set vars(resize_shifter_and_iso_insts) " + puts $op "#" + if {[info exists vars(power_domains)]} { + foreach domain $vars(power_domains) { + if {[info exists vars(tie_cells)]} { + puts $op "# set vars($domain,tie_cells)\t\"$vars(tie_cells)\"" + } else { + puts $op "# set vars($domain,tie_cells) >" + } + } + } + puts $op "#" + puts $op "##########################################################################################" + puts $op "# Filler cell information" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# The variable vars(filler_cells) is defined in the setup.tcl and is used to define a " + puts $op "# \"global\" filler cell list. This list will be used by default for each power domain." + puts $op "# It can be overridden for a given power domain by setting vars(,filler_cells)." + puts $op "# ----------------------------------------------------------------------------------------" + if {[info exists vars(power_domains)]} { + foreach domain $vars(power_domains) { + if {[info exists vars(filler_cells)]} { + puts $op "# set vars($domain,filler_cells)\t\"$vars(filler_cells)\"" + } else { + puts $op "# set vars($domain,filler_cells) >" + } + } + } + puts $op "#" + puts $op "##########################################################################################" + puts $op "# Welltap cell information" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# The variable vars(welltaps) is defined in the setup.tcl and is used to define a " + puts $op "# \"global\" welltap cell list. This list will be used by default for each power domain." + puts $op "# It can be overridden for a given power domain by setting vars(,welltaps)." + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# verify_rule : maximum distance (in microns) between welltap cells and standard cells " + puts $op "# in microns" + puts $op "# max_gap : specifies the maximum distance from the right edge of one well-tap cell " + puts $op "# to the left edge of the following well-tap cell in the same row" + puts $op "# cell_interval : specifies the maximum distance from the center of one well-tap cell " + puts $op "# to the center of the following well-tap cell in the same row" + puts $op "#" + puts $op "# NOTE: max_gap and cell_interval parameters are mutually exclusive, user has to define " + puts $op "# only one of these parameters to add welltap cells" + puts $op "#" + puts $op "# ----------------------------------------------------------------------------------------" + if {[info exists vars(power_domains)]} { + foreach domain $vars(power_domains) { + if {[info exists vars(welltaps)]} { + puts $op "# set vars($domain,vars(welltaps)) >" + } else { + puts $op "# set vars($domain,welltaps) >" + } + puts $op "# set vars($domain,welltaps,checkerboard) " + puts $op "# set vars($domain,welltaps,max_gap) " + puts $op "# set vars($domain,welltaps,cell_interval) " + puts $op "# set vars($domain,welltaps,row_offset) " + puts $op "# set vars($domain,welltaps,verify_rule) " + } + } + puts $op "#" + puts $op "##########################################################################################" + puts $op "# Endcap cell information" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# The variables vars(pre_endcap) and vars(post_endcap) are set in the setup.tcl file and" + puts $op "# are used to define \"global\" endcap cells. These used by default for each power domain." + puts $op "# They can be overridden for a given power domain setting vars(,pre_endcap)" + puts $op "# and/or vars(,post_endcap)." + puts $op "# ----------------------------------------------------------------------------------------" + if {[info exists vars(power_domains)]} { + foreach domain $vars(power_domains) { + puts $op "# set vars($domain,pre_endcap)
>"
+         puts $op "# set vars($domain,post_endcap) >"
+      }
+   }
+   puts $op "#"
+   puts $op "##########################################################################################"
+   puts $op "#                            Always on net buffering"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# By default SOCE does always-on-net synthesis for SRPG control signal and PSO enable "
+   puts $op "# signals as part of optDesign -preCTS, but this can be manually done for specific nets if"
+   puts $op "# necessary.  To do this, define the following variables and uncomment the pre_prects.tcl"
+   puts $op "# plug-in template"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# set vars(always_on_buffers)                   "
+   puts $op "# set vars(always_on_nets)                      "
+   puts $op "# set vars(always_on_nets,max_fanout)            (optional)"
+   puts $op "# set vars(always_on_nets,max_tran)              (optional)"
+   puts $op "# set vars(always_on_nets,max_skew)              (optional)"
+   puts $op "# set vars(always_on_nets,max_delay)             (optional)"
+   if {[info exists vars(power_domains)]} {
+      foreach domain $vars(power_domains) {
+         puts $op "# set vars($domain,always_on_buffers)  >"
+      }
+   }
+   puts $op "#"
+   puts $op "##########################################################################################"
+   puts $op "#                      Secondary power/ground routing"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# Automatic secondary power routing can be enabled the foundation flows by setting "
+   puts $op "# vars(route_secondary_pg_nets) to true and providing cell pin pair information to"
+   puts $op "# identify the connections requiring routing (PTBUFFD1:TVDD LVLLHCD4:VDDL, e.g.) "
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# set vars(route_secondary_pg_nets)         \[true | false\]"
+   puts $op "# set vars(secondary_pg,cell_pin_pairs)     "
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "#In addition, the following can optionally defined either globally or per p/g net"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# set vars(secondary_pg,max_fanout)           "
+   puts $op "# set vars(secondary_pg,pattern)              "
+   puts $op "# set vars(secondary_pg,non_default_rule)     "
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# To optionally override for a given p/g net(s), use the vars(route_secondary_pg_nets) to "
+   puts $op "# define the list of nets to be overridden and then override vars(

,

,max_fanout) " + puts $op "# set vars(

,pattern) " + puts $op "# set vars(

,non_default_rule) " + puts $op "#" + puts $op "##########################################################################################" + puts $op "# runCLP options" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(clp_options) " + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(clp_options) \"\"" + puts $op "#" + puts $op "##########################################################################################" + puts $op "# Modify power domains, row creation for power domains" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# The foundation flows contain a sample post_init_tcl (PLUG/post_init.tcl) plug-in to do " + puts $op "# power domain modification automatically based on the folloing variables:" + puts $op "# ----------------------------------------------------------------------------------------" + if {[info exists vars(power_domains)]} { + foreach domain $vars(power_domains) { + puts $op "# set vars($domain,bbox) ; bondary coordinates in microns" + puts $op "# set vars($domain,rs_exts) ; distance in microns " + puts $op "# set vars($domain,min_gaps) ; distance in microns" + } + } + puts $op "#" + puts $op "##########################################################################################" + puts $op "# Power Shut-off Planning " + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# The foundation flows contain a sample post_init_tcl (PLUG/post_init.tcl) plug-in to do " + puts $op "# power switch insertion automatically based on the following information:" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(,switchable) " + puts $op "# set vars(,switch_type) " + puts $op "# set vars(,switch_cell) " + puts $op "# set vars(,input_enable_pin) " + puts $op "# set vars(,output_enable_pin) " + puts $op "# set vars(,input_enable_net) " + puts $op "# set vars(,output_enable_net) " + puts $op "# set vars(,switch_instance) " + puts $op "# set vars(,top_offset) " + puts $op "# set vars(,bottom_offset) " + puts $op "# set vars(,right_offset) " + puts $op "# set vars(,left_offset) " + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# Below variables are for column based pso implemetation" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(,checker_board) " + puts $op "# set vars(,horizonal_pitch) " + puts $op "# set vars(,column_height) " + puts $op "# set vars(,skip_rows) " + puts $op "# set vars(,back_to_back_chain) " + puts $op "# ... Connects the enableNetOut at the top of a column to the enableNetIn at the top of " + puts $op "# ... the next column, and connects the enableNetOut at the bottom of the column to the " + puts $op "# ... enableNetIn at the bottom of the next column" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# Below variables are for ring based pso implemetation" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(,top_ring) <1|0>" + puts $op "# set vars(,bottom_ring) <1|0>" + puts $op "# set vars(,right_ring) <1|0>" + puts $op "# set vars(,left_ring) <1|0>" + puts $op "# ... defines which side of the power domain to insert switches:" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(,top_switch_cell) " + puts $op "# set vars(,bottom_switch_cell) " + puts $op "# set vars(,left_switch_cell) " + puts $op "# set vars(,right_switch_cell) " + puts $op "# ... define pso cell name for each side of the power domain" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(,top_filler_cell) " + puts $op "# set vars(,bottom_filler_cell) " + puts $op "# set vars(,left_filler_cell) " + puts $op "# set vars(,right_filler_cell) " + puts $op "# set vars(,corner_cell_list) " + puts $op "# ... define filler cell name for each side of the power domain" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(,distribute) " + puts $op "# set vars(,top_switches) " + puts $op "# set vars(,bottom_switches) " + puts $op "# set vars(,left_switches) " + puts $op "# set vars(,right_switches) " + puts $op "# ... define the number of switches for each side of the power domain" + puts $op "#" + + close $op + + Puts " ------------------------------------------------------------------------------------" + Puts " Created low power config file \"lp_config.auto.tcl\"" + Puts " This file is used to define variables specific to the LP foundation flow." + Puts " All the informaiton in this file is optional but is intended to help " + Puts " automate some of the most common LP commands. Please edit and copy" + Puts " to lp_config.tcl to enable (make sure it is sourced from setup.tcl)." + +} + +proc create_invs_tag_file {} { + + global vars + global tags + + set steps [list "feedthrough" "assign_pin" "model_gen" "partition" \ + "init" "place" "prects" "cts" "postcts" "postcts_hold" "route" \ + "postroute" "postroute_hold" "signoff" "assemble"] + + set tags(init) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + set_distribute_host \ + set_multi_cpu_usage \ + set_rc_factor \ + derate_timing \ + create_rc_corner \ + create_library_set \ + create_delay_corner \ + create_constraint_mode \ + create_analysis_view \ + update_delay_corner \ + update_library_set \ + derate_timing \ + set_default_view \ + set_power_analysis_mode \ + init_design \ + load_floorplan \ + generate_tracks \ + load_cpf \ + commit_cpf \ + read_activity_file \ + specify_ilm \ + load_ilm_non_sdc_file \ + initialize_timing \ + load_scan \ + specify_spare_gates \ + set_dont_use \ + set_max_route_layer \ + set_design_mode \ + insert_welltaps_endcaps \ + time_design \ + check_design \ + check_timing \ + report_power_domains \ + ff_replace_flexmodel_with_full_netlist \ + ] + set tags(place) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + restore_design \ + initialize_step \ + set_design_mode \ + set_delay_cal_mode \ + set_place_mode \ + set_opt_mode \ + set_tie_hilo_mode \ + cleanup_specify_clock_tree \ + specify_clock_tree \ + specify_jtag \ + place_jtag \ + place_design \ + place_opt_design \ + add_tie_cells \ + time_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(prects) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_ilm_type \ + cleanup_specify_clock_tree \ + create_clock_tree_spec \ + specify_clock_tree \ + set_useful_skew_mode \ + set_opt_mode \ + set_design_mode \ + set_delay_cal_mode \ + set_dont_use \ + opt_design \ + ck_clone_gate \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(cts) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_cts_mode \ + set_ccopt_mode \ + set_nanoroute_mode \ + enable_clock_gate_cells \ + cleanup_specify_clock_tree \ + create_clock_tree_spec \ + specify_clock_tree \ + clock_design \ + ccopt_design \ + disable_clock_gate_cells \ + run_clock_eco \ + update_timing \ + time_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(postcts) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_delay_cal_mode \ + set_analysis_mode \ + set_opt_mode \ + opt_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(postcts_hold) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_dont_use \ + set_opt_mode \ + opt_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(route) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_nanoroute_mode \ + add_filler_cells \ + route_secondary_pg_nets \ + check_place \ + route_design \ + run_clock_eco \ + spread_wires \ + initialize_timing \ + time_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(postroute) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_extract_rc_mode \ + set_analysis_mode \ + set_delay_cal_mode \ + add_metalfill \ + opt_design \ + trim_metalfill \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(postroute_hold) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_dont_use_mode \ + set_opt_mode \ + opt_design \ + trim_metalfill \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(signoff) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_timing \ + initialize_step \ + set_analysis_mode \ + set_extract_rc_mode \ + extract_rc \ + dump_spef \ + signoff_time_design \ + time_design_setup \ + time_design_hold \ + stream_out \ + save_oa_design \ + create_ilm \ + summary_report \ + verify_connectivity \ + verify_geometry \ + verify_metal_density \ + verify_process_antenna \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + + ] + set tags(feedthrough) [list \ + initialize_timing \ + load_cpf \ + commit_cpf \ + run_clp_init \ + save_init_dbs \ + set_budgeting_mode \ + update_constraint_mode \ + set_ptn_user_cns_file \ + set_place_mode \ + set_proto_model \ + place_design \ + time_design \ + save_place_dbs \ + insert_ptn_feedthrough \ + trial_route \ + trial_route_time_design \ + ] + set tags(assign_pin) [list \ + assign_ptn_pins \ + check_pin_assignment \ + report_unaligned_nets \ + trial_route \ + ] + set tags(model_gen) [list \ + create_ps_per_micron_model \ + identify_proto_model \ + report_proto_model \ + setIlmMode \ + create_proto_model \ + create_flexfiller_route_blockage \ + report_proto_model \ + saveDesign \ + ] + set tags(partition) [list \ + time_design_proto \ + set_pspm_vars \ + set_budgeting_mode \ + set_ptn_pin_status \ + derive_timing_budget \ + save_budget_dbs \ + run_clp \ + partition \ + save_partition \ + ] + set tags(assemble) [list \ + assemble_design \ + specify_ilm \ + load_ilm_non_sdc_file \ + load_cpf \ + commit_cpf \ + initialize_timing \ + update_timing \ + pre_signoff_eco_verify_connectivity \ + pre_signoff_eco_verify_geometry \ + set_module_view \ + delete_filler_cells \ + opt_design \ + extract_rc \ + signoff_opt_design \ + signoff_time_design \ + add_filler_cells \ + eco_route \ + post_signoff_eco_verify_connectivity \ + post_signoff_eco_verify_geometry \ + ] + + set op [open invs.auto.tcl w] + + puts $op "##########################################################################################" + puts $op "# CDNS FOUNDATION FLOW" + puts $op "#-----------------------------------------------------------------------------------------" + puts $op "# This is the foundation flow tags file. Each flow step is a sequence of commands and" + puts $op "# each command has a tag associated with it and each tag has four attributes:" + puts $op "#-----------------------------------------------------------------------------------------" + puts $op "# pre_tcl -> file to be sourced prior to the command" + puts $op "# post_tcl -> file to be sourced after the command" + puts $op "# replace_tcl -> file to be sourced instead of the command" + puts $op "# skip -> skip the command entirely (true | false)" + puts $op "#-----------------------------------------------------------------------------------------" + puts $op "# These attributes provide more granularity that the plug-ins and are intended to" + puts $op "# allow for flow customization at a very detailed level. To enable, simply uncomment" + puts $op "# the tag, assign the appropriate value, and make sure this file gets sourced" + puts $op "# from the setup.tcl or innovus_config.tcl. Keep in mind, these tags will only" + puts $op "# be evaluated if the command they are associated is executed as part of the flow" + puts $op "#-----------------------------------------------------------------------------------------" + puts $op "# verbose -> Print tag related comments for imported tags" + puts $op "# verbosity_level -> Print tag related comments for ALL possible tags \[LOW | HIGH\]" + puts $op "#-----------------------------------------------------------------------------------------" + + foreach step $steps { + foreach command $tags($step) { + foreach tag "pre_tcl post_tcl replace_tcl skip" { + set string "#set vars($step,$command,$tag)" + set length [string length $string] + set diff [expr 60-$length] + set spaces [string repeat " " $diff] + if {$tag == "skip"} { + puts $op [format "%s%s%s" $string $spaces ""] + } else { + puts $op [format "%s%s%s" $string $spaces ""] + } + } + } + puts $op "# ----------------------------------------------------------------------------------------" + } + +} + +proc pad {a {add 0}} { + + if {[expr [string length $a] + $add] < 6} { + return "\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 12} { + return "\t\t\t" + } elseif {[expr [string length $a] + $add] < 18} { + return "\t\t" + } elseif {[expr [string length $a] + $add] < 24} { + return "\t" + } + +} + +proc format_string {a b {large 0}} { + + set add 0 + + if {[regexp "#" $a]} { + regsub "#" $a "" a + set add 1 + } + +# puts "$a, [string length $a]" + + if {$large} { + if {[expr [string length $a] + $add] < 4} { + set tabs "\t\t\t\t\t\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 8} { + set tabs "\t\t\t\t\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 12} { + set tabs "\t\t\t\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 16} { + set tabs "\t\t\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 20} { + set tabs "\t\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 24} { + set tabs "\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 28} { + set tabs "\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 32} { + set tabs "\t\t\t" + } else { + set tabs "\t\t" + } + } else { + if {[expr [string length $a] + $add] < 4} { + set tabs "\t\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 8} { + set tabs "\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 12} { + set tabs "\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 16} { + set tabs "\t\t\t" + } elseif {[expr [string length $a] + $add] < 20} { + set tabs "\t\t" + } else { + set tabs "\t" + } + } + + # Handle the empty string correctly + if {$b == {}} { set b {{}} } + + if {$add} { + return [format "#set $a%s%s" $tabs $b] + } else { + return [format "set $a%s%s" $tabs $b] + } +} + +proc get_line_match {pattern file {last 1}} { + + set ip [open $file r] + + while {[gets $ip line]>=0} { + if {[regexp "$pattern" $line]>0} { + if {$last} { + set match $line + } else { + lappend match $line + } + } + } + if {[info exists match]} { + return $match + } +} + +set op1 [open setup.auto.tcl w] +set op2 [open innovus_config.auto.tcl w] + +puts $op1 "##########################################################################################" +puts $op1 "# CDNS FOUNDATION FLOW" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# This is the foundation flow setup file. It contains all the necessary design" +puts $op1 "# data to drive all the CDNS foundation flows. Each flow can also have an" +puts $op1 "# additional configuration file to define flow specific information:" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# INNOVUS -> innovus_config.tcl (for flat and hier implementation flows)" +puts $op1 "# + lp_config.tcl (additional information for flat and hier lp flows)" +#puts $op1 "# -> proto_config.tcl (for the prototyping flow)" +#puts $op1 "# ETS -> ets_config.tcl" +#puts $op1 "# EPS -> eps_config.tcl" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# A single setup.tcl is all that is required. These additional files are to enable " +puts $op1 "# the sharing of a setup.tcl (design data) amongst design groups while also allowing" +puts $op1 "# different flow options to be set in the *_config.cl files for different blocks or runs" +puts $op1 "##########################################################################################" +puts $op1 "" + +puts $op2 "##########################################################################################" +puts $op2 "# INNOVUS FOUNDATION FLOW" +puts $op2 "#-----------------------------------------------------------------------------------------" +puts $op2 "# This is the INNOVUS foundation flow configuration file. It contains all the necessary flow" +puts $op2 "# options to drive the CDNS flat and/or hier implementation flows. " +puts $op2 "# For low power flows, an optional/additional configuration file (lp_config.tcl) can be " +puts $op2 "# used to enable low power foundation flow features and define domain specific information." +puts $op2 "#-----------------------------------------------------------------------------------------" +if {![info exists vars(version)]} { + set vars(version) 17.1.0 +} +if {[lindex [split $vars(version) "."] 0] <= 10 && [llength [all_analysis_views]] == 2} { + puts "Converting default timing environment to MMMC" + conv2mmmc +} + +global rda_Input + +puts $op1 "##########################################################################################" +puts $op1 "# The variable vars(version) tells the code generator which version of INNOVUS you will be" +puts $op1 "# targeting." +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "set vars(version) $vars(version)" +#puts $op1 "##########################################################################################" +#puts $op1 "# For non-codgen flow, the following must be set - it should point to the foundation " +#puts $op1 "# flow installation directory" +puts $op1 "#-----------------------------------------------------------------------------------------" +#puts $op1 "#set vars(script_root) SCRIPTS" +#puts $op1 "" +#puts $op2 "# The vars(flow) variable can be used to define the type of flow to run. If not set," +#puts $op2 "# mmmc will be used. Supported values are:" +#puts $op2 "# - default (minmax timing)" +#puts $op2 "# - pr_mmmc (minmax timing pre-route, mmmc timing post-route)" +#puts $op2 "# - mmmc (mmmc timing)" +#puts $op2 "##########################################################################################" +#if {[info exists ::CPF::cpfCommitted]} { +# puts $op2 "set vars(flow) mmmc" +#} else { +# puts $op2 "set vars(flow) default" +#} +puts $op2 "set vars(plug_dir) PLUG/INNOVUS" +puts $op2 "set vars(dbs_dir) DBS" +puts $op2 "set vars(log_dir) LOG" +puts $op2 "set vars(rpt_dir) RPT" +puts $op2 "# You can set a report directory per step using vars(,rpt_dir) ..." +puts $op2 "" + +if {[info exists rda_Input(ui_netlist)]} { + set vars(netlist) [list] + foreach file $rda_Input(ui_netlist) { + lappend vars(netlist) [file normalize $file] + } +} else { + catch {set vars(netlist) [file normalize [lindex [get_line_match "Reading netlist file" [getLogFileName]] 3]]} +} +catch {set vars(fp_file) [file normalize [lindex [get_line_match "Reading floorplan" [getLogFileName]] 4]]} +#catch {set vars(cts_spec) [regsub -all "'" [lindex [get_line_match "Reading clock tree spec file" [getLogFileName]] 5] ""]} +#catch {set vars(cts_spec) [regsub -all "\"" $vars(cts_spec)] ""} +set vars(cts_spec) "" +set specOpt [ckGetCkSpecOption] + for { set i 0 } { $i < [llength $specOpt] } { incr i } { + if { [string match -nocase [lindex $specOpt $i] "-file" ] || [string match -nocase [lindex $specOpt $i] "-specFile" ] } { + incr i + set clkFile [lindex $specOpt $i] + if { [file exists $clkFile ] } { + if { [lsearch -exact $vars(cts_spec) $clkFile] == -1 } { + lappend vars(cts_spec) [file normalize $clkFile] + } + } + } +} + +foreach option [getDesignMode -quiet] { + if {[lindex $option 0] == "process"} { + set vars(process) [lindex $option 1]nm + } +} +catch {set vars(max_route_layer) [getMaxRouteLayer]} + +puts $op1 "########################################################################################" +puts $op1 "# Define design data ..." +puts $op1 "########################################################################################" +puts $op1 [format_string vars(design) [dbCellName [dbgTopCell]]] + +if {[lindex [split $vars(version) "."] 0] > 10} { + if {[info exists init_verilog] && ($init_verilog != "")} { + set vars(netlist) $init_verilog + } + if {[info exists init_oa_ref_lib] && ($init_oa_ref_lib != "")} { + set vars(oa_ref_lib) $init_oa_ref_lib + } +# catch {set restore_design [get_line_match "restoreDesign" [getLogFileName]} +# set vars(netlist_type) oa +# set vars(oa_design_lib) [lindex $restore_design 1] +# set vars(oa_design_cell) [lindex $restore_design 2] +# set vars(oa_design_view) [lindex $restore_design 3] + if {[info exists init_abstract_view] && ($init_abstract_view != "")} { + set vars(oa_abstract_name) $init_abstract_view + } + if {[info exists init_oa_design_lib] && ($init_oa_design_lib != "")} { + set vars(oa_design_lib) $init_oa_design_lib + } + if {[info exists init_oa_design_cell] && ($init_oa_design_cell != "")} { + set vars(oa_design_cell) $init_oa_design_cell + } + if {[info exists init_oa_design_view] && ($init_oa_design_view != "")} { + set vars(oa_design_view) $init_oa_design_view + } + if {[info exists init_abstract_view] && ($init_abstract_view != "")} { + set vars(oa_abstract_name) $init_abstract_view + } + if {[info exists init_layout_view] && ($init_layout_view != "")} { + set vars(oa_layout_name) $init_layout_view + } + puts $op1 "#########################################################################################" + puts $op1 "# Variables for OA design import and export" + puts $op1 "# ---------------------------------------------------------------------------------------" + if {[info exists vars(oa_design_lib)]} { + puts $op1 "set vars(netlist_type) oa" + puts $op1 "set vars(oa_design_lib) $vars(oa_design_lib)" + } else { + puts $op1 "#set vars(oa_design_lib) " + } + if {[info exists vars(oa_design_cell)]} { + puts $op1 "set vars(oa_design_cell) $vars(oa_design_cell)" + } else { + puts $op1 "#set vars(oa_design_cell) " + } + if {[info exists vars(oa_design_view)]} { + puts $op1 "set vars(oa_design_view) $vars(oa_design_view)" + } else { + puts $op1 "#set vars(oa_design_view) " + } + puts $op1 "#set vars(dbs_format) oa" + if {[info exists vars(oa_ref_lib)]} { + puts $op1 "set vars(oa_ref_lib) $vars(oa_ref_lib)" + } else { + puts $op1 "#set vars(oa_ref_lib) " + } + if {[info exists vars(oa_abstract_name)]} { + puts $op1 "set vars(oa_abstract_name) $vars(oa_abstract_name)" + } else { + puts $op1 "#set vars(oa_abstract_name) " + } + if {[info exists vars(oa_layout_name)]} { + puts $op1 "set vars(oa_layout_name) $vars(oa_layout_name)" + } else { + puts $op1 "#set vars(oa_layout_name) " + } + if {[info exists vars(netlist)]} { +# puts $op1 [format "set vars(netlist)%s%s" [pad vars(netlist)] $vars(netlist)] + puts $op1 [format_string vars(netlist) \"$vars(netlist)\"] + puts $op1 [format_string vars(netlist_type) verilog] + } + puts $op1 "#########################################################################################" +} else { + if {[info exists vars(netlist)]} { +# puts $op1 [format "set vars(netlist)%s%s" [pad vars(netlist)] $vars(netlist)] + puts $op1 [format_string vars(netlist) \"$vars(netlist)\"] + puts $op1 [format_string vars(netlist_type) verilog] + } + puts $op1 "#########################################################################################" + puts $op1 "# Variables for OA design import and export" + puts $op1 "# ---------------------------------------------------------------------------------------" + puts $op1 "#set vars(oa_design_lib) " + puts $op1 "#set vars(oa_design_cell) " + puts $op1 "#set vars(oa_design_view) " + puts $op1 "#set vars(oa_ref_lib) " + puts $op1 "#set vars(oa_abstract_name) " + puts $op1 "#set vars(oa_layout_name) " +} +if {[info exists vars(fp_file)]} { + puts $op1 [format_string vars(fp_file) $vars(fp_file)] +} else { + puts $op1 [format_string #vars(fp_file) ] +} +puts $op1 [format_string #vars(oa_fp) ] +puts $op1 [format_string #vars(def_files) ] +#puts $op1 "#set vars(scan_def) " +puts $op1 "# NOTE: vars(cts_spec) is only required for cts flows." +puts $op1 "# For ccopt flows, it is not required" +if {[file exists $vars(cts_spec)]} { + puts $op1 [format_string vars(cts_spec) \"$vars(cts_spec)\"] +} else { + puts $op1 [format_string #vars(cts_spec) ] +} +if {[info exists vars(process)]} { + puts $op1 [format_string vars(process) $vars(process)] +} else { + puts $op1 [format_string #vars(process) ] +} +if {[info exists vars(max_route_layer)]} { + puts $op1 [format_string vars(max_route_layer) $vars(max_route_layer)] +} else { + puts $op1 [format_string #vars(max_route_layer) ] +} +puts $op1 "# NOTE: When generate_tracks is set, the tracks in the DEF are ignored; even the pitch" +puts $op1 "# To generate new tracks but preserve the pitch, use vars(honor_pitch) true" +puts $op1 [format_string #vars(generate_tracks) ""] +puts $op1 [format_string #vars(honor_pitch) ""] +if {[info exists rda_Input(ui_pwrnet)] && ($rda_Input(ui_pwrnet) != "")} { + puts $op1 "set vars(power_nets) \"$rda_Input(ui_pwrnet)\"" +} else { + puts $op1 "#set vars(power_nets) " +} +if {[info exists rda_Input(ui_gndnet)] && ($rda_Input(ui_gndnet) != "")} { + puts $op1 "set vars(ground_nets) \"$rda_Input(ui_gndnet)\"" +} else { + puts $op1 "#set vars(ground_nets) " +} +puts $op1 "##########################################################################################" +puts $op1 "# For hierarchical designs, define vars(partition_list) which should be a list " +puts $op1 "# of all defined partitions (DO NOT INCLUDE THE TOP PARTITION)." +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# To assist the budgeting process, also define the following for each partition" +puts $op1 "# - set vars(,cts_spec) " +puts $op1 "# - set vars(,latency_sdc) " +puts $op1 "#" +puts $op1 "# These files should contain the expected clock latency for the clock tree(s)" +puts $op1 "# For example, if partition A has an expected clock latency of 500ps out of a total clock" +puts $op1 "# latency of 1ns, the top level constraints would have 'set_clock_latency 1.0 '" +puts $op1 "# and A would have a latency sdc file containing 'set_clock_latency 0.5 '" +puts $op1 "# Likewise, the top level CTS spec would contain 'MaxDelay 1ns' and the vars(A,cts_spec)" +puts $op1 "# would contain 'MacroModel A/ 500ps 500ps 500ps 500ps 0fF" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# During assembly, the foundation flow defaults to assembly the 'signoff' databases" +puts $op1 "# from each partition sub-directory. To specify a different database to use for any" +puts $op1 "# partition (including the top), specify the following:" +puts $op1 "# - vars(,assemble_dbs) " +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# If vars(use_flexmodels) is set to true, Flexmodels will be used. Some additional" +puts $op1 "# options for flexmodel usage are:" +puts $op1 "# set vars(use_proto_net_delay_model) false" +puts $op1 "# set vars(flexmodel_as_ptn) true" +puts $op1 "# set vars(flexmodel_art_based) true" +puts $op1 "# set vars(create_flexfiller_blockage) true" +puts $op1 "# set vars(enable_nrgr) true" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# If vars(insert_feedthrough) is set to true, feedthrough insertion will be called" +puts $op1 "# before partitioning. Some additional options for partitioning are:" +puts $op1 "# set vars(abutted_design) true" +puts $op1 "# set vars(placement_based_ptn) true" +puts $op1 "# set vars(budget_mode) { trial_ipo giga_opt proto_net_delay_model }" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# Flexilm creation can be enabled for the partitions, using vars(enable_flexilm) true" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# Finally, each partition can have its own innovus_config.tcl (INCLUDING THE TOP PARTITION)." +puts $op1 "# To enable this, define vars(," +puts $op1 "##########################################################################################" +set vars(partition_list) "" +dbForEachCellPtn [dbGet top] ptn { + lappend vars(partition_list) [dbPtnName $ptn] +} +if {$vars(partition_list) != ""} { + puts $op1 "set vars(partition_list) \[list $vars(partition_list)\]" + foreach part $vars(partition_list) { + puts $op1 "#set vars($part,cts_spec) " + puts $op1 "#set vars($part,latency_sdc) " + puts $op1 "#set vars($part,assemble_dbs) " + puts $op1 "#set vars($part,ilm_dir) " + puts $op1 "#set vars($part,lef_file) " + puts $op1 "#set vars($part,innovus_config_tcl) " + } +} else { + puts $op1 "#set vars(partition_list) " + puts $op1 "#set vars(,cts_spec) " + puts $op1 "#set vars(,latency_sdc) " + puts $op1 "#set vars(,assemble_dbs) " + puts $op1 "#set vars(,ilm_dir) " + puts $op1 "#set vars(,lef_file) " + puts $op1 "#set vars(,innovus_config_tcl) " +} + +if {(![catch {dbGet top.isProtoModelCommitted} val]) && $val} { + puts $op1 "set vars(use_flexmodels) true" +} else { + puts $op1 "#set vars(use_flexmodels) " +} + +puts $op1 "" + +puts $op1 "########################################################################################" +puts $op1 "# Optionally define user ILMs to be specified during the flow. These will be specified " +puts $op1 "# during the flat init step and the hierarchical partitioning step. The ILMs should" +puts $op1 "# not be hierarhical partitions (they are handled automatically. See below for " +puts $op1 "# handling partition ILMs during post assembly closure." +puts $op1 "# - vars(ilm_list) " +puts $op1 "# - vars(,ilm_dir) " +puts $op1 "# - vars(,lef_file) " +puts $op1 "########################################################################################" +puts $op1 "# set vars(ilm_list) \[list\]" +if {[info exists rda_Input(ui_ilmdir)] && ($rda_Input(ui_ilmdir) != "")} { + set ilm_list [list] + for {set i 0} {$i < [llength $rda_Input(ui_ilmdir)]} {incr i} { + set ilm [lindex $rda_Input(ui_ilmdir) $i] + incr i + set dir [lindex $rda_Input(ui_ilmdir) $i] + lappend ilm_list $ilm + set vars($ilm,ilm_dir) $dir + } + if {$ilm_list != ""} { + puts $op1 "set vars(ilm_list) \[list $ilm_list\]" + foreach ilm $ilm_list { + puts $op1 "set vars($ilm,ilm_dir) $vars($ilm,ilm_dir)" + } + } +} +puts $op1 "########################################################################################" +puts $op1 "# Define lef files ..." +puts $op1 "########################################################################################" +puts $op1 "set vars(lef_files) \"\\" +foreach file $rda_Input(ui_leffile) { + puts $op1 " [file normalize $file] \\" +} +puts $op1 "\"" + +puts $op1 "########################################################################################" +puts $op1 "# Define library sets ..." +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(library_sets) " +puts $op1 "# set vars(,timing) " +puts $op1 "# set vars(,si) " +puts $op1 "########################################################################################" +set library_sets [list] + +foreach library_set [all_library_sets] { + if {[llength [all_library_sets]] > 2} { +# if {[regexp "^default" $library_set] == 0} { + if {[info exists ::CPF::cpfCommitted]} { + if {([regexp "^domain_" $library_set] == 0)} { + lappend library_sets $library_set + } + } else { + lappend library_sets $library_set + } +# } + } else { + lappend library_sets $library_set + } +} + +if {$library_sets != ""} { + puts $op1 "set vars(library_sets) \"$library_sets\"" +} + +foreach library_set $library_sets { + foreach option "timing si aocv" { + if {[get_library_set $library_set -$option] != ""} { + set file_list [get_library_set $library_set -$option] + puts $op1 "set vars($library_set,$option) \"\\" + foreach file $file_list { + puts $op1 " [file normalize $file] \\" + } + puts $op1 "\"" + } + } +} + +puts $op1 "########################################################################################" +puts $op1 "# Define rc corners ..." +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(rc_corners) " +puts $op1 "# set vars(,T) " +puts $op1 "# set vars(,cap_table) " +puts $op1 "########################################################################################" +set rc_corners [list] +foreach rc_corner [all_rc_corners] { +# if {[llength [all_rc_corners]] > 1} { +# if {[regexp "^default" $rc_corner ] == 0} { +# lappend rc_corners $rc_corner +# } +# } else { + lappend rc_corners $rc_corner +# } +} +if {$rc_corners != ""} { + puts $op1 "set vars(rc_corners) \"$rc_corners\"" +} +foreach rc_corner $rc_corners { + foreach option "T cap_table" { + if {[get_rc_corner $rc_corner -$option] != ""} { + if {$option == "cap_table"} { + puts $op1 "set vars($rc_corner,$option) [file normalize [get_rc_corner $rc_corner -$option]]" + } else { + puts $op1 "set vars($rc_corner,$option) [get_rc_corner $rc_corner -$option]" + } + } else { + if {($option == "T") && ([get_rc_corner $rc_corner -$option] == "")} { + puts $op1 "#set vars($rc_corner,$option) 25 ; # EDIT FOR CORRECT T VALUE" + } + if {($option == "cap_table") && ([get_rc_corner $rc_corner -$option] == "")} { + puts $op1 "#set vars($rc_corner,$option) ; # EDIT FOR CORRECT CAP TABLE DEFINITION" + } + } + } + puts $op1 "#set vars($rc_corner,atf_file)" +} + +puts $op1 "########################################################################################" +puts $op1 "# Optionally define QRC technology information" +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(,qx_tech_file) " +puts $op1 "# set vars(,qx_lib_file) " +puts $op1 "# set vars(,qx_conf_file) " +puts $op1 "########################################################################################" +foreach rc_corner $rc_corners { + foreach option "qx_tech_file qx_lib_file qx_conf_file" { + if {[get_rc_corner $rc_corner -$option] != ""} { + puts $op1 "set vars($rc_corner,$option) [file normalize [get_rc_corner $rc_corner -$option]]" + } + } +} + +puts $op1 "########################################################################################" +puts $op1 "# Scale factors are also optional but are strongly encouraged for pre_route optimization " +puts $op1 "# in order to obtain the best flow convergence and QoR. Scaling factors are applied per" +puts $op1 "# rc corner by setting the individual values OR via a scale_tcl file which must contain" +puts $op1 "# syntactically correct update_rc_corner commands for a given rc_corner" +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(,scale_tcl) " +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(,pre_route_res_factor) " +puts $op1 "# set vars(,pre_route_clk_res_factor) " +puts $op1 "# set vars(,post_route_res_factor) " +puts $op1 "# set vars(,post_route_clk_res_factor) " +puts $op1 "# set vars(,pre_route_cap_factor) " +puts $op1 "# set vars(,pre_route_clk_cap_factor) " +puts $op1 "# set vars(,post_route_cap_factor) " +puts $op1 "# set vars(,post_route_clk_cap_factor) " +puts $op1 "# set vars(,post_route_xcap_factor) " +puts $op1 "########################################################################################" + +foreach rc_corner $rc_corners { + if {[get_rc_corner $rc_corner -preRoute_res] != ""} { + puts $op1 "set vars($rc_corner,pre_route_res_factor) \t\t[format %4.2f [expr [get_rc_corner $rc_corner -preRoute_res]*1.0]]" + } + if {[get_rc_corner $rc_corner -preRoute_clkres] != ""} { + puts $op1 "set vars($rc_corner,pre_route_clk_res_factor) \t[format %4.2f [expr [get_rc_corner $rc_corner -preRoute_clkres]*1.0]]" + } + if {[get_rc_corner $rc_corner -postRoute_res] != ""} { + set triplets [get_rc_corner $rc_corner -postRoute_res] + set scalar [lindex $triplets 0] + if {[llength $scalar] == 1} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0] + } + if {[llength $scalar] == 2} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0] + } + if {[llength $scalar] == 3} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]] + } + puts $op1 "set vars($rc_corner,post_route_res_factor) \t\t\"$pstring\"" + } + if {[get_rc_corner $rc_corner -postRoute_clkres] != ""} { + set triplets [get_rc_corner $rc_corner -postRoute_clkres] + set scalar [lindex $triplets 0] + if {[llength $scalar] == 1} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0] + } + if {[llength $scalar] == 2} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0] + } + if {[llength $scalar] == 3} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]] + } + puts $op1 "set vars($rc_corner,post_route_clk_res_factor) \t\t\"$pstring\"" + } + if {[get_rc_corner $rc_corner -preRoute_cap] != ""} { + puts $op1 "set vars($rc_corner,pre_route_cap_factor) \t\t[format %4.2f [expr [get_rc_corner $rc_corner -preRoute_cap]*1.0]]" + } + if {[get_rc_corner $rc_corner -preRoute_clkcap] != ""} { + puts $op1 "set vars($rc_corner,pre_route_clk_cap_factor) \t[format %4.2f [expr [get_rc_corner $rc_corner -preRoute_clkcap]*1.0]]" + } + if {[get_rc_corner $rc_corner -postRoute_cap] != ""} { + set triplets [get_rc_corner $rc_corner -postRoute_cap] + set scalar [lindex $triplets 0] + if {[llength $scalar] == 1} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0] + } + if {[llength $scalar] == 2} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0] + } + if {[llength $scalar] == 3} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]] + } + puts $op1 "set vars($rc_corner,post_route_cap_factor) \t\t\"$pstring\"" + } + if {[get_rc_corner $rc_corner -postRoute_clkcap] != ""} { + set triplets [get_rc_corner $rc_corner -postRoute_clkcap] + set scalar [lindex $triplets 0] + if {[llength $scalar] == 1} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0] + } + if {[llength $scalar] == 2} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0] + } + if {[llength $scalar] == 3} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]] + } + puts $op1 "set vars($rc_corner,post_route_clk_cap_factor) \t\t\"$pstring\"" + } + if {[get_rc_corner $rc_corner -postRoute_xcap] != ""} { + set triplets [get_rc_corner $rc_corner -postRoute_xcap] + set scalar [lindex $triplets 0] + if {[llength $scalar] == 1} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0] + } + if {[llength $scalar] == 2} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0] + } + if {[llength $scalar] == 3} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]] + } + puts $op1 "set vars($rc_corner,post_route_xcap_factor) \t\t\"$pstring\"" + } + puts $op1 "" +} +puts $op1 "########################################################################################" +puts $op1 "# Define operating conditions (optional)" +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(opconds) " +puts $op1 "# set vars(,library_file) " +puts $op1 "# set vars(,P) " +puts $op1 "# set vars(,V) " +puts $op1 "# set vars(,T) " +puts $op1 "########################################################################################" +if {![info exists ::CPF::cpfCommitted]} { + set opconds [list] + foreach opcond [all_op_conds] { + # if {[regexp "^default" $opcond ] == 0} { + lappend opconds $opcond + # } + } + if {$opconds != ""} { + puts $op1 "#set vars(opconds) \"$opconds\"" + } + foreach opcond $opconds { + foreach option "library_file P V T" { + if {[get_op_cond $opcond -$option] != ""} { + puts $op1 "#set vars($opcond,$option) [get_op_cond $opcond -$option]" + } + } + } +} + +puts $op1 "########################################################################################" +puts $op1 "# Define delay corners ..." +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(delay_corners) " +puts $op1 "# set vars(,library_set) (previously defined)" +puts $op1 "# set vars(,opcond) (previously defined) (optional)" +puts $op1 "# set vars(,rc_corner) library_set> (previously defined)" +puts $op1 "########################################################################################" +set delay_corners [list] +foreach delay_corner [all_delay_corners] { +# if {[llength [all_delay_corners]] > 2} { +# if {[regexp "^default" $delay_corner ] == 0} { +# lappend delay_corners $delay_corner +# } +# } else { + lappend delay_corners $delay_corner +# } +} +if {$delay_corners != ""} { + puts $op1 "set vars(delay_corners) \"$delay_corners\"" +} +foreach dc $delay_corners { + set attribute_list "rc_corner library_set opcond_library opcond irdrop_file late_library_set early_library_set + late_opcond_library early_opcond_library late_opcond early_opcond late_irdrop_file early_irdrop_file" + + foreach attr $attribute_list { + # Extraction the corner level properties + if {[get_delay_corner $dc -$attr] != ""} { + puts $op1 "set vars($dc,$attr) \t[get_delay_corner $dc -$attr]" + } + # Extraction the power domain level properties + set domains [get_delay_corner $dc -power_domain_list] + if {$domains != ""} { + if {![info exists done($dc,power_domains)]} { + puts $op1 "set vars($dc,power_domains) \"$domains\"" + foreach pd [get_delay_corner $dc -power_domain_list] { + puts $op1 "# Attributes for power domain $pd" + foreach attr $attribute_list { + if {[get_delay_corner -power_domain $pd $dc -$attr] != ""} { + set done($dc,$pd,$attr) TRUE + puts $op1 "set vars($dc,$pd,$attr) \t[get_delay_corner $dc -power_domain $pd -$attr]" + } + } + } + set done($dc,power_domains) TRUE + } + } + } +} + + +puts $op1 "########################################################################################" +puts $op1 "# Optionally define derating factors for OCV here (clock and data). " +puts $op1 "# Derating factors are applied per delay corner using either individual" +puts $op1 "# values OR via a derate_tcl file which must contain syntactically correct" +puts $op1 "# set_timing_derate commands for a given delay_corner" +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "#set vars(,derate_tcl) " +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "#set vars(,data_cell_late) " +puts $op1 "#set vars(,data_cell_early) " +puts $op1 "#set vars(,data_net_late) " +puts $op1 "#set vars(,data_net_early) " +puts $op1 "#set vars(,clock_cell_late) " +puts $op1 "#set vars(,clock_cell_early) " +puts $op1 "#set vars(,clock_net_late) " +puts $op1 "#set vars(,clock_net_early) " +puts $op1 "#set vars(,cell_check_late) " +puts $op1 "#set vars(,cell_check_early) " +puts $op1 "#---------------------------------------------------------------------------------------" + +set map(early_cell_check_derate_factor) early_cell_check +set map(early_clk_cell_derate_factor) clock_cell_early +set map(early_data_cell_derate_factor) data_cell_early +set map(late_cell_check_derate_factor) late_cell_check +set map(late_clk_cell_derate_factor) clock_cell_late +set map(late_data_cell_derate_factor) data_cell_late + +#timeDesign -prePlace +#foreach view [all_setup_analysis_views] { +# foreach type "early_cell_check_derate_factor early_clk_cell_derate_factor early_data_cell_derate_factor \ +# late_cell_check_derate_factor late_clk_cell_derate_factor late_data_cell_derate_factor" { +# +# puts $op1 "set vars([get_analysis_view $view -delay_corner],$map($type)) [get_property [lindex [all_registers] 0] $type -view $view]" +# } +#} +#timeDesign -prePlace -hold +#foreach view [all_hold_analysis_views] { +# foreach type "early_cell_check_derate_factor early_clk_cell_derate_factor early_data_cell_derate_factor \ +# late_cell_check_derate_factor late_clk_cell_derate_factor late_data_cell_derate_factor" { +# +# puts $op1 "set vars([get_analysis_view $view -delay_corner],$map($type)) [get_property [lindex [all_registers] 0] $type -view $view]" +# } +#} + +puts $op1 "########################################################################################" +puts $op1 "# Define constraint modes ... " +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(constraint_modes) " +puts $op1 "# set vars(,pre_cts_sdc)

 (required)"
+puts $op1 "# set vars(,post_cts_sdc)      (optional)"
+puts $op1 "# set vars(,incr_cts_sdc)      (optional)"
+puts $op1 "# set vars(,pre_cts_ilm_sdc)  
 (optional)"
+puts $op1 "#---------------------------------------------------------------------------------------"
+set constraint_modes [list]
+foreach constraint_mode [all_constraint_modes] {
+#   if {[llength [all_constraint_modes]] > 2} {
+#      if {[regexp "^default_mode" $constraint_mode ] == 0} {
+#         lappend constraint_modes $constraint_mode
+#      }
+#   } else {
+      lappend constraint_modes $constraint_mode
+#   }
+}
+if {$constraint_modes != ""} {
+   puts $op1 "set vars(constraint_modes) \"$constraint_modes\""
+}
+foreach constraint_mode $constraint_modes {
+   if {[get_constraint_mode $constraint_mode -sdc_files] != ""} {
+#      puts $op1 "set vars($constraint_mode,pre_cts_sdc) \"[file normalize [get_constraint_mode $constraint_mode -sdc_files]]\"" 
+     set pre_cts_sdc_list [list]
+     foreach file [get_constraint_mode $constraint_mode -sdc_files]  {
+        lappend pre_cts_sdc_list [file normalize $file]
+     }
+     puts $op1 "set vars($constraint_mode,pre_cts_sdc) \"[join $pre_cts_sdc_list]\"" 
+      if {[info exists dgn_post_cts_sdc] && ($dgn_post_cts_sdc != "") } {
+         puts $op1 "set vars($constraint_mode,post_cts_sdc) \"$dgn_post_cts_sdc\"" 
+      }
+   }
+   if {[get_constraint_mode $constraint_mode -ilm_sdc_files] != ""} {
+#      puts $op1 "set vars($constraint_mode,pre_cts_ilm_sdc) \"[file normalize [get_constraint_mode $constraint_mode -ilm_sdc_files]]\"" 
+     set ilm_cts_sdc_list [list]
+     foreach file [get_constraint_mode $constraint_mode -ilm_sdc_files]  {
+        lappend ilm_cts_sdc_list [file normalize $file]
+     }
+     puts $op1 "set vars($constraint_mode,pre_cts_ilm_sdc) \"[join $ilm_cts_sdc_list]\"" 
+   }
+}
+
+puts $op1 "########################################################################################"
+puts $op1 "# Define setup and hold analysis views ... each analysis view requires"
+puts $op1 "# a delay corner and a constraint mode"
+puts $op1 "########################################################################################"
+
+#set analysis_views ""
+set analysis_views [concat [all_setup_analysis_views] [all_hold_analysis_views]]
+#foreach view [all_analysis_views] {
+#   if {[llength [all_analysis_views]] > 2} {
+#      if {[regexp "^default" $view ] == 0} {
+#         lappend analysis_views $view
+#      }
+#   } else {
+#      lappend analysis_views $view
+#   }
+#}
+foreach view $analysis_views {
+   foreach option "delay_corner constraint_mode" {
+      if {[get_analysis_view $view -$option] != ""} {
+         puts $op1 "set vars($view,$option) [get_analysis_view $view -$option]" 
+      }
+   }
+}
+puts $op1 "########################################################################################"
+puts $op1 "# EDIT/VERIFY THESE LISTS!!"
+puts $op1 "########################################################################################"
+puts $op1 "set vars(setup_analysis_views) \"[all_setup_analysis_views]\""
+puts $op1 "set vars(hold_analysis_views)  \"[all_hold_analysis_views]\""
+#puts $op1 "set vars(setup_analysis_views) \"$analysis_views\""
+#puts $op1 "set vars(hold_analysis_views) \"$analysis_views\""
+
+puts $op1 "########################################################################################"
+puts $op1 "# Define active setup and hold analysis view lists and default views"
+puts $op1 "########################################################################################"
+puts $op1 "set vars(default_setup_view)  \[lindex \$vars(setup_analysis_views) 0\]"
+puts $op1 "set vars(default_hold_view)   \[lindex \$vars(hold_analysis_views) 0\]"
+#puts $op1 "set vars(active_setup_views) \$vars(setup_analysis_views)"
+#puts $op1 "set vars(active_hold_views)  \$vars(hold_analysis_views)"
+puts $op1 "set vars(active_setup_views)  \$vars(setup_analysis_views)"
+puts $op1 "set vars(active_hold_views)   \$vars(hold_analysis_views)"
+puts $op1 ""
+puts $op1 "#set vars(gds_files)         "
+puts $op1 "#set vars(gds_layer_map)     "
+puts $op1 "#set vars(qrc_layer_map)     "
+puts $op1 "#set vars(qrc_library)       "
+puts $op1 "#set vars(qrc_config_file)   "
+puts $op1 ""
+puts $op2 "########################################################################################"
+puts $op2 "# Enable onChipVariation (for MMMC flows).  Options are:"
+puts $op2 "# pre_place, pre_prects, pre_cts, pre_postcts, pre_postroute, pre_signoff, false"
+puts $op2 "########################################################################################"
+puts $op2 "set vars(enable_ocv)        pre_cts"
+puts $op2 ""
+puts $op2 "########################################################################################"
+puts $op2 "# Optionally enable aocv"
+puts $op2 "########################################################################################"
+puts $op2 "set vars(enable_aocv)       false"
+puts $op2 "########################################################################################"
+puts $op2 "# Optionally enable cppr; options are: setup, hold, both, none"
+puts $op2 "########################################################################################"
+puts $op2 "set vars(enable_cppr)       both"
+puts $op2 ""
+#puts $op2 "########################################################################################"
+#puts $op2 "# Optionally enable signalStorm delay calculation during the flow."
+#puts $op2 "# This is a requirement when using ECSM/CCS models.  The following are"
+#puts $op2 "# value options: pre_place pre_prects pre_postcts pre_postroute pre_signoff false"
+#puts $op2 "########################################################################################"
+#puts $op2 "set vars(enable_ss)         false"
+#puts $op2 ""
+puts $op2 "########################################################################################"
+puts $op2 "# Optionally enable signoff ECO for the hierarhical flow"
+puts $op2 "# IF 'ilm', THEN THE FOLLOWING SHOULD BE SET IN THE setup.tcl"
+puts $op2 "# - vars(,ilm_dir)   "
+puts $op2 "# - va#rs(,lef_file)  "
+puts $op2 "########################################################################################"
+puts $op2 "set vars(enable_signoff_eco)            false"
+puts $op2 ""
+puts $op2 "########################################################################################"
+puts $op2 "#                              Flow Options"
+puts $op2 "# Optionally enable design mode options:"
+puts $op2 "#---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(flow_effot)       "
+puts $op2 "#set vars(power_effort)     "
+puts $op2 ""
+puts $op2 "########################################################################################"
+puts $op2 "#                              Placement Options"
+puts $op2 "# NOTE: When place_opt_design is enabled, the prects step will be skipped"
+puts $op2 "#---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(in_place_opt)     true"
+puts $op2 "#set vars(no_pre_place_opt) true"
+puts $op2 "#set vars(place_opt_design)  "
+puts $op2 "#set vars(place_io_pins)     "
+puts $op2 "#set vars(clock_gate_aware)  "
+puts $op2 "#set vars(congestion_effort) "
+puts $op2 "#---------------------------------------------------------------------------------------"
+foreach option [getPlaceMode -quiet] {
+   if {[lindex $option 0] == "clkGateAware"} {
+      puts $op2 "set vars(clock_gate_aware)  [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "congEffort"} {
+      puts $op2 "set vars(congestion_effort) [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "placeIoPins"} {
+      puts $op2 "set vars(place_io_pins)     [lindex $option 1]"
+   }
+}
+puts $op2 ""
+puts $op2 "########################################################################################"
+puts $op2 "#                     Tie/Filler/Tap Cell Options"
+puts $op2 "# --------------------------------------------------------------------------------------"
+puts $op2 "#                         Tie cell information"
+puts $op2 "# --------------------------------------------------------------------------------------"
+foreach option [getTieHiLoMode -quiet] {
+   switch -exact -- [lindex $option 0] {
+      "cell" {
+         if {[lindex $option 1] != ""} {
+            puts $op2 "set vars(tie_cells) \"[lindex $option 1]\""
+         } else {
+            puts $op2 "#set vars(tie_cells) "
+         }
+      }
+      "maxDistance" {
+         if {[lindex $option 1] != 0} {
+            puts $op2 "set vars(tie_cells,max_distance) [list [lindex $option 1]]"
+         } else {
+            puts $op2 "#set vars(tie_cells,max_distance) "
+         }
+      }
+      "maxFanout" {
+         if {[lindex $option 1] != 0} {
+            puts $op2 "set vars(tie_cells,max_fanout) [list [lindex $option 1]]"
+         } else {
+            puts $op2 "#set vars(tie_cells,max_fanout) "
+         }
+      }
+   }
+}
+puts $op2 "# --------------------------------------------------------------------------------------"
+puts $op2 "#                     Filler cell information"
+puts $op2 "# --------------------------------------------------------------------------------------"
+foreach option [getFillerMode -quiet] {
+   if {[lindex $option 0] == "core"} {
+      if {[lindex $option 1] != ""} {
+         puts $op2 "set vars(filler_cells) \"[lindex $option 1]\""
+      } else {
+         puts $op2 "#set vars(filler_cells) "
+      }
+   }
+}
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#                     Welltap cell information"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#    verify_rule : maximum distance (in microns) between welltap cells and standard cells "
+puts $op2 "#                  in microns"
+puts $op2 "#        max_gap : specifies the maximum distance from the right edge of one well-tap cell "
+puts $op2 "#                  to the left edge of  the following well-tap cell in the same row"
+puts $op2 "#  cell_interval : specifies the maximum distance from the center of one well-tap cell "
+puts $op2 "#                  to the center of the following well-tap cell in the same row"
+puts $op2 "#"
+puts $op2 "# NOTE: max_gap and cell_interval parameters are mutually exclusive, user has to define "
+puts $op2 "#       only one of these parameters to add welltap cells"
+puts $op2 "#"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(welltaps)                         "
+puts $op2 "#set vars(welltaps,checkerboard)            "
+puts $op2 "#set vars(welltaps,max_gap)                 "
+puts $op2 "#set vars(welltaps,cell_interval)           "
+puts $op2 "#set vars(welltaps,verify_rule)             "
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#                          Endcap cell information"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(pre_endcap)                       
"
+puts $op2 "#set vars(post_endcap)                      "
+puts $op2 ""
+if {[info exists ::CPF::cpfCommitted] || [info exists ::MSV::ieee1801Loaded]} {
+   puts $op1 "##########################################################################################"
+   puts $op1 "#                             LP Flow Options"
+   puts $op1 "#---------------------------------------------------------------------------------------"
+   set lpfile {}
+   if {[info exists ::CPF::cpfCommitted] && $::CPF::cpfCommitted &&
+       [info exists ::CPF::cpf_file] && $::CPF::cpf_file != ""} {
+      set lpformat cpf
+      set lpfile gen_setup.[pid].$lpformat; # $::CPF::cpf_file is not used directly
+   if {[lindex [split $vars(version) "."]  0] < 15} {
+      saveCPF $lpfile
+   } else {
+      write_power_intent -cpf $lpfile
+   } 
+   } elseif {[info exists ::MSV::ieee1801Loaded] && $::MSV::ieee1801Loaded &&
+             [info exists ::MSV_UPF::upf_file]} {
+      set lpfile [file normalize $::MSV_UPF::upf_file]
+      set lpformat ieee1801
+   }
+
+   if {$lpfile == {}} {
+      puts "WARNING: Cannot determine CPF or IEEE 1801 file ..."
+   } else {
+      set vars(${lpformat}_file) $lpfile
+     puts $op1 "set vars(${lpformat}_file)       \"$vars(${lpformat}_file)\""
+      puts $op1 "# --------------------------------------------------------------------"
+      puts $op1 "# Define the following to selectively commit sections of the [string toupper $lpformat] file"
+      puts $op1 "#set vars(${lpformat}_power_domain)     "
+      puts $op1 "#set vars(${lpformat}_power_switch)     "
+      puts $op1 "#set vars(${lpformat}_isolation)        "
+      puts $op1 "#set vars(${lpformat}_level_shifter)    "
+      puts $op1 "#set vars(${lpformat}_state_retention)  "
+      puts $op1 "# --------------------------------------------------------------------"
+      puts $op1 "#set vars(${lpformat}_keep_rows)        "
+      puts $op1 "# ---------------------------------------------------------------------------------------"
+      puts $op1 "# The vars(power_domains) is optional.  If not defined, the power" 
+      puts $op1 "# power domain list will be picked up automatically"
+      puts $op1 "# ---------------------------------------------------------------------------------------"
+      set power_domains [list]
+      dbForEachPowerDomain [dbgHead] pd {
+         lappend power_domains [dbPowerDomainName $pd]
+      }
+      if {$power_domains != ""} {
+         puts $op1 "set vars(power_domains) \"$power_domains\""
+      } else {
+         puts $op1 "#set vars(power_domains)                       "
+      }
+      puts $op1 "# ---------------------------------------------------------------------------------------"
+      puts $op1 "# Additional optional low power variables can be defined in the lp_config.tcl file."
+      puts $op1 "# ---------------------------------------------------------------------------------------"
+   }
+}
+puts $op2 ""
+puts $op2 "#########################################################################################"
+puts $op2 "#                               Clock Tree Options"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(route_clock_nets) "
+puts $op2 "#set vars(cts_cells)        "
+puts $op2 "#set vars(clock_gate_cells) "
+puts $op2 "#set vars(clock_gate_clone) "
+puts $op2 "#set vars(clock_eco)        "
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(clk_tree_top_layer)     "
+puts $op2 "#set vars(clk_tree_bottom_layer)   "
+puts $op2 "#set vars(clk_tree_ndr)           "
+puts $op2 "#set vars(clk_tree_shield_net)     "
+puts $op2 "#set vars(clk_leaf_top_layer)     "
+puts $op2 "#set vars(clk_leaf_bottom_layer)  "
+puts $op2 "#set vars(cts_leaf_ndr)           "
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "# Additional variables to enable/support ccopt"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(cts_engine) "
+puts $op2 "#set vars(cts_buffer_cells) "
+puts $op2 "#set vars(cts_inverter_cells) "
+puts $op2 "#set vars(cts_use_inverters) "
+puts $op2 "#set vars(cts_io_opt) "
+#puts $op2 "#set vars(ccopt_integration) "
+#puts $op2 "#set vars(ccopt_executable) "
+
+puts $op2 ""
+puts $op2 "#########################################################################################"
+puts $op2 "#                              Optimization Options"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "# For difficult timing designs, 'set vars(high_timing_effort) true'"
+puts $op2 "# This enables a variety of options throughout the flow for optimal"
+puts $op2 "# QoR at the expense of runtime"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(high_timing_effort)             "
+puts $op2 "# --------------------------------------------------------------------"
+#puts $op2 "#set vars(critical_range)                 "
+puts $op2 "#set vars(preserve_assertions)            " 
+puts $op2 "#set vars(clock_gate_aware_opt)           "
+#puts $op2 "#set vars(power_effort)                   "
+#puts $op2 "#set vars(power_ratio)                    "
+puts $op2 "#set vars(fix_hold_allow_tns_degradation) "
+puts $op2 "#set vars(useful_skew)                    "
+#puts $op2 "#set vars(skew_buffers)                   "
+puts $op2 "#set vars(fix_hold)                       "
+puts $op2 "#set vars(fix_hold_ignore_ios)            "
+puts $op2 "#set vars(delay_cells)                    "
+puts $op2 "#set vars(dont_use_list)                  "
+puts $op2 "#set vars(dont_use_file)                  "
+puts $op2 "#set vars(use_list)                       "
+puts $op2 "#---------------------------------------------------------------------------------------"
+foreach option [getOptMode -quiet] {
+   if {[lindex $option 0] == "criticalRange"} {
+      puts $op2 "#set vars(critical_range)                 [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "preserveAssertions"} {
+      puts $op2 "set vars(preserve_assertions)            [lindex $option 1]"
+   } 
+#   if {[lindex $option 0] == "leakagePowerEffort"} {
+#      puts $op2 "set vars(leakage_power_effort)           [lindex $option 1]"
+#   }
+#   if {[lindex $option 0] == "dynamicPowerEffort"} {
+#      puts $op2 "set vars(dynamic_power_effort)           [lindex $option 1]"
+#   }
+   if {[lindex $option 0] == "fixHoldAllowSetupTnsDegrade"} {
+      puts $op2 "set vars(fix_hold_allow_tns_degradation) [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "clkGateAware"} {
+      puts $op2 "set vars(clock_gate_aware_opt)           [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "usefulSkew"} {
+      puts $op2 "set vars(useful_skew)                    [lindex $option 1]"
+   }
+}
+#foreach option [getUsefulSkewMode -quiet] {
+#   if {[lindex $option 0] == "useCells"} {
+#      if {[lindex $option 1] != ""} {
+#         puts $op2 "set vars(skew_buffers) \"\\"
+#         foreach cell [lindex $option 1] {
+#            puts $op2 "   $cell \\"
+#         }
+#         puts $op2 "\"" 
+#      } 
+#   }
+#}
+catch {set foo [get_line_match "set don't use by User" [getLogFileName]]}
+if {[info exists foo] && ($foo != "") } {
+   puts $op2 "set vars(dont_use_list) \"\\"
+   foreach line [get_line_match "set don't use by User" [getLogFileName] 0] {
+#      lappend vars(dont_use_list) [lindex [split [lindex $line 0] "/"] 1]
+       puts $op2 "   [lindex [split [lindex $line 0] "/"] 1] \\"
+   }
+   puts $op2 "\""
+}
+puts $op2 "#########################################################################################"
+puts $op2 "#                            Power Analysis Options"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(activity_file)        "
+puts $op2 "#set vars(activity_file_format) "
+puts $op2 "#set vars(report_power)         "
+puts $op2 "#set vars(power_analysis_view)  "
+puts $op2 ""
+puts $op2 "#########################################################################################"
+puts $op2 "#                              Nanoroute Options"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(multi_cut_effort)        "
+puts $op2 "#set vars(antenna_diode)           "
+puts $op2 "#set vars(litho_driven_routing)    "
+puts $op2 "#set vars(verify_litho)            "
+puts $op2 "#set vars(lpa_tech_file)           "
+puts $op2 "#set vars(fix_litho)               "
+puts $op2 "#set vars(lpa_conf_file)           "
+puts $op2 "#set vars(postroute_spread_wires)  "
+puts $op2 "# ---------------------------------------------------------------------------------------"
+foreach option [getNanoRouteMode -quiet] {
+   if {[lindex $option 0] == "drouteUseMultiCutViaEffort"} {
+      puts $op2 "set vars(multi_cut_effort)     [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "routeWithLithoDriven"} {
+      puts $op2 "set vars(litho_driven_routing) [lindex $option 1]"
+   }
+}
+
+puts $op2 "#########################################################################################"
+puts $op2 "#                              Extraction Options"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(coupling_c_thresh)       "
+puts $op2 "#set vars(relative_c_thresh)       "
+puts $op2 "#set vars(total_c_thresh)          "
+puts $op2 "# ---------------------------------------------------------------------------------------"
+foreach option [getExtractRCMode -quiet] {
+   if {[lindex $option 0] == "coupling_c_th"} {
+      puts $op2 "#set vars(coupling_c_thresh)       [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "relative_c_th"} {
+      puts $op2 "#set vars(relative_c_thresh)       [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "total_c_th"} {
+      puts $op2 "#set vars(total_c_thresh)          [lindex $option 1]"
+   }
+}
+puts $op2 "# Signoff extraction requires qrc_tech file; if you dont have one, please switch to effort low."
+puts $op2 "# But keep in mind, effort low is NOT allowed for process nodes 32nm and below"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(postroute_extraction_effort) "
+puts $op2 "#set vars(signoff_extraction_effort)   "
+puts $op2 ""
+puts $op2 "#########################################################################################"
+puts $op2 "#                              Signal Integrity Options"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(delta_delay_threshold)   (in nanoseconds)"
+puts $op2 "#set vars(celtic_settings)        "
+puts $op2 "#set vars(si_analysis_type)       "
+puts $op2 "#set vars(acceptable_wns)         "
+puts $op2 "# ---------------------------------------------------------------------------------------"
+foreach option [getSIMode -quiet] {
+   if {[lindex $option 0] == "deltaDelayThreshold"} {
+      puts $op2 "set vars(delta_delay_threshold) [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "insCeltICPreTCL"} {
+      puts $op2 "set vars(celtic_settings)       [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "analysisType"} {
+      puts $op2 "set vars(si_analysis_type)       [lindex $option 1]"
+   }
+}
+
+puts $op2 "#########################################################################################"
+puts $op2 "# Optionally define the following when applicable"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(assign_buffer)     {1 -buffer }"
+puts $op2 "#set vars(buffer_tie_assign) "
+puts $op2 "#set vars(jtag_rows)         "
+puts $op2 "#set vars(jtag_cells)        "
+puts $op2 "#set vars(spare_cells)       "
+
+
+puts $op2 "#########################################################################################"
+puts $op2 "# Below are the available plug-ins for the flat foundation flow.  Each "
+puts $op2 "# should point to a file. If the file doesn't exist, the flow will print"
+puts $op2 "# a warning an continue.  The place_tcl and cts_tcl are unique in that "
+puts $op2 "# they REPLACE the placeDesign and clockDesign calls, respectively."
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "set vars(always_source_tcl)           \$vars(plug_dir)/always_source.tcl"
+puts $op2 "set vars(final_always_source_tcl)     \$vars(plug_dir)/final_always_source.tcl"
+puts $op2 "set vars(pre_init_tcl)                \$vars(plug_dir)/pre_init.tcl"
+puts $op2 "set vars(post_init_tcl)               \$vars(plug_dir)/post_init.tcl"
+puts $op2 "set vars(pre_place_tcl)               \$vars(plug_dir)/pre_place.tcl"
+puts $op2 "#set vars(place_tcl)                  \$vars(plug_dir)/place.tcl"
+puts $op2 "set vars(post_place_tcl)              \$vars(plug_dir)/post_place.tcl"
+puts $op2 "set vars(pre_prects_tcl)              \$vars(plug_dir)/pre_prects.tcl"
+puts $op2 "set vars(post_prects_tcl)             \$vars(plug_dir)/post_prects.tcl"
+puts $op2 "set vars(pre_cts_tcl)                 \$vars(plug_dir)/pre_cts.tcl"
+puts $op2 "#set vars(cts_tcl)                    \$vars(plug_dir)/cts.tcl"
+puts $op2 "set vars(post_cts_tcl)                \$vars(plug_dir)/post_cts.tcl"
+puts $op2 "set vars(pre_postcts_tcl)             \$vars(plug_dir)/pre_postcts.tcl"
+puts $op2 "set vars(post_postcts_tcl)            \$vars(plug_dir)/post_postcts.tcl"
+puts $op2 "set vars(pre_route_tcl)               \$vars(plug_dir)/pre_route.tcl"
+puts $op2 "set vars(post_route_tcl)              \$vars(plug_dir)/post_route.tcl"
+puts $op2 "set vars(pre_postcts_hold_tcl)        \$vars(plug_dir)/pre_postcts_hold.tcl"
+puts $op2 "set vars(post_postcts_hold_tcl)       \$vars(plug_dir)/post_postcts_hold.tcl"
+puts $op2 "set vars(pre_postroute_tcl)           \$vars(plug_dir)/pre_postroute.tcl"
+puts $op2 "set vars(post_postroute_tcl)          \$vars(plug_dir)/post_postroute.tcl"
+puts $op2 "set vars(pre_postroute_hold_tcl)      \$vars(plug_dir)/pre_postroute_hold.tcl"
+puts $op2 "set vars(post_postroute_hold_tcl)     \$vars(plug_dir)/post_postroute_hold.tcl"
+puts $op2 "set vars(pre_signoff_tcl)             \$vars(plug_dir)/pre_signoff.tcl"
+puts $op2 "set vars(post_signoff_tcl)            \$vars(plug_dir)/post_signoff.tcl"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "# Below are the plug-ins available for the hierarchical flow ... note"
+puts $op2 "# the additional plug-ins for the partition and assemble steps.  "
+puts $op2 "# Keep in mind "
+puts $op2 "#    - The partitioning step will also load the pre/post init"
+puts $op2 "#      and pre/post place plug-ins (see above)."
+puts $op2 "#    - The assemble step will also load the pre/post signoff"
+puts $op2 "#      plug-ins as well.  "
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(always_source_tcl)          \$vars(plug_dir)/post_signoff.tcl"
+puts $op2 "#set vars(final_always_source_tcl)    \$vars(plug_dir)/final_always_source.tcl"
+puts $op2 "#set vars(pre_model_gen_tcl)          \$vars(plug_dir)/pre_model_gen.tcl"
+puts $op2 "#set vars(post_model_gen_tcl)         \$vars(plug_dir)/post_model_gen.tcl"
+puts $op2 "#set vars(pre_pin_assign_tcl)         \$vars(plug_dir)/pre_pin_assign.tcl"
+puts $op2 "#set vars(post_pin_assign_tcl)        \$vars(plug_dir)/post_pin_assign.tcl"
+puts $op2 "#set vars(pre_partition_tcl)          \$vars(plug_dir)/pre_partition.tcl"
+puts $op2 "#set vars(post_partition_tcl)         \$vars(plug_dir)/post_partition.tcl"
+puts $op2 "#set vars(pre_assemble_tcl)           \$vars(plug_dir)/pre_assemble.tcl"
+puts $op2 "#set vars(post_assemble_tcl)          \$vars(plug_dir)/post_assemble.tcl"
+puts $op2 "#set vars(pre_signoff_tcl)            \$vars(plug_dir)/pre_signoff.tcl"
+puts $op2 "#set vars(post_signoff_tcl)           \$vars(plug_dir)/post_signoff.tcl"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "# All other plug-ins are only used during the flat implementation"
+puts $op2 "# of the partitions. To enable plug-ins for partition implementation"
+puts $op2 "# define in the vars(,innovus_config_tcl) file for that partition"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "# To insert metal fill during the flow define the following two variables:"
+puts $op2 "# - vars(metalfill)    \[pre_postroute, pre_signoff\]"
+puts $op2 "# - vars(metalfill_tcl) "
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(metalfill)                  pre_postroute"
+puts $op2 "#set vars(metalfill_tcl)             \$vars(plug_dir)/metalfill.tcl"
+
+puts $op2 "##########################################################################################"
+puts $op2 "# Distribution setup ... vars(distribute) can be one of the following:"
+puts $op2 "# lsf, rsh, local, or custom"
+puts $op2 "# Depending on the value of vars(distribute), addition variables"
+puts $op2 "# may be required.  Some examples are shown below"
+puts $op2 "# Also, a timeout can be set (unit is seconds)"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(distribute)           custom"
+puts $op2 "#set vars(distribute_timeout)   3600"
+puts $op2 "#set vars(custom,script)        {/grid/sfi/farm/bin/gridsub -W 72:00 -P SOC7.1 -R \"SFIARCH==OPT64 && OSREL==EE40\" -q lnx64}"
+puts $op2 "#set vars(lsf,queue)            lnx64"
+puts $op2 "#set vars(lsf,resource)         \"SFIARCH==OPT64 && OSREL==EE40\""
+puts $op2 "#set vars(lsf,args)             \"-W 72:00 -P SOC8.1\""
+puts $op2 "#set vars(local_cpus)           2"
+puts $op2 "#set vars(remote_hosts)         2"
+puts $op2 "#set vars(cpu_per_remote_host)  2"
+puts $op2 "#set vars(rsh,hosts)            "
+puts $op2 "##########################################################################################"
+puts $op2 "# Capture qor and run time metrics ..."
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(capture_metrics) false"
+puts $op2 "set vars(report_run_time) true"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(html_summary) "
+puts $op2 "#set vars(time_info_rpt) "
+puts $op2 "#set vars(time_info_dbs) "
+puts $op2 "##########################################################################################"
+puts $op2 "# Makefile options ..."
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(make_tool) "
+puts $op2 "#set vars(make_tool_args) \"-64 -nowin\""
+puts $op2 "#set vars(make_syn_tool) "
+puts $op2 "#set vars(make_syn_tool_args) \"-64\""
+puts $op2 "#set vars(make_browser) mozilla"
+puts $op2 "##########################################################################################"
+puts $op2 "# Abort if there are errors in the setup.tcl"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "set vars(abort) true"
+puts $op2 "##########################################################################################"
+puts $op2 "# Send mail during flow execution;  vars(mail,steps) defaults to ALL steps."
+puts $op2 "#set vars(mail,to)              \"\""
+puts $op2 "#set vars(mail,steps)           \"\""
+puts $op2 "##########################################################################################"
+puts $op1 "puts \" Finished loading setup.tcl file\""
+puts $op2 "puts \" Finished loading the INNOVUS configuration file\""
+
+close $op1
+close $op2
+
+Puts " ------------------------------------------------------------------------------------"
+Puts " Finished generating setup file \"setup.auto.tcl\" ... "
+Puts " please edit and rename to setup.tcl to enable"
+Puts " ------------------------------------------------------------------------------------"
+Puts " Finished generating INNOVUS config file \"innovus_config.auto.tcl\" ... "
+Puts " please edit and rename to innovus_config.tcl to enable"
+Puts " ------------------------------------------------------------------------------------"
+#puts "     Please check for correctness and add additional information as necessary"
+if {[info exists lpfile]} {
+   create_lp_config_file
+   Puts " Finished generating low power config file \"lp_config.auto.tcl\" ... "
+   Puts " please edit and rename to lp_config.tcl to enable"
+   Puts " ------------------------------------------------------------------------------------"
+}
+create_invs_tag_file
+Puts " ------------------------------------------------------------------------------------"
+Puts " Finished generating INNOVUS tag file \"invs.auto.tcl\" ... "
+Puts " This file is for detailed flow customization and in purely optional."
+Puts " ------------------------------------------------------------------------------------"
+if {[info exists done]} { 
+   foreach var [array names done] {
+      unset done($var)
+   }
+}
diff --git a/sky130_cds/pnr/SCRIPTS/gen_setup.tcl b/sky130_cds/pnr/SCRIPTS/gen_setup.tcl
new file mode 100755
index 000000000..0992050d7
--- /dev/null
+++ b/sky130_cds/pnr/SCRIPTS/gen_setup.tcl
@@ -0,0 +1,2189 @@
+###############################################################################
+#                       CADENCE COPYRIGHT NOTICE
+#         © 2008-2013 Cadence Design Systems, Inc. All rights reserved.
+#------------------------------------------------------------------------------
+#
+# This Foundation Flow is provided as an example of how to perform specialized
+# tasks.
+#
+# This work may not be copied, re-published, uploaded, or distributed in any way,
+# in any medium, whether in whole or in part, without prior written permission
+# from Cadence. Notwithstanding any restrictions herein, subject to compliance
+# with the terms and conditions of the Cadence software license agreement under
+# which this material was provided, this material may be copied and internally
+# distributed solely for internal purposes for use with Cadence tools.
+#
+# This work is Cadence intellectual property and may under no circumstances be
+# given to third parties, neither in original nor in modified versions, without
+# explicit written permission from Cadence. The information contained herein is
+# the proprietary and confidential information of Cadence or its licensors, and
+# is supplied subject to, and may be used only by Cadence's current customers
+# in accordance with, a previously executed license agreement between Cadence
+# and its customer.
+#
+#------------------------------------------------------------------------------
+# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL
+# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  MATERIAL, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###############################################################################
+
+proc conv2mmmc {} {
+
+   global rda_Input
+
+   if {![info exists slow_libs]} {
+      set slow_libs [list]
+   } 
+   if {![info exists fast_libs]} {
+      set fast_libs [list]
+   } 
+
+   if {$rda_Input(ui_timelib,max) != ""} {
+      foreach lib $rda_Input(ui_timelib,max) {
+         foreach glob_lib [glob $lib] {
+            if {[file isdirectory $glob_lib]} {
+               foreach nested_glob_lib [glob $glob_lib/\*] {
+                  lappend slow_libs $nested_glob_lib
+               }
+            } else {
+               lappend slow_libs $glob_lib
+            }
+         }
+      }
+      foreach lib $rda_Input(ui_timelib) {
+         foreach glob_lib [glob $lib] {
+            if {[file isdirectory $glob_lib]} {
+               foreach nested_glob_lib [glob $glob_lib/\*] {
+                  lappend slow_libs $nested_glob_lib
+               }
+            } else {
+               lappend slow_libs $glob_lib
+            }
+         }
+      }
+   #   set slow_libs [concat $rda_Input(ui_timelib,max) $rda_Input(ui_timelib)]
+   } else {
+      foreach lib $rda_Input(ui_timelib) {
+         foreach glob_lib [glob $lib] {
+            if {[file isdirectory $glob_lib]} {
+               foreach nested_glob_lib [glob $glob_lib/\*] {
+                  lappend slow_libs $nested_glob_lib
+               }
+            } else {
+               lappend slow_libs $glob_lib
+            }
+         }
+      }
+   #   set slow_libs $rda_Input(ui_timelib)
+   }
+   if {$rda_Input(ui_timelib,min) != ""} {
+      foreach lib $rda_Input(ui_timelib,min) {
+         foreach glob_lib [glob $lib] {
+            if {[file isdirectory $glob_lib]} {
+               foreach nested_glob_lib [glob $glob_lib/\*] {
+                  lappend fast_libs $nested_glob_lib
+               }
+            } else {
+               lappend fast_libs $glob_lib
+            }
+         }
+      }
+      foreach lib $rda_Input(ui_timelib) {
+         foreach glob_lib [glob $lib] {
+            if {[file isdirectory $glob_lib]} {
+               foreach nested_glob_lib [glob $glob_lib/\*] {
+                  lappend fast_libs $nested_glob_lib
+               }
+            } else {
+               lappend fast_libs $glob_lib
+            }
+         } 
+      }
+   #   set fast_libs [concat $rda_Input(ui_timelib,min) $rda_Input(ui_timelib)]
+   } else {
+      set fast_libs $slow_libs
+   }
+   
+   #puts "--------------------------------------------------------------------------------------" 
+   #puts "PQRS: $slow_libs"
+   #puts "PQRS: $fast_libs"
+   #puts "--------------------------------------------------------------------------------------" 
+   
+   set sdc_files [list]
+   foreach file $rda_Input(ui_timingcon_file) {
+      lappend sdc_files $file
+   }
+   
+   set ilm_sdc_files [list]
+   if {[info exists rda_Input(ui_timingcon_file,full)]} {
+      foreach file $rda_Input(ui_timingcon_file,full) {
+         lappend ilm_sdc_files $file
+      }
+   }
+   
+   if {$rda_Input(ui_cdb_file,max) != ""} {
+      set slow_cdbs [concat $rda_Input(ui_cdb_file,max) $rda_Input(ui_cdb_file)]
+   } else {
+      if {$rda_Input(ui_cdb_file) != ""} {
+         set slow_cdbs $rda_Input(ui_cdb_file)
+      }
+   }
+   if {$rda_Input(ui_cdb_file,min) != ""} {
+      set fast_cdbs [concat $rda_Input(ui_cdb_file,min) $rda_Input(ui_cdb_file)]
+   } else {
+      if {$rda_Input(ui_cdb_file) != ""} {
+         set fast_cdbs $rda_Input(ui_cdb_file)
+      } else {
+         if {[info exists slow_cdbs] && ($slow_cdbs != "")} {
+            set fast_cdbs $slow_cdbs
+        }
+     }
+   }
+
+   set bc_cap_table ""
+   set wc_cap_table ""
+  
+   if {[llength $rda_Input(ui_captbl_file)] > 1} {
+      for {set i 0} {$i<[llength $rda_Input(ui_captbl_file)]} {incr i} {
+         if {[lindex $rda_Input(ui_captbl_file) $i] == "-best"} {
+            set bc_cap_table [file normalize [lindex $rda_Input(ui_captbl_file) [expr $i+1]]]
+         }
+         if {[lindex $rda_Input(ui_captbl_file) $i] == "-worst"} {
+            set wc_cap_table [file normalize [lindex $rda_Input(ui_captbl_file) [expr $i+1]]]
+         }
+      }
+   } else {
+      set wc_cap_table [file normalize $rda_Input(ui_captbl_file)]
+      set bc_cap_table [file normalize $rda_Input(ui_captbl_file)]
+   }
+   
+   set bc_qx_tech_file ""
+   set wc_qx_tech_file ""
+   
+   if {[llength $rda_Input(ui_qxtech_file)] > 1} {
+      for {set i 0} {$i<[llength $rda_Input(ui_qxtech_file)]} {incr i} {
+         if {[lindex $rda_Input(ui_qxtech_file) $i] == "-best"} {
+            set bc_qx_tech_file [file normalize [lindex $rda_Input(ui_qxtech_file) [expr $i+1]]]
+         }
+         if {[lindex $rda_Input(ui_qxtech_file) $i] == "-worst"} {
+            set wc_qx_tech_file [file normalize [lindex $rda_Input(ui_qxtech_file) [expr $i+1]]]
+         }
+      }
+   } else {
+      set wc_qx_tech_file [file normalize $rda_Input(ui_qxtech_file)]
+      set bc_qx_tech_file [file normalize $rda_Input(ui_qxtech_file)]
+   }
+   
+   
+#   if {$wc_cap_table == ""} {
+#      Puts "--------------------------------------------------------------------------------------" 
+#      Puts "\[PQRS\]\[ERROR\] No cap tables defined for this testcase ... aborting"
+#      Puts "--------------------------------------------------------------------------------------" 
+#      exit 1
+#   }
+   
+   if {([info exists dgn_max_temp] == 0) || ([info exists dgn_max_temp] && $dgn_max_temp == "")} {
+      set max_temp ""
+   } else {
+      set max_temp $dgn_max_temp
+   }
+   
+   if {([info exists dgn_min_temp] == 0) || ([info exists dgn_min_temp] && $dgn_min_temp == "")} {
+      set min_temp ""
+   } else {
+      set min_temp [expr abs($dgn_min_temp)]
+   }
+
+   set pre_route_res_factor $rda_Input(ui_preRoute_res)
+   set pre_route_clk_res_factor 1.0
+   set post_route_res_factor $rda_Input(ui_postRoute_res)
+   set post_route_clk_res_factor "1.0 1.0 1.0"
+   set pre_route_cap_factor $rda_Input(ui_preRoute_cap)
+   set pre_route_clk_cap_factor 1.0
+   set post_route_cap_factor $rda_Input(ui_postRoute_cap)
+   set post_route_clk_cap_factor "1.0 1.0 1.0"
+   set post_route_xcap_factor $rda_Input(ui_postRoute_xcap)
+   set shrink_factor $rda_Input(ui_shr_scale)
+#   set relative_c_thresh $rda_Input(ui_rel_c_thresh)
+#   set total_c_thresh $rda_Input(ui_tot_c_thresh)
+#   set coupling_c_thresh $rda_Input(ui_cpl_c_thresh)
+
+   create_rc_corner -name rc_max  \
+                    -preRoute_res $pre_route_res_factor \
+                    -preRoute_clkres $pre_route_clk_res_factor \
+                    -preRoute_cap $pre_route_cap_factor \
+                    -preRoute_clkcap $pre_route_clk_cap_factor \
+                    -postRoute_res $post_route_res_factor \
+                    -postRoute_clkres $post_route_clk_res_factor \
+                    -postRoute_cap $post_route_cap_factor \
+                    -postRoute_clkcap $post_route_clk_cap_factor \
+                    -postRoute_xcap $post_route_xcap_factor
+  
+   if {$wc_cap_table != ""} {
+      update_rc_corner -name rc_max -cap_table $wc_cap_table
+   }
+   if {$max_temp != ""} {
+      update_rc_corner -name rc_max -T $max_temp
+   }
+
+   if {$wc_qx_tech_file != "" } {
+      update_rc_corner -name rc_max -qx_tech_file $wc_qx_tech_file
+   }
+    
+   create_rc_corner -name rc_min  \
+                    -preRoute_res $pre_route_res_factor \
+                    -preRoute_clkres $pre_route_clk_res_factor \
+                    -preRoute_cap $pre_route_cap_factor \
+                    -preRoute_clkcap $pre_route_clk_cap_factor \
+                    -postRoute_res $post_route_res_factor \
+                    -postRoute_clkres $post_route_clk_res_factor \
+                    -postRoute_cap $post_route_cap_factor \
+                    -postRoute_clkcap $post_route_clk_cap_factor \
+                    -postRoute_xcap $post_route_xcap_factor
+   
+   if {$bc_cap_table != ""} {
+      update_rc_corner -name rc_min -cap_table $bc_cap_table
+   }
+   if {$min_temp != ""} {
+      update_rc_corner -name rc_min -T $min_temp
+   }
+
+   if {$bc_qx_tech_file != "" } {
+      update_rc_corner -name rc_min -qx_tech_file $bc_qx_tech_file
+   }
+    
+   if {[info exists slow_cdbs] && ($slow_cdbs != "")} {
+      create_library_set -name libs_max -timing $slow_libs -si $slow_cdbs 
+      create_library_set -name libs_min -timing $fast_libs -si $fast_cdbs 
+   } else {
+      create_library_set -name libs_max -timing $slow_libs
+      create_library_set -name libs_min -timing $fast_libs
+   }
+   
+   create_delay_corner -name corner_max -library_set libs_max -rc_corner rc_max
+   create_delay_corner -name corner_min -library_set libs_min -rc_corner rc_min
+   Puts "\[INFO\] create_constraint_mode setup_func_mode with "
+   Puts "\[INFO\]   SDC files: $sdc_files"
+   if {$ilm_sdc_files != ""} {
+     Puts "\[INFO\]   ILM SDC files: $ilm_sdc_files" 
+     create_constraint_mode -name setup_func_mode -sdc_files $sdc_files -ilm_sdc_files ilm_sdc_files
+   } else {
+     create_constraint_mode -name setup_func_mode -sdc_files $sdc_files 
+   }
+   create_analysis_view -name setup_func -constraint_mode setup_func_mode -delay_corner corner_max
+#   Puts "\[INFO\] create_constraint_mode hold_func_mode with "
+#   Puts "\[INFO\]   SDC files: $sdc_files"
+#   if {$ilm_sdc_files != ""} {
+#     Puts "\[INFO\]   ILM SDC files: $ilm_sdc_files" 
+#     create_constraint_mode -name hold_func_mode -sdc_files $sdc_files -ilm_sdc_files ilm_sdc_files
+#   } else {
+#     create_constraint_mode -name hold_func_mode -sdc_files $sdc_files 
+#   }
+   create_analysis_view -name hold_func -constraint_mode setup_func_mode -delay_corner corner_min
+   set_analysis_view -setup {setup_func} -hold {hold_func} 
+   set_default_view -setup {setup_func} -hold {hold_func} 
+   set_interactive_constraint_modes [all_constraint_modes -active] 
+}
+
+proc create_lp_config_file {} {
+
+   global vars
+
+   set op [open lp_config.auto.tcl w]
+
+   if {[file exists setup.auto.tcl]} {
+      source setup.auto.tcl
+   }
+   if {[file exists innovus_config.auto.tcl]} {
+      source innovus_config.auto.tcl
+   }
+
+   puts $op "##########################################################################################"
+   puts $op "# Low power configuration file overlay.  This file contains foundation flow variables"
+   puts $op "# that are specific to the LP flow and should be used in addition to the setup.tcl"
+   puts $op "##########################################################################################"
+   puts $op "#                           Tie cell information"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# The variable vars(tie_cells) is defined in the setup.tcl and is used to define a "
+   puts $op "# \"global\" tie cell list. This list will be used by default for each power domain."
+   puts $op "# It can be overridden for a given power domain by setting vars(,tie_cells)."
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "#"
+   puts $op "##########################################################################################"
+   puts $op "#                         Placement Options"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "#set vars(resize_shifter_and_iso_insts) "
+   puts $op "#"
+   if {[info exists vars(power_domains)]} {
+      foreach domain $vars(power_domains) {
+         if {[info exists vars(tie_cells)]} {
+            puts $op "# set vars($domain,tie_cells)\t\"$vars(tie_cells)\""
+         } else {
+            puts $op "# set vars($domain,tie_cells)    >"
+         }
+      }
+   }
+   puts $op "#"
+   puts $op "##########################################################################################"
+   puts $op "#                         Filler cell information"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# The variable vars(filler_cells) is defined in the setup.tcl and is used to define a "
+   puts $op "# \"global\" filler cell list. This list will be used by default for each power domain."
+   puts $op "# It can be overridden for a given power domain by setting vars(,filler_cells)."
+   puts $op "# ----------------------------------------------------------------------------------------"
+   if {[info exists vars(power_domains)]} {
+      foreach domain $vars(power_domains) {
+         if {[info exists vars(filler_cells)]} {
+            puts $op "# set vars($domain,filler_cells)\t\"$vars(filler_cells)\""
+         } else {
+            puts $op "# set vars($domain,filler_cells) >"
+         }
+      }
+   }
+   puts $op "#"
+   puts $op "##########################################################################################"
+   puts $op "#                          Welltap cell information"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# The variable vars(welltaps) is defined in the setup.tcl and is used to define a "
+   puts $op "# \"global\" welltap cell list. This list will be used by default for each power domain."
+   puts $op "# It can be overridden for a given power domain by setting vars(,welltaps)."
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "#    verify_rule : maximum distance (in microns) between welltap cells and standard cells "
+   puts $op "#                  in microns"
+   puts $op "#        max_gap : specifies the maximum distance from the right edge of one well-tap cell "
+   puts $op "#                  to the left edge of  the following well-tap cell in the same row"
+   puts $op "#  cell_interval : specifies the maximum distance from the center of one well-tap cell "
+   puts $op "#                  to the center of the following well-tap cell in the same row"
+   puts $op "#"
+   puts $op "# NOTE: max_gap and cell_interval parameters are mutually exclusive, user has to define "
+   puts $op "#       only one of these parameters to add welltap cells"
+   puts $op "#"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   if {[info exists vars(power_domains)]} {
+      foreach domain $vars(power_domains) {
+         if {[info exists vars(welltaps)]} {
+            puts $op "# set vars($domain,vars(welltaps))                 >"
+         } else {
+            puts $op "# set vars($domain,welltaps)                 >"
+         } 
+         puts $op "# set vars($domain,welltaps,checkerboard)  "
+         puts $op "# set vars($domain,welltaps,max_gap)       "
+         puts $op "# set vars($domain,welltaps,cell_interval) "
+         puts $op "# set vars($domain,welltaps,row_offset)    "
+         puts $op "# set vars($domain,welltaps,verify_rule)   "
+      }
+   }
+   puts $op "#"
+   puts $op "##########################################################################################"
+   puts $op "#                          Endcap cell information"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# The variables vars(pre_endcap) and vars(post_endcap) are set in the setup.tcl file and"
+   puts $op "# are used to define \"global\" endcap cells. These used by default for each power domain."
+   puts $op "# They can be overridden for a given power domain setting vars(,pre_endcap)"
+   puts $op "# and/or vars(,post_endcap)."
+   puts $op "# ----------------------------------------------------------------------------------------"
+   if {[info exists vars(power_domains)]} {
+      foreach domain $vars(power_domains) {
+         puts $op "# set vars($domain,pre_endcap)  
>"
+         puts $op "# set vars($domain,post_endcap) >"
+      }
+   }
+   puts $op "#"
+   puts $op "##########################################################################################"
+   puts $op "#                            Always on net buffering"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# By default SOCE does always-on-net synthesis for SRPG control signal and PSO enable "
+   puts $op "# signals as part of optDesign -preCTS, but this can be manually done for specific nets if"
+   puts $op "# necessary.  To do this, define the following variables and uncomment the pre_prects.tcl"
+   puts $op "# plug-in template"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# set vars(always_on_buffers)                   "
+   puts $op "# set vars(always_on_nets)                      "
+   puts $op "# set vars(always_on_nets,max_fanout)            (optional)"
+   puts $op "# set vars(always_on_nets,max_tran)              (optional)"
+   puts $op "# set vars(always_on_nets,max_skew)              (optional)"
+   puts $op "# set vars(always_on_nets,max_delay)             (optional)"
+   if {[info exists vars(power_domains)]} {
+      foreach domain $vars(power_domains) {
+         puts $op "# set vars($domain,always_on_buffers)  >"
+      }
+   }
+   puts $op "#"
+   puts $op "##########################################################################################"
+   puts $op "#                      Secondary power/ground routing"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# Automatic secondary power routing can be enabled the foundation flows by setting "
+   puts $op "# vars(route_secondary_pg_nets) to true and providing cell pin pair information to"
+   puts $op "# identify the connections requiring routing (PTBUFFD1:TVDD LVLLHCD4:VDDL, e.g.) "
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# set vars(route_secondary_pg_nets)         \[true | false\]"
+   puts $op "# set vars(secondary_pg,cell_pin_pairs)     "
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "#In addition, the following can optionally defined either globally or per p/g net"
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# set vars(secondary_pg,max_fanout)           "
+   puts $op "# set vars(secondary_pg,pattern)              "
+   puts $op "# set vars(secondary_pg,non_default_rule)     "
+   puts $op "# ----------------------------------------------------------------------------------------"
+   puts $op "# To optionally override for a given p/g net(s), use the vars(route_secondary_pg_nets) to "
+   puts $op "# define the list of nets to be overridden and then override vars(

,

,max_fanout) " + puts $op "# set vars(

,pattern) " + puts $op "# set vars(

,non_default_rule) " + puts $op "#" + puts $op "##########################################################################################" + puts $op "# runCLP options" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(clp_options) " + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(clp_options) \"\"" + puts $op "#" + puts $op "##########################################################################################" + puts $op "# Modify power domains, row creation for power domains" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# The foundation flows contain a sample post_init_tcl (PLUG/post_init.tcl) plug-in to do " + puts $op "# power domain modification automatically based on the folloing variables:" + puts $op "# ----------------------------------------------------------------------------------------" + if {[info exists vars(power_domains)]} { + foreach domain $vars(power_domains) { + puts $op "# set vars($domain,bbox) ; bondary coordinates in microns" + puts $op "# set vars($domain,rs_exts) ; distance in microns " + puts $op "# set vars($domain,min_gaps) ; distance in microns" + } + } + puts $op "#" + puts $op "##########################################################################################" + puts $op "# Power Shut-off Planning " + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# The foundation flows contain a sample post_init_tcl (PLUG/post_init.tcl) plug-in to do " + puts $op "# power switch insertion automatically based on the following information:" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(,switchable) " + puts $op "# set vars(,switch_type) " + puts $op "# set vars(,switch_cell) " + puts $op "# set vars(,input_enable_pin) " + puts $op "# set vars(,output_enable_pin) " + puts $op "# set vars(,input_enable_net) " + puts $op "# set vars(,output_enable_net) " + puts $op "# set vars(,switch_instance) " + puts $op "# set vars(,top_offset) " + puts $op "# set vars(,bottom_offset) " + puts $op "# set vars(,right_offset) " + puts $op "# set vars(,left_offset) " + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# Below variables are for column based pso implemetation" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(,checker_board) " + puts $op "# set vars(,horizonal_pitch) " + puts $op "# set vars(,column_height) " + puts $op "# set vars(,skip_rows) " + puts $op "# set vars(,back_to_back_chain) " + puts $op "# ... Connects the enableNetOut at the top of a column to the enableNetIn at the top of " + puts $op "# ... the next column, and connects the enableNetOut at the bottom of the column to the " + puts $op "# ... enableNetIn at the bottom of the next column" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# Below variables are for ring based pso implemetation" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(,top_ring) <1|0>" + puts $op "# set vars(,bottom_ring) <1|0>" + puts $op "# set vars(,right_ring) <1|0>" + puts $op "# set vars(,left_ring) <1|0>" + puts $op "# ... defines which side of the power domain to insert switches:" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(,top_switch_cell) " + puts $op "# set vars(,bottom_switch_cell) " + puts $op "# set vars(,left_switch_cell) " + puts $op "# set vars(,right_switch_cell) " + puts $op "# ... define pso cell name for each side of the power domain" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(,top_filler_cell) " + puts $op "# set vars(,bottom_filler_cell) " + puts $op "# set vars(,left_filler_cell) " + puts $op "# set vars(,right_filler_cell) " + puts $op "# set vars(,corner_cell_list) " + puts $op "# ... define filler cell name for each side of the power domain" + puts $op "# ----------------------------------------------------------------------------------------" + puts $op "# set vars(,distribute) " + puts $op "# set vars(,top_switches) " + puts $op "# set vars(,bottom_switches) " + puts $op "# set vars(,left_switches) " + puts $op "# set vars(,right_switches) " + puts $op "# ... define the number of switches for each side of the power domain" + puts $op "#" + + close $op + + Puts " ------------------------------------------------------------------------------------" + Puts " Created low power config file \"lp_config.auto.tcl\"" + Puts " This file is used to define variables specific to the LP foundation flow." + Puts " All the informaiton in this file is optional but is intended to help " + Puts " automate some of the most common LP commands. Please edit and copy" + Puts " to lp_config.tcl to enable (make sure it is sourced from setup.tcl)." + +} + +proc create_invs_tag_file {} { + + global vars + global tags + + set steps [list "feedthrough" "assign_pin" "model_gen" "partition" \ + "init" "place" "prects" "cts" "postcts" "postcts_hold" "route" \ + "postroute" "postroute_hold" "signoff" "assemble"] + + set tags(init) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + set_distribute_host \ + set_multi_cpu_usage \ + set_rc_factor \ + derate_timing \ + create_rc_corner \ + create_library_set \ + create_delay_corner \ + create_constraint_mode \ + create_analysis_view \ + update_delay_corner \ + update_library_set \ + derate_timing \ + set_default_view \ + set_power_analysis_mode \ + init_design \ + load_floorplan \ + generate_tracks \ + load_cpf \ + commit_cpf \ + read_activity_file \ + specify_ilm \ + load_ilm_non_sdc_file \ + initialize_timing \ + load_scan \ + specify_spare_gates \ + set_dont_use \ + set_max_route_layer \ + set_design_mode \ + insert_welltaps_endcaps \ + time_design \ + check_design \ + check_timing \ + report_power_domains \ + ff_replace_flexmodel_with_full_netlist \ + ] + set tags(place) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + restore_design \ + initialize_step \ + set_design_mode \ + set_delay_cal_mode \ + set_place_mode \ + set_opt_mode \ + set_tie_hilo_mode \ + cleanup_specify_clock_tree \ + specify_clock_tree \ + specify_jtag \ + place_jtag \ + place_design \ + place_opt_design \ + add_tie_cells \ + time_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(prects) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_ilm_type \ + cleanup_specify_clock_tree \ + create_clock_tree_spec \ + specify_clock_tree \ + set_useful_skew_mode \ + set_opt_mode \ + set_design_mode \ + set_delay_cal_mode \ + set_dont_use \ + opt_design \ + ck_clone_gate \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(cts) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_cts_mode \ + set_ccopt_mode \ + set_nanoroute_mode \ + enable_clock_gate_cells \ + cleanup_specify_clock_tree \ + create_clock_tree_spec \ + specify_clock_tree \ + clock_design \ + ccopt_design \ + disable_clock_gate_cells \ + run_clock_eco \ + update_timing \ + time_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(postcts) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_delay_cal_mode \ + set_analysis_mode \ + set_opt_mode \ + opt_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(postcts_hold) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_dont_use \ + set_opt_mode \ + opt_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(route) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_nanoroute_mode \ + add_filler_cells \ + route_secondary_pg_nets \ + check_place \ + route_design \ + run_clock_eco \ + spread_wires \ + initialize_timing \ + time_design \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(postroute) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_design_mode \ + set_extract_rc_mode \ + set_analysis_mode \ + set_delay_cal_mode \ + add_metalfill \ + opt_design \ + trim_metalfill \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(postroute_hold) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_step \ + set_dont_use_mode \ + set_opt_mode \ + opt_design \ + trim_metalfill \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + ] + set tags(signoff) [list \ + set_distribute_host \ + set_multi_cpu_usage \ + initialize_timing \ + initialize_step \ + set_analysis_mode \ + set_extract_rc_mode \ + extract_rc \ + dump_spef \ + signoff_time_design \ + time_design_setup \ + time_design_hold \ + stream_out \ + save_oa_design \ + create_ilm \ + summary_report \ + verify_connectivity \ + verify_geometry \ + verify_metal_density \ + verify_process_antenna \ + save_design \ + report_power \ + verify_power_domain \ + run_clp \ + + ] + set tags(feedthrough) [list \ + initialize_timing \ + load_cpf \ + commit_cpf \ + run_clp_init \ + save_init_dbs \ + set_budgeting_mode \ + update_constraint_mode \ + set_ptn_user_cns_file \ + set_place_mode \ + set_proto_model \ + place_design \ + time_design \ + save_place_dbs \ + insert_ptn_feedthrough \ + trial_route \ + trial_route_time_design \ + ] + set tags(assign_pin) [list \ + assign_ptn_pins \ + check_pin_assignment \ + report_unaligned_nets \ + trial_route \ + ] + set tags(model_gen) [list \ + create_ps_per_micron_model \ + identify_proto_model \ + report_proto_model \ + setIlmMode \ + create_proto_model \ + create_flexfiller_route_blockage \ + report_proto_model \ + saveDesign \ + ] + set tags(partition) [list \ + time_design_proto \ + set_pspm_vars \ + set_budgeting_mode \ + set_ptn_pin_status \ + derive_timing_budget \ + save_budget_dbs \ + run_clp \ + partition \ + save_partition \ + ] + set tags(assemble) [list \ + assemble_design \ + specify_ilm \ + load_ilm_non_sdc_file \ + load_cpf \ + commit_cpf \ + initialize_timing \ + update_timing \ + pre_signoff_eco_verify_connectivity \ + pre_signoff_eco_verify_geometry \ + set_module_view \ + delete_filler_cells \ + opt_design \ + extract_rc \ + signoff_opt_design \ + signoff_time_design \ + add_filler_cells \ + eco_route \ + post_signoff_eco_verify_connectivity \ + post_signoff_eco_verify_geometry \ + ] + + set op [open invs.auto.tcl w] + + puts $op "##########################################################################################" + puts $op "# CDNS FOUNDATION FLOW" + puts $op "#-----------------------------------------------------------------------------------------" + puts $op "# This is the foundation flow tags file. Each flow step is a sequence of commands and" + puts $op "# each command has a tag associated with it and each tag has four attributes:" + puts $op "#-----------------------------------------------------------------------------------------" + puts $op "# pre_tcl -> file to be sourced prior to the command" + puts $op "# post_tcl -> file to be sourced after the command" + puts $op "# replace_tcl -> file to be sourced instead of the command" + puts $op "# skip -> skip the command entirely (true | false)" + puts $op "#-----------------------------------------------------------------------------------------" + puts $op "# These attributes provide more granularity that the plug-ins and are intended to" + puts $op "# allow for flow customization at a very detailed level. To enable, simply uncomment" + puts $op "# the tag, assign the appropriate value, and make sure this file gets sourced" + puts $op "# from the setup.tcl or innovus_config.tcl. Keep in mind, these tags will only" + puts $op "# be evaluated if the command they are associated is executed as part of the flow" + puts $op "#-----------------------------------------------------------------------------------------" + puts $op "# verbose -> Print tag related comments for imported tags" + puts $op "# verbosity_level -> Print tag related comments for ALL possible tags \[LOW | HIGH\]" + puts $op "#-----------------------------------------------------------------------------------------" + + foreach step $steps { + foreach command $tags($step) { + foreach tag "pre_tcl post_tcl replace_tcl skip" { + set string "#set vars($step,$command,$tag)" + set length [string length $string] + set diff [expr 60-$length] + set spaces [string repeat " " $diff] + if {$tag == "skip"} { + puts $op [format "%s%s%s" $string $spaces ""] + } else { + puts $op [format "%s%s%s" $string $spaces ""] + } + } + } + puts $op "# ----------------------------------------------------------------------------------------" + } + +} + +proc pad {a {add 0}} { + + if {[expr [string length $a] + $add] < 6} { + return "\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 12} { + return "\t\t\t" + } elseif {[expr [string length $a] + $add] < 18} { + return "\t\t" + } elseif {[expr [string length $a] + $add] < 24} { + return "\t" + } + +} + +proc format_string {a b {large 0}} { + + set add 0 + + if {[regexp "#" $a]} { + regsub "#" $a "" a + set add 1 + } + +# puts "$a, [string length $a]" + + if {$large} { + if {[expr [string length $a] + $add] < 4} { + set tabs "\t\t\t\t\t\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 8} { + set tabs "\t\t\t\t\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 12} { + set tabs "\t\t\t\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 16} { + set tabs "\t\t\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 20} { + set tabs "\t\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 24} { + set tabs "\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 28} { + set tabs "\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 32} { + set tabs "\t\t\t" + } else { + set tabs "\t\t" + } + } else { + if {[expr [string length $a] + $add] < 4} { + set tabs "\t\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 8} { + set tabs "\t\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 12} { + set tabs "\t\t\t\t" + } elseif {[expr [string length $a] + $add] < 16} { + set tabs "\t\t\t" + } elseif {[expr [string length $a] + $add] < 20} { + set tabs "\t\t" + } else { + set tabs "\t" + } + } + + # Handle the empty string correctly + if {$b == {}} { set b {{}} } + + if {$add} { + return [format "#set $a%s%s" $tabs $b] + } else { + return [format "set $a%s%s" $tabs $b] + } +} + +proc get_line_match {pattern file {last 1}} { + + set ip [open $file r] + + while {[gets $ip line]>=0} { + if {[regexp "$pattern" $line]>0} { + if {$last} { + set match $line + } else { + lappend match $line + } + } + } + if {[info exists match]} { + return $match + } +} + +set op1 [open setup.auto.tcl w] +set op2 [open innovus_config.auto.tcl w] + +puts $op1 "##########################################################################################" +puts $op1 "# CDNS FOUNDATION FLOW" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# This is the foundation flow setup file. It contains all the necessary design" +puts $op1 "# data to drive all the CDNS foundation flows. Each flow can also have an" +puts $op1 "# additional configuration file to define flow specific information:" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# INNOVUS -> innovus_config.tcl (for flat and hier implementation flows)" +puts $op1 "# + lp_config.tcl (additional information for flat and hier lp flows)" +#puts $op1 "# -> proto_config.tcl (for the prototyping flow)" +#puts $op1 "# ETS -> ets_config.tcl" +#puts $op1 "# EPS -> eps_config.tcl" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# A single setup.tcl is all that is required. These additional files are to enable " +puts $op1 "# the sharing of a setup.tcl (design data) amongst design groups while also allowing" +puts $op1 "# different flow options to be set in the *_config.cl files for different blocks or runs" +puts $op1 "##########################################################################################" +puts $op1 "" + +puts $op2 "##########################################################################################" +puts $op2 "# INNOVUS FOUNDATION FLOW" +puts $op2 "#-----------------------------------------------------------------------------------------" +puts $op2 "# This is the INNOVUS foundation flow configuration file. It contains all the necessary flow" +puts $op2 "# options to drive the CDNS flat and/or hier implementation flows. " +puts $op2 "# For low power flows, an optional/additional configuration file (lp_config.tcl) can be " +puts $op2 "# used to enable low power foundation flow features and define domain specific information." +puts $op2 "#-----------------------------------------------------------------------------------------" +if {![info exists vars(version)]} { + set vars(version) 17.1.0 +} +if {[lindex [split $vars(version) "."] 0] <= 10 && [llength [all_analysis_views]] == 2} { + puts "Converting default timing environment to MMMC" + conv2mmmc +} + +global rda_Input + +puts $op1 "##########################################################################################" +puts $op1 "# The variable vars(version) tells the code generator which version of INNOVUS you will be" +puts $op1 "# targeting." +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "set vars(version) $vars(version)" +#puts $op1 "##########################################################################################" +#puts $op1 "# For non-codgen flow, the following must be set - it should point to the foundation " +#puts $op1 "# flow installation directory" +puts $op1 "#-----------------------------------------------------------------------------------------" +#puts $op1 "#set vars(script_root) SCRIPTS" +#puts $op1 "" +#puts $op2 "# The vars(flow) variable can be used to define the type of flow to run. If not set," +#puts $op2 "# mmmc will be used. Supported values are:" +#puts $op2 "# - default (minmax timing)" +#puts $op2 "# - pr_mmmc (minmax timing pre-route, mmmc timing post-route)" +#puts $op2 "# - mmmc (mmmc timing)" +#puts $op2 "##########################################################################################" +#if {[info exists ::CPF::cpfCommitted]} { +# puts $op2 "set vars(flow) mmmc" +#} else { +# puts $op2 "set vars(flow) default" +#} +puts $op2 "set vars(plug_dir) PLUG/INNOVUS" +puts $op2 "set vars(dbs_dir) DBS" +puts $op2 "set vars(log_dir) LOG" +puts $op2 "set vars(rpt_dir) RPT" +puts $op2 "# You can set a report directory per step using vars(,rpt_dir) ..." +puts $op2 "" + +if {[info exists rda_Input(ui_netlist)]} { + set vars(netlist) [list] + foreach file $rda_Input(ui_netlist) { + lappend vars(netlist) [file normalize $file] + } +} else { + catch {set vars(netlist) [file normalize [lindex [get_line_match "Reading netlist file" [getLogFileName]] 3]]} +} +catch {set vars(fp_file) [file normalize [lindex [get_line_match "Reading floorplan" [getLogFileName]] 4]]} +#catch {set vars(cts_spec) [regsub -all "'" [lindex [get_line_match "Reading clock tree spec file" [getLogFileName]] 5] ""]} +#catch {set vars(cts_spec) [regsub -all "\"" $vars(cts_spec)] ""} +set vars(cts_spec) "" +set specOpt [ckGetCkSpecOption] + for { set i 0 } { $i < [llength $specOpt] } { incr i } { + if { [string match -nocase [lindex $specOpt $i] "-file" ] || [string match -nocase [lindex $specOpt $i] "-specFile" ] } { + incr i + set clkFile [lindex $specOpt $i] + if { [file exists $clkFile ] } { + if { [lsearch -exact $vars(cts_spec) $clkFile] == -1 } { + lappend vars(cts_spec) [file normalize $clkFile] + } + } + } +} + +foreach option [getDesignMode -quiet] { + if {[lindex $option 0] == "process"} { + set vars(process) [lindex $option 1]nm + } +} +catch {set vars(max_route_layer) [getMaxRouteLayer]} + +puts $op1 "########################################################################################" +puts $op1 "# Define design data ..." +puts $op1 "########################################################################################" +puts $op1 [format_string vars(design) [dbCellName [dbgTopCell]]] + +if {[lindex [split $vars(version) "."] 0] > 10} { + if {[info exists init_verilog] && ($init_verilog != "")} { + set vars(netlist) $init_verilog + } + if {[info exists init_oa_ref_lib] && ($init_oa_ref_lib != "")} { + set vars(oa_ref_lib) $init_oa_ref_lib + } +# catch {set restore_design [get_line_match "restoreDesign" [getLogFileName]} +# set vars(netlist_type) oa +# set vars(oa_design_lib) [lindex $restore_design 1] +# set vars(oa_design_cell) [lindex $restore_design 2] +# set vars(oa_design_view) [lindex $restore_design 3] + if {[info exists init_abstract_view] && ($init_abstract_view != "")} { + set vars(oa_abstract_name) $init_abstract_view + } + if {[info exists init_oa_design_lib] && ($init_oa_design_lib != "")} { + set vars(oa_design_lib) $init_oa_design_lib + } + if {[info exists init_oa_design_cell] && ($init_oa_design_cell != "")} { + set vars(oa_design_cell) $init_oa_design_cell + } + if {[info exists init_oa_design_view] && ($init_oa_design_view != "")} { + set vars(oa_design_view) $init_oa_design_view + } + if {[info exists init_abstract_view] && ($init_abstract_view != "")} { + set vars(oa_abstract_name) $init_abstract_view + } + if {[info exists init_layout_view] && ($init_layout_view != "")} { + set vars(oa_layout_name) $init_layout_view + } + puts $op1 "#########################################################################################" + puts $op1 "# Variables for OA design import and export" + puts $op1 "# ---------------------------------------------------------------------------------------" + if {[info exists vars(oa_design_lib)]} { + puts $op1 "set vars(netlist_type) oa" + puts $op1 "set vars(oa_design_lib) $vars(oa_design_lib)" + } else { + puts $op1 "#set vars(oa_design_lib) " + } + if {[info exists vars(oa_design_cell)]} { + puts $op1 "set vars(oa_design_cell) $vars(oa_design_cell)" + } else { + puts $op1 "#set vars(oa_design_cell) " + } + if {[info exists vars(oa_design_view)]} { + puts $op1 "set vars(oa_design_view) $vars(oa_design_view)" + } else { + puts $op1 "#set vars(oa_design_view) " + } + puts $op1 "#set vars(dbs_format) oa" + if {[info exists vars(oa_ref_lib)]} { + puts $op1 "set vars(oa_ref_lib) $vars(oa_ref_lib)" + } else { + puts $op1 "#set vars(oa_ref_lib) " + } + if {[info exists vars(oa_abstract_name)]} { + puts $op1 "set vars(oa_abstract_name) $vars(oa_abstract_name)" + } else { + puts $op1 "#set vars(oa_abstract_name) " + } + if {[info exists vars(oa_layout_name)]} { + puts $op1 "set vars(oa_layout_name) $vars(oa_layout_name)" + } else { + puts $op1 "#set vars(oa_layout_name) " + } + if {[info exists vars(netlist)]} { +# puts $op1 [format "set vars(netlist)%s%s" [pad vars(netlist)] $vars(netlist)] + puts $op1 [format_string vars(netlist) \"$vars(netlist)\"] + puts $op1 [format_string vars(netlist_type) verilog] + } + puts $op1 "#########################################################################################" +} else { + if {[info exists vars(netlist)]} { +# puts $op1 [format "set vars(netlist)%s%s" [pad vars(netlist)] $vars(netlist)] + puts $op1 [format_string vars(netlist) \"$vars(netlist)\"] + puts $op1 [format_string vars(netlist_type) verilog] + } + puts $op1 "#########################################################################################" + puts $op1 "# Variables for OA design import and export" + puts $op1 "# ---------------------------------------------------------------------------------------" + puts $op1 "#set vars(oa_design_lib) " + puts $op1 "#set vars(oa_design_cell) " + puts $op1 "#set vars(oa_design_view) " + puts $op1 "#set vars(oa_ref_lib) " + puts $op1 "#set vars(oa_abstract_name) " + puts $op1 "#set vars(oa_layout_name) " +} +if {[info exists vars(fp_file)]} { + puts $op1 [format_string vars(fp_file) $vars(fp_file)] +} else { + puts $op1 [format_string #vars(fp_file) ] +} +puts $op1 [format_string #vars(oa_fp) ] +puts $op1 [format_string #vars(def_files) ] +#puts $op1 "#set vars(scan_def) " +puts $op1 "# NOTE: vars(cts_spec) is only required for cts flows." +puts $op1 "# For ccopt flows, it is not required" +if {[file exists $vars(cts_spec)]} { + puts $op1 [format_string vars(cts_spec) \"$vars(cts_spec)\"] +} else { + puts $op1 [format_string #vars(cts_spec) ] +} +if {[info exists vars(process)]} { + puts $op1 [format_string vars(process) $vars(process)] +} else { + puts $op1 [format_string #vars(process) ] +} +if {[info exists vars(max_route_layer)]} { + puts $op1 [format_string vars(max_route_layer) $vars(max_route_layer)] +} else { + puts $op1 [format_string #vars(max_route_layer) ] +} +puts $op1 "# NOTE: When generate_tracks is set, the tracks in the DEF are ignored; even the pitch" +puts $op1 "# To generate new tracks but preserve the pitch, use vars(honor_pitch) true" +puts $op1 [format_string #vars(generate_tracks) ""] +puts $op1 [format_string #vars(honor_pitch) ""] +if {[info exists rda_Input(ui_pwrnet)] && ($rda_Input(ui_pwrnet) != "")} { + puts $op1 "set vars(power_nets) \"$rda_Input(ui_pwrnet)\"" +} else { + puts $op1 "#set vars(power_nets) " +} +if {[info exists rda_Input(ui_gndnet)] && ($rda_Input(ui_gndnet) != "")} { + puts $op1 "set vars(ground_nets) \"$rda_Input(ui_gndnet)\"" +} else { + puts $op1 "#set vars(ground_nets) " +} +puts $op1 "##########################################################################################" +puts $op1 "# For hierarchical designs, define vars(partition_list) which should be a list " +puts $op1 "# of all defined partitions (DO NOT INCLUDE THE TOP PARTITION)." +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# To assist the budgeting process, also define the following for each partition" +puts $op1 "# - set vars(,cts_spec) " +puts $op1 "# - set vars(,latency_sdc) " +puts $op1 "#" +puts $op1 "# These files should contain the expected clock latency for the clock tree(s)" +puts $op1 "# For example, if partition A has an expected clock latency of 500ps out of a total clock" +puts $op1 "# latency of 1ns, the top level constraints would have 'set_clock_latency 1.0 '" +puts $op1 "# and A would have a latency sdc file containing 'set_clock_latency 0.5 '" +puts $op1 "# Likewise, the top level CTS spec would contain 'MaxDelay 1ns' and the vars(A,cts_spec)" +puts $op1 "# would contain 'MacroModel A/ 500ps 500ps 500ps 500ps 0fF" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# During assembly, the foundation flow defaults to assembly the 'signoff' databases" +puts $op1 "# from each partition sub-directory. To specify a different database to use for any" +puts $op1 "# partition (including the top), specify the following:" +puts $op1 "# - vars(,assemble_dbs) " +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# If vars(use_flexmodels) is set to true, Flexmodels will be used. Some additional" +puts $op1 "# options for flexmodel usage are:" +puts $op1 "# set vars(use_proto_net_delay_model) false" +puts $op1 "# set vars(flexmodel_as_ptn) true" +puts $op1 "# set vars(flexmodel_art_based) true" +puts $op1 "# set vars(create_flexfiller_blockage) true" +puts $op1 "# set vars(enable_nrgr) true" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# If vars(insert_feedthrough) is set to true, feedthrough insertion will be called" +puts $op1 "# before partitioning. Some additional options for partitioning are:" +puts $op1 "# set vars(abutted_design) true" +puts $op1 "# set vars(placement_based_ptn) true" +puts $op1 "# set vars(budget_mode) { trial_ipo giga_opt proto_net_delay_model }" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# Flexilm creation can be enabled for the partitions, using vars(enable_flexilm) true" +puts $op1 "#-----------------------------------------------------------------------------------------" +puts $op1 "# Finally, each partition can have its own innovus_config.tcl (INCLUDING THE TOP PARTITION)." +puts $op1 "# To enable this, define vars(," +puts $op1 "##########################################################################################" +set vars(partition_list) "" +dbForEachCellPtn [dbGet top] ptn { + lappend vars(partition_list) [dbPtnName $ptn] +} +if {$vars(partition_list) != ""} { + puts $op1 "set vars(partition_list) \[list $vars(partition_list)\]" + foreach part $vars(partition_list) { + puts $op1 "#set vars($part,cts_spec) " + puts $op1 "#set vars($part,latency_sdc) " + puts $op1 "#set vars($part,assemble_dbs) " + puts $op1 "#set vars($part,ilm_dir) " + puts $op1 "#set vars($part,lef_file) " + puts $op1 "#set vars($part,innovus_config_tcl) " + } +} else { + puts $op1 "#set vars(partition_list) " + puts $op1 "#set vars(,cts_spec) " + puts $op1 "#set vars(,latency_sdc) " + puts $op1 "#set vars(,assemble_dbs) " + puts $op1 "#set vars(,ilm_dir) " + puts $op1 "#set vars(,lef_file) " + puts $op1 "#set vars(,innovus_config_tcl) " +} + +if {(![catch {dbGet top.isProtoModelCommitted} val]) && $val} { + puts $op1 "set vars(use_flexmodels) true" +} else { + puts $op1 "#set vars(use_flexmodels) " +} + +puts $op1 "" + +puts $op1 "########################################################################################" +puts $op1 "# Optionally define user ILMs to be specified during the flow. These will be specified " +puts $op1 "# during the flat init step and the hierarchical partitioning step. The ILMs should" +puts $op1 "# not be hierarhical partitions (they are handled automatically. See below for " +puts $op1 "# handling partition ILMs during post assembly closure." +puts $op1 "# - vars(ilm_list) " +puts $op1 "# - vars(,ilm_dir) " +puts $op1 "# - vars(,lef_file) " +puts $op1 "########################################################################################" +puts $op1 "# set vars(ilm_list) \[list\]" +if {[info exists rda_Input(ui_ilmdir)] && ($rda_Input(ui_ilmdir) != "")} { + set ilm_list [list] + for {set i 0} {$i < [llength $rda_Input(ui_ilmdir)]} {incr i} { + set ilm [lindex $rda_Input(ui_ilmdir) $i] + incr i + set dir [lindex $rda_Input(ui_ilmdir) $i] + lappend ilm_list $ilm + set vars($ilm,ilm_dir) $dir + } + if {$ilm_list != ""} { + puts $op1 "set vars(ilm_list) \[list $ilm_list\]" + foreach ilm $ilm_list { + puts $op1 "set vars($ilm,ilm_dir) $vars($ilm,ilm_dir)" + } + } +} +puts $op1 "########################################################################################" +puts $op1 "# Define lef files ..." +puts $op1 "########################################################################################" +puts $op1 "set vars(lef_files) \"\\" +foreach file $rda_Input(ui_leffile) { + puts $op1 " [file normalize $file] \\" +} +puts $op1 "\"" + +puts $op1 "########################################################################################" +puts $op1 "# Define library sets ..." +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(library_sets) " +puts $op1 "# set vars(,timing) " +puts $op1 "# set vars(,si) " +puts $op1 "########################################################################################" +set library_sets [list] + +foreach library_set [all_library_sets] { + if {[llength [all_library_sets]] > 2} { +# if {[regexp "^default" $library_set] == 0} { + if {[info exists ::CPF::cpfCommitted]} { + if {([regexp "^domain_" $library_set] == 0)} { + lappend library_sets $library_set + } + } else { + lappend library_sets $library_set + } +# } + } else { + lappend library_sets $library_set + } +} + +if {$library_sets != ""} { + puts $op1 "set vars(library_sets) \"$library_sets\"" +} + +foreach library_set $library_sets { + foreach option "timing si aocv" { + if {[get_library_set $library_set -$option] != ""} { + set file_list [get_library_set $library_set -$option] + puts $op1 "set vars($library_set,$option) \"\\" + foreach file $file_list { + puts $op1 " [file normalize $file] \\" + } + puts $op1 "\"" + } + } +} + +puts $op1 "########################################################################################" +puts $op1 "# Define rc corners ..." +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(rc_corners) " +puts $op1 "# set vars(,T) " +puts $op1 "# set vars(,cap_table) " +puts $op1 "########################################################################################" +set rc_corners [list] +foreach rc_corner [all_rc_corners] { +# if {[llength [all_rc_corners]] > 1} { +# if {[regexp "^default" $rc_corner ] == 0} { +# lappend rc_corners $rc_corner +# } +# } else { + lappend rc_corners $rc_corner +# } +} +if {$rc_corners != ""} { + puts $op1 "set vars(rc_corners) \"$rc_corners\"" +} +foreach rc_corner $rc_corners { + foreach option "T cap_table" { + if {[get_rc_corner $rc_corner -$option] != ""} { + if {$option == "cap_table"} { + puts $op1 "set vars($rc_corner,$option) [file normalize [get_rc_corner $rc_corner -$option]]" + } else { + puts $op1 "set vars($rc_corner,$option) [get_rc_corner $rc_corner -$option]" + } + } else { + if {($option == "T") && ([get_rc_corner $rc_corner -$option] == "")} { + puts $op1 "#set vars($rc_corner,$option) 25 ; # EDIT FOR CORRECT T VALUE" + } + if {($option == "cap_table") && ([get_rc_corner $rc_corner -$option] == "")} { + puts $op1 "#set vars($rc_corner,$option) ; # EDIT FOR CORRECT CAP TABLE DEFINITION" + } + } + } + puts $op1 "#set vars($rc_corner,atf_file)" +} + +puts $op1 "########################################################################################" +puts $op1 "# Optionally define QRC technology information" +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(,qx_tech_file) " +puts $op1 "# set vars(,qx_lib_file) " +puts $op1 "# set vars(,qx_conf_file) " +puts $op1 "########################################################################################" +foreach rc_corner $rc_corners { + foreach option "qx_tech_file qx_lib_file qx_conf_file" { + if {[get_rc_corner $rc_corner -$option] != ""} { + puts $op1 "set vars($rc_corner,$option) [file normalize [get_rc_corner $rc_corner -$option]]" + } + } +} + +puts $op1 "########################################################################################" +puts $op1 "# Scale factors are also optional but are strongly encouraged for pre_route optimization " +puts $op1 "# in order to obtain the best flow convergence and QoR. Scaling factors are applied per" +puts $op1 "# rc corner by setting the individual values OR via a scale_tcl file which must contain" +puts $op1 "# syntactically correct update_rc_corner commands for a given rc_corner" +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(,scale_tcl) " +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(,pre_route_res_factor) " +puts $op1 "# set vars(,pre_route_clk_res_factor) " +puts $op1 "# set vars(,post_route_res_factor) " +puts $op1 "# set vars(,post_route_clk_res_factor) " +puts $op1 "# set vars(,pre_route_cap_factor) " +puts $op1 "# set vars(,pre_route_clk_cap_factor) " +puts $op1 "# set vars(,post_route_cap_factor) " +puts $op1 "# set vars(,post_route_clk_cap_factor) " +puts $op1 "# set vars(,post_route_xcap_factor) " +puts $op1 "########################################################################################" + +foreach rc_corner $rc_corners { + if {[get_rc_corner $rc_corner -preRoute_res] != ""} { + puts $op1 "set vars($rc_corner,pre_route_res_factor) \t\t[format %4.2f [expr [get_rc_corner $rc_corner -preRoute_res]*1.0]]" + } + if {[get_rc_corner $rc_corner -preRoute_clkres] != ""} { + puts $op1 "set vars($rc_corner,pre_route_clk_res_factor) \t[format %4.2f [expr [get_rc_corner $rc_corner -preRoute_clkres]*1.0]]" + } + if {[get_rc_corner $rc_corner -postRoute_res] != ""} { + set triplets [get_rc_corner $rc_corner -postRoute_res] + set scalar [lindex $triplets 0] + if {[llength $scalar] == 1} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0] + } + if {[llength $scalar] == 2} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0] + } + if {[llength $scalar] == 3} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]] + } + puts $op1 "set vars($rc_corner,post_route_res_factor) \t\t\"$pstring\"" + } + if {[get_rc_corner $rc_corner -postRoute_clkres] != ""} { + set triplets [get_rc_corner $rc_corner -postRoute_clkres] + set scalar [lindex $triplets 0] + if {[llength $scalar] == 1} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0] + } + if {[llength $scalar] == 2} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0] + } + if {[llength $scalar] == 3} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]] + } + puts $op1 "set vars($rc_corner,post_route_clk_res_factor) \t\t\"$pstring\"" + } + if {[get_rc_corner $rc_corner -preRoute_cap] != ""} { + puts $op1 "set vars($rc_corner,pre_route_cap_factor) \t\t[format %4.2f [expr [get_rc_corner $rc_corner -preRoute_cap]*1.0]]" + } + if {[get_rc_corner $rc_corner -preRoute_clkcap] != ""} { + puts $op1 "set vars($rc_corner,pre_route_clk_cap_factor) \t[format %4.2f [expr [get_rc_corner $rc_corner -preRoute_clkcap]*1.0]]" + } + if {[get_rc_corner $rc_corner -postRoute_cap] != ""} { + set triplets [get_rc_corner $rc_corner -postRoute_cap] + set scalar [lindex $triplets 0] + if {[llength $scalar] == 1} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0] + } + if {[llength $scalar] == 2} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0] + } + if {[llength $scalar] == 3} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]] + } + puts $op1 "set vars($rc_corner,post_route_cap_factor) \t\t\"$pstring\"" + } + if {[get_rc_corner $rc_corner -postRoute_clkcap] != ""} { + set triplets [get_rc_corner $rc_corner -postRoute_clkcap] + set scalar [lindex $triplets 0] + if {[llength $scalar] == 1} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0] + } + if {[llength $scalar] == 2} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0] + } + if {[llength $scalar] == 3} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]] + } + puts $op1 "set vars($rc_corner,post_route_clk_cap_factor) \t\t\"$pstring\"" + } + if {[get_rc_corner $rc_corner -postRoute_xcap] != ""} { + set triplets [get_rc_corner $rc_corner -postRoute_xcap] + set scalar [lindex $triplets 0] + if {[llength $scalar] == 1} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0] + } + if {[llength $scalar] == 2} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0] + } + if {[llength $scalar] == 3} { + set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]] + } + puts $op1 "set vars($rc_corner,post_route_xcap_factor) \t\t\"$pstring\"" + } + puts $op1 "" +} +puts $op1 "########################################################################################" +puts $op1 "# Define operating conditions (optional)" +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(opconds) " +puts $op1 "# set vars(,library_file) " +puts $op1 "# set vars(,P) " +puts $op1 "# set vars(,V) " +puts $op1 "# set vars(,T) " +puts $op1 "########################################################################################" +if {![info exists ::CPF::cpfCommitted]} { + set opconds [list] + foreach opcond [all_op_conds] { + # if {[regexp "^default" $opcond ] == 0} { + lappend opconds $opcond + # } + } + if {$opconds != ""} { + puts $op1 "#set vars(opconds) \"$opconds\"" + } + foreach opcond $opconds { + foreach option "library_file P V T" { + if {[get_op_cond $opcond -$option] != ""} { + puts $op1 "#set vars($opcond,$option) [get_op_cond $opcond -$option]" + } + } + } +} + +puts $op1 "########################################################################################" +puts $op1 "# Define delay corners ..." +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(delay_corners) " +puts $op1 "# set vars(,library_set) (previously defined)" +puts $op1 "# set vars(,opcond) (previously defined) (optional)" +puts $op1 "# set vars(,rc_corner) library_set> (previously defined)" +puts $op1 "########################################################################################" +set delay_corners [list] +foreach delay_corner [all_delay_corners] { +# if {[llength [all_delay_corners]] > 2} { +# if {[regexp "^default" $delay_corner ] == 0} { +# lappend delay_corners $delay_corner +# } +# } else { + lappend delay_corners $delay_corner +# } +} +if {$delay_corners != ""} { + puts $op1 "set vars(delay_corners) \"$delay_corners\"" +} +foreach dc $delay_corners { + set attribute_list "rc_corner library_set opcond_library opcond irdrop_file late_library_set early_library_set + late_opcond_library early_opcond_library late_opcond early_opcond late_irdrop_file early_irdrop_file" + + foreach attr $attribute_list { + # Extraction the corner level properties + if {[get_delay_corner $dc -$attr] != ""} { + puts $op1 "set vars($dc,$attr) \t[get_delay_corner $dc -$attr]" + } + # Extraction the power domain level properties + set domains [get_delay_corner $dc -power_domain_list] + if {$domains != ""} { + if {![info exists done($dc,power_domains)]} { + puts $op1 "set vars($dc,power_domains) \"$domains\"" + foreach pd [get_delay_corner $dc -power_domain_list] { + puts $op1 "# Attributes for power domain $pd" + foreach attr $attribute_list { + if {[get_delay_corner -power_domain $pd $dc -$attr] != ""} { + set done($dc,$pd,$attr) TRUE + puts $op1 "set vars($dc,$pd,$attr) \t[get_delay_corner $dc -power_domain $pd -$attr]" + } + } + } + set done($dc,power_domains) TRUE + } + } + } +} + + +puts $op1 "########################################################################################" +puts $op1 "# Optionally define derating factors for OCV here (clock and data). " +puts $op1 "# Derating factors are applied per delay corner using either individual" +puts $op1 "# values OR via a derate_tcl file which must contain syntactically correct" +puts $op1 "# set_timing_derate commands for a given delay_corner" +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "#set vars(,derate_tcl) " +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "#set vars(,data_cell_late) " +puts $op1 "#set vars(,data_cell_early) " +puts $op1 "#set vars(,data_net_late) " +puts $op1 "#set vars(,data_net_early) " +puts $op1 "#set vars(,clock_cell_late) " +puts $op1 "#set vars(,clock_cell_early) " +puts $op1 "#set vars(,clock_net_late) " +puts $op1 "#set vars(,clock_net_early) " +puts $op1 "#set vars(,cell_check_late) " +puts $op1 "#set vars(,cell_check_early) " +puts $op1 "#---------------------------------------------------------------------------------------" + +set map(early_cell_check_derate_factor) early_cell_check +set map(early_clk_cell_derate_factor) clock_cell_early +set map(early_data_cell_derate_factor) data_cell_early +set map(late_cell_check_derate_factor) late_cell_check +set map(late_clk_cell_derate_factor) clock_cell_late +set map(late_data_cell_derate_factor) data_cell_late + +#timeDesign -prePlace +#foreach view [all_setup_analysis_views] { +# foreach type "early_cell_check_derate_factor early_clk_cell_derate_factor early_data_cell_derate_factor \ +# late_cell_check_derate_factor late_clk_cell_derate_factor late_data_cell_derate_factor" { +# +# puts $op1 "set vars([get_analysis_view $view -delay_corner],$map($type)) [get_property [lindex [all_registers] 0] $type -view $view]" +# } +#} +#timeDesign -prePlace -hold +#foreach view [all_hold_analysis_views] { +# foreach type "early_cell_check_derate_factor early_clk_cell_derate_factor early_data_cell_derate_factor \ +# late_cell_check_derate_factor late_clk_cell_derate_factor late_data_cell_derate_factor" { +# +# puts $op1 "set vars([get_analysis_view $view -delay_corner],$map($type)) [get_property [lindex [all_registers] 0] $type -view $view]" +# } +#} + +puts $op1 "########################################################################################" +puts $op1 "# Define constraint modes ... " +puts $op1 "#---------------------------------------------------------------------------------------" +puts $op1 "# set vars(constraint_modes) " +puts $op1 "# set vars(,pre_cts_sdc)

 (required)"
+puts $op1 "# set vars(,post_cts_sdc)      (optional)"
+puts $op1 "# set vars(,incr_cts_sdc)      (optional)"
+puts $op1 "# set vars(,pre_cts_ilm_sdc)  
 (optional)"
+puts $op1 "#---------------------------------------------------------------------------------------"
+set constraint_modes [list]
+foreach constraint_mode [all_constraint_modes] {
+#   if {[llength [all_constraint_modes]] > 2} {
+#      if {[regexp "^default_mode" $constraint_mode ] == 0} {
+#         lappend constraint_modes $constraint_mode
+#      }
+#   } else {
+      lappend constraint_modes $constraint_mode
+#   }
+}
+if {$constraint_modes != ""} {
+   puts $op1 "set vars(constraint_modes) \"$constraint_modes\""
+}
+foreach constraint_mode $constraint_modes {
+   if {[get_constraint_mode $constraint_mode -sdc_files] != ""} {
+#      puts $op1 "set vars($constraint_mode,pre_cts_sdc) \"[file normalize [get_constraint_mode $constraint_mode -sdc_files]]\"" 
+     set pre_cts_sdc_list [list]
+     foreach file [get_constraint_mode $constraint_mode -sdc_files]  {
+        lappend pre_cts_sdc_list [file normalize $file]
+     }
+     puts $op1 "set vars($constraint_mode,pre_cts_sdc) \"[join $pre_cts_sdc_list]\"" 
+      if {[info exists dgn_post_cts_sdc] && ($dgn_post_cts_sdc != "") } {
+         puts $op1 "set vars($constraint_mode,post_cts_sdc) \"$dgn_post_cts_sdc\"" 
+      }
+   }
+   if {[get_constraint_mode $constraint_mode -ilm_sdc_files] != ""} {
+#      puts $op1 "set vars($constraint_mode,pre_cts_ilm_sdc) \"[file normalize [get_constraint_mode $constraint_mode -ilm_sdc_files]]\"" 
+     set ilm_cts_sdc_list [list]
+     foreach file [get_constraint_mode $constraint_mode -ilm_sdc_files]  {
+        lappend ilm_cts_sdc_list [file normalize $file]
+     }
+     puts $op1 "set vars($constraint_mode,pre_cts_ilm_sdc) \"[join $ilm_cts_sdc_list]\"" 
+   }
+}
+
+puts $op1 "########################################################################################"
+puts $op1 "# Define setup and hold analysis views ... each analysis view requires"
+puts $op1 "# a delay corner and a constraint mode"
+puts $op1 "########################################################################################"
+
+#set analysis_views ""
+set analysis_views [concat [all_setup_analysis_views] [all_hold_analysis_views]]
+#foreach view [all_analysis_views] {
+#   if {[llength [all_analysis_views]] > 2} {
+#      if {[regexp "^default" $view ] == 0} {
+#         lappend analysis_views $view
+#      }
+#   } else {
+#      lappend analysis_views $view
+#   }
+#}
+foreach view $analysis_views {
+   foreach option "delay_corner constraint_mode" {
+      if {[get_analysis_view $view -$option] != ""} {
+         puts $op1 "set vars($view,$option) [get_analysis_view $view -$option]" 
+      }
+   }
+}
+puts $op1 "########################################################################################"
+puts $op1 "# EDIT/VERIFY THESE LISTS!!"
+puts $op1 "########################################################################################"
+puts $op1 "set vars(setup_analysis_views) \"[all_setup_analysis_views]\""
+puts $op1 "set vars(hold_analysis_views)  \"[all_hold_analysis_views]\""
+#puts $op1 "set vars(setup_analysis_views) \"$analysis_views\""
+#puts $op1 "set vars(hold_analysis_views) \"$analysis_views\""
+
+puts $op1 "########################################################################################"
+puts $op1 "# Define active setup and hold analysis view lists and default views"
+puts $op1 "########################################################################################"
+puts $op1 "set vars(default_setup_view)  \[lindex \$vars(setup_analysis_views) 0\]"
+puts $op1 "set vars(default_hold_view)   \[lindex \$vars(hold_analysis_views) 0\]"
+#puts $op1 "set vars(active_setup_views) \$vars(setup_analysis_views)"
+#puts $op1 "set vars(active_hold_views)  \$vars(hold_analysis_views)"
+puts $op1 "set vars(active_setup_views)  \$vars(setup_analysis_views)"
+puts $op1 "set vars(active_hold_views)   \$vars(hold_analysis_views)"
+puts $op1 ""
+puts $op1 "#set vars(gds_files)         "
+puts $op1 "#set vars(gds_layer_map)     "
+puts $op1 "#set vars(qrc_layer_map)     "
+puts $op1 "#set vars(qrc_library)       "
+puts $op1 "#set vars(qrc_config_file)   "
+puts $op1 ""
+puts $op2 "########################################################################################"
+puts $op2 "# Enable onChipVariation (for MMMC flows).  Options are:"
+puts $op2 "# pre_place, pre_prects, pre_cts, pre_postcts, pre_postroute, pre_signoff, false"
+puts $op2 "########################################################################################"
+puts $op2 "set vars(enable_ocv)        pre_cts"
+puts $op2 ""
+puts $op2 "########################################################################################"
+puts $op2 "# Optionally enable aocv"
+puts $op2 "########################################################################################"
+puts $op2 "set vars(enable_aocv)       false"
+puts $op2 "########################################################################################"
+puts $op2 "# Optionally enable cppr; options are: setup, hold, both, none"
+puts $op2 "########################################################################################"
+puts $op2 "set vars(enable_cppr)       both"
+puts $op2 ""
+#puts $op2 "########################################################################################"
+#puts $op2 "# Optionally enable signalStorm delay calculation during the flow."
+#puts $op2 "# This is a requirement when using ECSM/CCS models.  The following are"
+#puts $op2 "# value options: pre_place pre_prects pre_postcts pre_postroute pre_signoff false"
+#puts $op2 "########################################################################################"
+#puts $op2 "set vars(enable_ss)         false"
+#puts $op2 ""
+puts $op2 "########################################################################################"
+puts $op2 "# Optionally enable signoff ECO for the hierarhical flow"
+puts $op2 "# IF 'ilm', THEN THE FOLLOWING SHOULD BE SET IN THE setup.tcl"
+puts $op2 "# - vars(,ilm_dir)   "
+puts $op2 "# - va#rs(,lef_file)  "
+puts $op2 "########################################################################################"
+puts $op2 "set vars(enable_signoff_eco)            false"
+puts $op2 ""
+puts $op2 "########################################################################################"
+puts $op2 "#                              Flow Options"
+puts $op2 "# Optionally enable design mode options:"
+puts $op2 "#---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(flow_effot)       "
+puts $op2 "#set vars(power_effort)     "
+puts $op2 ""
+puts $op2 "########################################################################################"
+puts $op2 "#                              Placement Options"
+puts $op2 "# NOTE: When place_opt_design is enabled, the prects step will be skipped"
+puts $op2 "#---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(in_place_opt)     true"
+puts $op2 "#set vars(no_pre_place_opt) true"
+puts $op2 "#set vars(place_opt_design)  "
+puts $op2 "#set vars(place_io_pins)     "
+puts $op2 "#set vars(clock_gate_aware)  "
+puts $op2 "#set vars(congestion_effort) "
+puts $op2 "#---------------------------------------------------------------------------------------"
+foreach option [getPlaceMode -quiet] {
+   if {[lindex $option 0] == "clkGateAware"} {
+      puts $op2 "set vars(clock_gate_aware)  [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "congEffort"} {
+      puts $op2 "set vars(congestion_effort) [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "placeIoPins"} {
+      puts $op2 "set vars(place_io_pins)     [lindex $option 1]"
+   }
+}
+puts $op2 ""
+puts $op2 "########################################################################################"
+puts $op2 "#                     Tie/Filler/Tap Cell Options"
+puts $op2 "# --------------------------------------------------------------------------------------"
+puts $op2 "#                         Tie cell information"
+puts $op2 "# --------------------------------------------------------------------------------------"
+foreach option [getTieHiLoMode -quiet] {
+   switch -exact -- [lindex $option 0] {
+      "cell" {
+         if {[lindex $option 1] != ""} {
+            puts $op2 "set vars(tie_cells) \"[lindex $option 1]\""
+         } else {
+            puts $op2 "#set vars(tie_cells) "
+         }
+      }
+      "maxDistance" {
+         if {[lindex $option 1] != 0} {
+            puts $op2 "set vars(tie_cells,max_distance) [list [lindex $option 1]]"
+         } else {
+            puts $op2 "#set vars(tie_cells,max_distance) "
+         }
+      }
+      "maxFanout" {
+         if {[lindex $option 1] != 0} {
+            puts $op2 "set vars(tie_cells,max_fanout) [list [lindex $option 1]]"
+         } else {
+            puts $op2 "#set vars(tie_cells,max_fanout) "
+         }
+      }
+   }
+}
+puts $op2 "# --------------------------------------------------------------------------------------"
+puts $op2 "#                     Filler cell information"
+puts $op2 "# --------------------------------------------------------------------------------------"
+foreach option [getFillerMode -quiet] {
+   if {[lindex $option 0] == "core"} {
+      if {[lindex $option 1] != ""} {
+         puts $op2 "set vars(filler_cells) \"[lindex $option 1]\""
+      } else {
+         puts $op2 "#set vars(filler_cells) "
+      }
+   }
+}
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#                     Welltap cell information"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#    verify_rule : maximum distance (in microns) between welltap cells and standard cells "
+puts $op2 "#                  in microns"
+puts $op2 "#        max_gap : specifies the maximum distance from the right edge of one well-tap cell "
+puts $op2 "#                  to the left edge of  the following well-tap cell in the same row"
+puts $op2 "#  cell_interval : specifies the maximum distance from the center of one well-tap cell "
+puts $op2 "#                  to the center of the following well-tap cell in the same row"
+puts $op2 "#"
+puts $op2 "# NOTE: max_gap and cell_interval parameters are mutually exclusive, user has to define "
+puts $op2 "#       only one of these parameters to add welltap cells"
+puts $op2 "#"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(welltaps)                         "
+puts $op2 "#set vars(welltaps,checkerboard)            "
+puts $op2 "#set vars(welltaps,max_gap)                 "
+puts $op2 "#set vars(welltaps,cell_interval)           "
+puts $op2 "#set vars(welltaps,verify_rule)             "
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#                          Endcap cell information"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(pre_endcap)                       
"
+puts $op2 "#set vars(post_endcap)                      "
+puts $op2 ""
+if {[info exists ::CPF::cpfCommitted] || [info exists ::MSV::ieee1801Loaded]} {
+   puts $op1 "##########################################################################################"
+   puts $op1 "#                             LP Flow Options"
+   puts $op1 "#---------------------------------------------------------------------------------------"
+   set lpfile {}
+   if {[info exists ::CPF::cpfCommitted] && $::CPF::cpfCommitted &&
+       [info exists ::CPF::cpf_file] && $::CPF::cpf_file != ""} {
+      set lpformat cpf
+      set lpfile gen_setup.[pid].$lpformat; # $::CPF::cpf_file is not used directly
+   if {[lindex [split $vars(version) "."]  0] < 15} {
+      saveCPF $lpfile
+   } else {
+      write_power_intent -cpf $lpfile
+   } 
+   } elseif {[info exists ::MSV::ieee1801Loaded] && $::MSV::ieee1801Loaded &&
+             [info exists ::MSV_UPF::upf_file]} {
+      set lpfile [file normalize $::MSV_UPF::upf_file]
+      set lpformat ieee1801
+   }
+
+   if {$lpfile == {}} {
+      puts "WARNING: Cannot determine CPF or IEEE 1801 file ..."
+   } else {
+      set vars(${lpformat}_file) $lpfile
+     puts $op1 "set vars(${lpformat}_file)       \"$vars(${lpformat}_file)\""
+      puts $op1 "# --------------------------------------------------------------------"
+      puts $op1 "# Define the following to selectively commit sections of the [string toupper $lpformat] file"
+      puts $op1 "#set vars(${lpformat}_power_domain)     "
+      puts $op1 "#set vars(${lpformat}_power_switch)     "
+      puts $op1 "#set vars(${lpformat}_isolation)        "
+      puts $op1 "#set vars(${lpformat}_level_shifter)    "
+      puts $op1 "#set vars(${lpformat}_state_retention)  "
+      puts $op1 "# --------------------------------------------------------------------"
+      puts $op1 "#set vars(${lpformat}_keep_rows)        "
+      puts $op1 "# ---------------------------------------------------------------------------------------"
+      puts $op1 "# The vars(power_domains) is optional.  If not defined, the power" 
+      puts $op1 "# power domain list will be picked up automatically"
+      puts $op1 "# ---------------------------------------------------------------------------------------"
+      set power_domains [list]
+      dbForEachPowerDomain [dbgHead] pd {
+         lappend power_domains [dbPowerDomainName $pd]
+      }
+      if {$power_domains != ""} {
+         puts $op1 "set vars(power_domains) \"$power_domains\""
+      } else {
+         puts $op1 "#set vars(power_domains)                       "
+      }
+      puts $op1 "# ---------------------------------------------------------------------------------------"
+      puts $op1 "# Additional optional low power variables can be defined in the lp_config.tcl file."
+      puts $op1 "# ---------------------------------------------------------------------------------------"
+   }
+}
+puts $op2 ""
+puts $op2 "#########################################################################################"
+puts $op2 "#                               Clock Tree Options"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(route_clock_nets) "
+puts $op2 "#set vars(cts_cells)        "
+puts $op2 "#set vars(clock_gate_cells) "
+puts $op2 "#set vars(clock_gate_clone) "
+puts $op2 "#set vars(clock_eco)        "
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(clk_tree_top_layer)     "
+puts $op2 "#set vars(clk_tree_bottom_layer)   "
+puts $op2 "#set vars(clk_tree_ndr)           "
+puts $op2 "#set vars(clk_tree_shield_net)     "
+puts $op2 "#set vars(clk_leaf_top_layer)     "
+puts $op2 "#set vars(clk_leaf_bottom_layer)  "
+puts $op2 "#set vars(cts_leaf_ndr)           "
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "# Additional variables to enable/support ccopt"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(cts_engine) "
+puts $op2 "#set vars(cts_buffer_cells) "
+puts $op2 "#set vars(cts_inverter_cells) "
+puts $op2 "#set vars(cts_use_inverters) "
+puts $op2 "#set vars(cts_io_opt) "
+#puts $op2 "#set vars(ccopt_integration) "
+#puts $op2 "#set vars(ccopt_executable) "
+
+puts $op2 ""
+puts $op2 "#########################################################################################"
+puts $op2 "#                              Optimization Options"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "# For difficult timing designs, 'set vars(high_timing_effort) true'"
+puts $op2 "# This enables a variety of options throughout the flow for optimal"
+puts $op2 "# QoR at the expense of runtime"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(high_timing_effort)             "
+puts $op2 "# --------------------------------------------------------------------"
+#puts $op2 "#set vars(critical_range)                 "
+puts $op2 "#set vars(preserve_assertions)            " 
+puts $op2 "#set vars(clock_gate_aware_opt)           "
+#puts $op2 "#set vars(power_effort)                   "
+#puts $op2 "#set vars(power_ratio)                    "
+puts $op2 "#set vars(fix_hold_allow_tns_degradation) "
+puts $op2 "#set vars(useful_skew)                    "
+#puts $op2 "#set vars(skew_buffers)                   "
+puts $op2 "#set vars(fix_hold)                       "
+puts $op2 "#set vars(fix_hold_ignore_ios)            "
+puts $op2 "#set vars(delay_cells)                    "
+puts $op2 "#set vars(dont_use_list)                  "
+puts $op2 "#set vars(dont_use_file)                  "
+puts $op2 "#set vars(use_list)                       "
+puts $op2 "#---------------------------------------------------------------------------------------"
+foreach option [getOptMode -quiet] {
+   if {[lindex $option 0] == "criticalRange"} {
+      puts $op2 "#set vars(critical_range)                 [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "preserveAssertions"} {
+      puts $op2 "set vars(preserve_assertions)            [lindex $option 1]"
+   } 
+#   if {[lindex $option 0] == "leakagePowerEffort"} {
+#      puts $op2 "set vars(leakage_power_effort)           [lindex $option 1]"
+#   }
+#   if {[lindex $option 0] == "dynamicPowerEffort"} {
+#      puts $op2 "set vars(dynamic_power_effort)           [lindex $option 1]"
+#   }
+   if {[lindex $option 0] == "fixHoldAllowSetupTnsDegrade"} {
+      puts $op2 "set vars(fix_hold_allow_tns_degradation) [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "clkGateAware"} {
+      puts $op2 "set vars(clock_gate_aware_opt)           [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "usefulSkew"} {
+      puts $op2 "set vars(useful_skew)                    [lindex $option 1]"
+   }
+}
+#foreach option [getUsefulSkewMode -quiet] {
+#   if {[lindex $option 0] == "useCells"} {
+#      if {[lindex $option 1] != ""} {
+#         puts $op2 "set vars(skew_buffers) \"\\"
+#         foreach cell [lindex $option 1] {
+#            puts $op2 "   $cell \\"
+#         }
+#         puts $op2 "\"" 
+#      } 
+#   }
+#}
+catch {set foo [get_line_match "set don't use by User" [getLogFileName]]}
+if {[info exists foo] && ($foo != "") } {
+   puts $op2 "set vars(dont_use_list) \"\\"
+   foreach line [get_line_match "set don't use by User" [getLogFileName] 0] {
+#      lappend vars(dont_use_list) [lindex [split [lindex $line 0] "/"] 1]
+       puts $op2 "   [lindex [split [lindex $line 0] "/"] 1] \\"
+   }
+   puts $op2 "\""
+}
+puts $op2 "#########################################################################################"
+puts $op2 "#                            Power Analysis Options"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(activity_file)        "
+puts $op2 "#set vars(activity_file_format) "
+puts $op2 "#set vars(report_power)         "
+puts $op2 "#set vars(power_analysis_view)  "
+puts $op2 ""
+puts $op2 "#########################################################################################"
+puts $op2 "#                              Nanoroute Options"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(multi_cut_effort)        "
+puts $op2 "#set vars(antenna_diode)           "
+puts $op2 "#set vars(litho_driven_routing)    "
+puts $op2 "#set vars(verify_litho)            "
+puts $op2 "#set vars(lpa_tech_file)           "
+puts $op2 "#set vars(fix_litho)               "
+puts $op2 "#set vars(lpa_conf_file)           "
+puts $op2 "#set vars(postroute_spread_wires)  "
+puts $op2 "# ---------------------------------------------------------------------------------------"
+foreach option [getNanoRouteMode -quiet] {
+   if {[lindex $option 0] == "drouteUseMultiCutViaEffort"} {
+      puts $op2 "set vars(multi_cut_effort)     [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "routeWithLithoDriven"} {
+      puts $op2 "set vars(litho_driven_routing) [lindex $option 1]"
+   }
+}
+
+puts $op2 "#########################################################################################"
+puts $op2 "#                              Extraction Options"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(coupling_c_thresh)       "
+puts $op2 "#set vars(relative_c_thresh)       "
+puts $op2 "#set vars(total_c_thresh)          "
+puts $op2 "# ---------------------------------------------------------------------------------------"
+foreach option [getExtractRCMode -quiet] {
+   if {[lindex $option 0] == "coupling_c_th"} {
+      puts $op2 "#set vars(coupling_c_thresh)       [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "relative_c_th"} {
+      puts $op2 "#set vars(relative_c_thresh)       [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "total_c_th"} {
+      puts $op2 "#set vars(total_c_thresh)          [lindex $option 1]"
+   }
+}
+puts $op2 "# Signoff extraction requires qrc_tech file; if you dont have one, please switch to effort low."
+puts $op2 "# But keep in mind, effort low is NOT allowed for process nodes 32nm and below"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(postroute_extraction_effort) "
+puts $op2 "#set vars(signoff_extraction_effort)   "
+puts $op2 ""
+puts $op2 "#########################################################################################"
+puts $op2 "#                              Signal Integrity Options"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(delta_delay_threshold)   (in nanoseconds)"
+puts $op2 "#set vars(celtic_settings)        "
+puts $op2 "#set vars(si_analysis_type)       "
+puts $op2 "#set vars(acceptable_wns)         "
+puts $op2 "# ---------------------------------------------------------------------------------------"
+foreach option [getSIMode -quiet] {
+   if {[lindex $option 0] == "deltaDelayThreshold"} {
+      puts $op2 "set vars(delta_delay_threshold) [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "insCeltICPreTCL"} {
+      puts $op2 "set vars(celtic_settings)       [lindex $option 1]"
+   }
+   if {[lindex $option 0] == "analysisType"} {
+      puts $op2 "set vars(si_analysis_type)       [lindex $option 1]"
+   }
+}
+
+puts $op2 "#########################################################################################"
+puts $op2 "# Optionally define the following when applicable"
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "#set vars(assign_buffer)     {1 -buffer }"
+puts $op2 "#set vars(buffer_tie_assign) "
+puts $op2 "#set vars(jtag_rows)         "
+puts $op2 "#set vars(jtag_cells)        "
+puts $op2 "#set vars(spare_cells)       "
+
+
+puts $op2 "#########################################################################################"
+puts $op2 "# Below are the available plug-ins for the flat foundation flow.  Each "
+puts $op2 "# should point to a file. If the file doesn't exist, the flow will print"
+puts $op2 "# a warning an continue.  The place_tcl and cts_tcl are unique in that "
+puts $op2 "# they REPLACE the placeDesign and clockDesign calls, respectively."
+puts $op2 "# ---------------------------------------------------------------------------------------"
+puts $op2 "set vars(always_source_tcl)           \$vars(plug_dir)/always_source.tcl"
+puts $op2 "set vars(final_always_source_tcl)     \$vars(plug_dir)/final_always_source.tcl"
+puts $op2 "set vars(pre_init_tcl)                \$vars(plug_dir)/pre_init.tcl"
+puts $op2 "set vars(post_init_tcl)               \$vars(plug_dir)/post_init.tcl"
+puts $op2 "set vars(pre_place_tcl)               \$vars(plug_dir)/pre_place.tcl"
+puts $op2 "#set vars(place_tcl)                  \$vars(plug_dir)/place.tcl"
+puts $op2 "set vars(post_place_tcl)              \$vars(plug_dir)/post_place.tcl"
+puts $op2 "set vars(pre_prects_tcl)              \$vars(plug_dir)/pre_prects.tcl"
+puts $op2 "set vars(post_prects_tcl)             \$vars(plug_dir)/post_prects.tcl"
+puts $op2 "set vars(pre_cts_tcl)                 \$vars(plug_dir)/pre_cts.tcl"
+puts $op2 "#set vars(cts_tcl)                    \$vars(plug_dir)/cts.tcl"
+puts $op2 "set vars(post_cts_tcl)                \$vars(plug_dir)/post_cts.tcl"
+puts $op2 "set vars(pre_postcts_tcl)             \$vars(plug_dir)/pre_postcts.tcl"
+puts $op2 "set vars(post_postcts_tcl)            \$vars(plug_dir)/post_postcts.tcl"
+puts $op2 "set vars(pre_route_tcl)               \$vars(plug_dir)/pre_route.tcl"
+puts $op2 "set vars(post_route_tcl)              \$vars(plug_dir)/post_route.tcl"
+puts $op2 "set vars(pre_postcts_hold_tcl)        \$vars(plug_dir)/pre_postcts_hold.tcl"
+puts $op2 "set vars(post_postcts_hold_tcl)       \$vars(plug_dir)/post_postcts_hold.tcl"
+puts $op2 "set vars(pre_postroute_tcl)           \$vars(plug_dir)/pre_postroute.tcl"
+puts $op2 "set vars(post_postroute_tcl)          \$vars(plug_dir)/post_postroute.tcl"
+puts $op2 "set vars(pre_postroute_hold_tcl)      \$vars(plug_dir)/pre_postroute_hold.tcl"
+puts $op2 "set vars(post_postroute_hold_tcl)     \$vars(plug_dir)/post_postroute_hold.tcl"
+puts $op2 "set vars(pre_signoff_tcl)             \$vars(plug_dir)/pre_signoff.tcl"
+puts $op2 "set vars(post_signoff_tcl)            \$vars(plug_dir)/post_signoff.tcl"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "# Below are the plug-ins available for the hierarchical flow ... note"
+puts $op2 "# the additional plug-ins for the partition and assemble steps.  "
+puts $op2 "# Keep in mind "
+puts $op2 "#    - The partitioning step will also load the pre/post init"
+puts $op2 "#      and pre/post place plug-ins (see above)."
+puts $op2 "#    - The assemble step will also load the pre/post signoff"
+puts $op2 "#      plug-ins as well.  "
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(always_source_tcl)          \$vars(plug_dir)/post_signoff.tcl"
+puts $op2 "#set vars(final_always_source_tcl)    \$vars(plug_dir)/final_always_source.tcl"
+puts $op2 "#set vars(pre_model_gen_tcl)          \$vars(plug_dir)/pre_model_gen.tcl"
+puts $op2 "#set vars(post_model_gen_tcl)         \$vars(plug_dir)/post_model_gen.tcl"
+puts $op2 "#set vars(pre_pin_assign_tcl)         \$vars(plug_dir)/pre_pin_assign.tcl"
+puts $op2 "#set vars(post_pin_assign_tcl)        \$vars(plug_dir)/post_pin_assign.tcl"
+puts $op2 "#set vars(pre_partition_tcl)          \$vars(plug_dir)/pre_partition.tcl"
+puts $op2 "#set vars(post_partition_tcl)         \$vars(plug_dir)/post_partition.tcl"
+puts $op2 "#set vars(pre_assemble_tcl)           \$vars(plug_dir)/pre_assemble.tcl"
+puts $op2 "#set vars(post_assemble_tcl)          \$vars(plug_dir)/post_assemble.tcl"
+puts $op2 "#set vars(pre_signoff_tcl)            \$vars(plug_dir)/pre_signoff.tcl"
+puts $op2 "#set vars(post_signoff_tcl)           \$vars(plug_dir)/post_signoff.tcl"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "# All other plug-ins are only used during the flat implementation"
+puts $op2 "# of the partitions. To enable plug-ins for partition implementation"
+puts $op2 "# define in the vars(,innovus_config_tcl) file for that partition"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "# To insert metal fill during the flow define the following two variables:"
+puts $op2 "# - vars(metalfill)    \[pre_postroute, pre_signoff\]"
+puts $op2 "# - vars(metalfill_tcl) "
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(metalfill)                  pre_postroute"
+puts $op2 "#set vars(metalfill_tcl)             \$vars(plug_dir)/metalfill.tcl"
+
+puts $op2 "##########################################################################################"
+puts $op2 "# Distribution setup ... vars(distribute) can be one of the following:"
+puts $op2 "# lsf, rsh, local, or custom"
+puts $op2 "# Depending on the value of vars(distribute), addition variables"
+puts $op2 "# may be required.  Some examples are shown below"
+puts $op2 "# Also, a timeout can be set (unit is seconds)"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(distribute)           custom"
+puts $op2 "#set vars(distribute_timeout)   3600"
+puts $op2 "#set vars(custom,script)        {/grid/sfi/farm/bin/gridsub -W 72:00 -P SOC7.1 -R \"SFIARCH==OPT64 && OSREL==EE40\" -q lnx64}"
+puts $op2 "#set vars(lsf,queue)            lnx64"
+puts $op2 "#set vars(lsf,resource)         \"SFIARCH==OPT64 && OSREL==EE40\""
+puts $op2 "#set vars(lsf,args)             \"-W 72:00 -P SOC8.1\""
+puts $op2 "#set vars(local_cpus)           2"
+puts $op2 "#set vars(remote_hosts)         2"
+puts $op2 "#set vars(cpu_per_remote_host)  2"
+puts $op2 "#set vars(rsh,hosts)            "
+puts $op2 "##########################################################################################"
+puts $op2 "# Capture qor and run time metrics ..."
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(capture_metrics) false"
+puts $op2 "set vars(report_run_time) true"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(html_summary) "
+puts $op2 "#set vars(time_info_rpt) "
+puts $op2 "#set vars(time_info_dbs) "
+puts $op2 "##########################################################################################"
+puts $op2 "# Makefile options ..."
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "#set vars(make_tool) "
+puts $op2 "#set vars(make_tool_args) \"-64 -nowin\""
+puts $op2 "#set vars(make_syn_tool) "
+puts $op2 "#set vars(make_syn_tool_args) \"-64\""
+puts $op2 "#set vars(make_browser) mozilla"
+puts $op2 "##########################################################################################"
+puts $op2 "# Abort if there are errors in the setup.tcl"
+puts $op2 "# --------------------------------------------------------------------"
+puts $op2 "set vars(abort) true"
+puts $op2 "##########################################################################################"
+puts $op2 "# Send mail during flow execution;  vars(mail,steps) defaults to ALL steps."
+puts $op2 "#set vars(mail,to)              \"\""
+puts $op2 "#set vars(mail,steps)           \"\""
+puts $op2 "##########################################################################################"
+puts $op1 "puts \" Finished loading setup.tcl file\""
+puts $op2 "puts \" Finished loading the INNOVUS configuration file\""
+
+close $op1
+close $op2
+
+Puts " ------------------------------------------------------------------------------------"
+Puts " Finished generating setup file \"setup.auto.tcl\" ... "
+Puts " please edit and rename to setup.tcl to enable"
+Puts " ------------------------------------------------------------------------------------"
+Puts " Finished generating INNOVUS config file \"innovus_config.auto.tcl\" ... "
+Puts " please edit and rename to innovus_config.tcl to enable"
+Puts " ------------------------------------------------------------------------------------"
+#puts "     Please check for correctness and add additional information as necessary"
+if {[info exists lpfile]} {
+   create_lp_config_file
+   Puts " Finished generating low power config file \"lp_config.auto.tcl\" ... "
+   Puts " please edit and rename to lp_config.tcl to enable"
+   Puts " ------------------------------------------------------------------------------------"
+}
+create_invs_tag_file
+Puts " ------------------------------------------------------------------------------------"
+Puts " Finished generating INNOVUS tag file \"invs.auto.tcl\" ... "
+Puts " This file is for detailed flow customization and in purely optional."
+Puts " ------------------------------------------------------------------------------------"
+if {[info exists done]} { 
+   foreach var [array names done] {
+      unset done($var)
+   }
+}
diff --git a/sky130_cds/pnr/SPEF/mult_seq2.spef b/sky130_cds/pnr/SPEF/mult_seq2.spef
new file mode 100755
index 000000000..cb3ca1f60
--- /dev/null
+++ b/sky130_cds/pnr/SPEF/mult_seq2.spef
@@ -0,0 +1,5599 @@
+*SPEF "IEEE 1481-1998"
+*DESIGN "mult_seq"
+*DATE "Wed Aug  3 11:45:51 2022"
+*VENDOR "Cadence Design Systems, Inc."
+*PROGRAM "Innovus"
+*VERSION "19.18-s072_1"
+*DESIGN_FLOW "COUPLING C" "PIN_CAP NONE" "NAME_SCOPE LOCAL"
+*DIVIDER /
+*DELIMITER :
+*BUS_DELIMITER []
+*T_UNIT 1 NS
+*C_UNIT 1 PF
+*R_UNIT 1 OHM
+*L_UNIT 1 HENRY
+
+// MMMC spef file for corner 'rc_typ'
+
+*NAME_MAP
+
+*1 a[3]
+*2 a[2]
+*3 a[1]
+*4 a[0]
+*5 b[3]
+*6 b[2]
+*7 b[1]
+*8 b[0]
+*9 clk
+*10 reset
+*11 en
+*12 sum_q[7]
+*13 sum_q[6]
+*14 sum_q[5]
+*15 sum_q[4]
+*16 sum_q[3]
+*17 sum_q[2]
+*18 sum_q[1]
+*19 sum_q[0]
+*20 FE_PHN22_sum_q_7
+*21 FE_PHN21_sum_q_2
+*22 FE_PHN10_sum_q_5
+*23 FE_PHN9_sum_q_6
+*24 FE_PHN1_sum_q_1
+*25 sum[7]
+*26 sum[6]
+*27 sum[5]
+*28 sum[4]
+*29 sum[3]
+*30 sum[2]
+*31 sum[1]
+*32 sum[0]
+*33 csa_tree_add1_add_30_16_groupi_n_0
+*34 csa_tree_add1_add_30_16_groupi_n_1
+*35 csa_tree_add1_add_30_16_groupi_n_4
+*36 csa_tree_add1_add_30_16_groupi_n_5
+*37 csa_tree_add1_add_30_16_groupi_n_6
+*38 csa_tree_add1_add_30_16_groupi_n_7
+*39 csa_tree_add1_add_30_16_groupi_n_8
+*40 csa_tree_add1_add_30_16_groupi_n_9
+*41 csa_tree_add1_add_30_16_groupi_n_10
+*42 csa_tree_add1_add_30_16_groupi_n_11
+*43 csa_tree_add1_add_30_16_groupi_n_12
+*44 csa_tree_add1_add_30_16_groupi_n_13
+*45 csa_tree_add1_add_30_16_groupi_n_14
+*46 csa_tree_add1_add_30_16_groupi_n_15
+*47 csa_tree_add1_add_30_16_groupi_n_16
+*48 csa_tree_add1_add_30_16_groupi_n_17
+*49 csa_tree_add1_add_30_16_groupi_n_18
+*50 csa_tree_add1_add_30_16_groupi_n_19
+*51 csa_tree_add1_add_30_16_groupi_n_20
+*52 csa_tree_add1_add_30_16_groupi_n_21
+*53 csa_tree_add1_add_30_16_groupi_n_23
+*54 csa_tree_add1_add_30_16_groupi_n_24
+*55 csa_tree_add1_add_30_16_groupi_n_25
+*56 csa_tree_add1_add_30_16_groupi_n_26
+*57 csa_tree_add1_add_30_16_groupi_n_27
+*58 csa_tree_add1_add_30_16_groupi_n_28
+*59 csa_tree_add1_add_30_16_groupi_n_30
+*60 csa_tree_add1_add_30_16_groupi_n_31
+*61 csa_tree_add1_add_30_16_groupi_n_32
+*62 csa_tree_add1_add_30_16_groupi_n_33
+*63 csa_tree_add1_add_30_16_groupi_n_34
+*64 csa_tree_add1_add_30_16_groupi_n_35
+*65 csa_tree_add1_add_30_16_groupi_n_36
+*66 csa_tree_add1_add_30_16_groupi_n_39
+*67 csa_tree_add1_add_30_16_groupi_n_40
+*68 csa_tree_add1_add_30_16_groupi_n_41
+*69 csa_tree_add1_add_30_16_groupi_n_42
+*70 csa_tree_add1_add_30_16_groupi_n_43
+*71 csa_tree_add1_add_30_16_groupi_n_44
+*72 csa_tree_add1_add_30_16_groupi_n_45
+*73 csa_tree_add1_add_30_16_groupi_n_46
+*74 csa_tree_add1_add_30_16_groupi_n_47
+*75 csa_tree_add1_add_30_16_groupi_n_48
+*76 csa_tree_add1_add_30_16_groupi_n_49
+*77 csa_tree_add1_add_30_16_groupi_n_50
+*78 csa_tree_add1_add_30_16_groupi_n_52
+*79 csa_tree_add1_add_30_16_groupi_n_53
+*80 csa_tree_add1_add_30_16_groupi_n_54
+*81 csa_tree_add1_add_30_16_groupi_n_55
+*82 csa_tree_add1_add_30_16_groupi_n_56
+*83 csa_tree_add1_add_30_16_groupi_n_57
+*84 csa_tree_add1_add_30_16_groupi_n_59
+*85 csa_tree_add1_add_30_16_groupi_n_60
+*86 csa_tree_add1_add_30_16_groupi_n_62
+*87 csa_tree_add1_add_30_16_groupi_n_63
+*88 csa_tree_add1_add_30_16_groupi_n_64
+*89 csa_tree_add1_add_30_16_groupi_n_65
+*90 csa_tree_add1_add_30_16_groupi_n_66
+*91 csa_tree_add1_add_30_16_groupi_n_68
+*92 csa_tree_add1_add_30_16_groupi_n_69
+*93 csa_tree_add1_add_30_16_groupi_n_70
+*94 csa_tree_add1_add_30_16_groupi_n_71
+*95 csa_tree_add1_add_30_16_groupi_n_72
+*96 csa_tree_add1_add_30_16_groupi_n_73
+*97 csa_tree_add1_add_30_16_groupi_n_74
+*98 csa_tree_add1_add_30_16_groupi_n_75
+*99 csa_tree_add1_add_30_16_groupi_n_76
+*100 csa_tree_add1_add_30_16_groupi_n_77
+*101 csa_tree_add1_add_30_16_groupi_n_78
+*102 csa_tree_add1_add_30_16_groupi_n_79
+*103 csa_tree_add1_add_30_16_groupi_n_80
+*104 csa_tree_add1_add_30_16_groupi_n_81
+*105 csa_tree_add1_add_30_16_groupi_n_82
+*106 csa_tree_add1_add_30_16_groupi_n_84
+*107 csa_tree_add1_add_30_16_groupi_n_85
+*108 csa_tree_add1_add_30_16_groupi_n_87
+*109 csa_tree_add1_add_30_16_groupi_n_89
+*110 csa_tree_add1_add_30_16_groupi_n_91
+*111 csa_tree_add1_add_30_16_groupi_n_93
+*112 n_111
+*113 n_112
+*114 n_113
+*115 n_114
+*116 reg1/FE_PHN39_sum_q_7
+*117 reg1/FE_PHN38_sum_q_1
+*118 reg1/FE_PHN37_n_4
+*119 reg1/FE_PHN36_q_0_58
+*120 reg1/FE_PHN35_sum_q_1
+*121 reg1/FE_PHN34_sum_q_6
+*122 reg1/FE_PHN33_sum_q_5
+*123 reg1/FE_PHN32_q_4_62
+*124 reg1/FE_PHN31_n_7
+*125 reg1/FE_PHN30_sum_q_6
+*126 reg1/FE_PHN29_n_9
+*127 reg1/FE_PHN28_sum_q_7
+*128 reg1/FE_PHN27_sum_q_5
+*129 reg1/FE_PHN26_n_10
+*130 reg1/FE_PHN25_sum_q_3
+*131 reg1/FE_PHN24_n_9
+*132 reg1/FE_PHN23_n_7
+*133 reg1/FE_PHN20_sum_q_6
+*134 reg1/FE_PHN19_n_10
+*135 reg1/FE_PHN18_sum_q_5
+*136 reg1/FE_PHN17_sum_q_4
+*137 reg1/FE_PHN16_sum_q_3
+*138 reg1/FE_PHN15_n_18
+*139 reg1/FE_PHN14_n_11
+*140 reg1/FE_PHN13_n_9
+*141 reg1/FE_PHN12_n_4
+*142 reg1/FE_PHN11_n_7
+*143 reg1/FE_PHN8_q_0_58
+*144 reg1/FE_PHN7_n_18
+*145 reg1/FE_PHN6_n_4
+*146 reg1/FE_PHN5_n_5
+*147 reg1/FE_PHN4_n_6
+*148 reg1/FE_PHN3_n_9
+*149 reg1/FE_PHN2_n_11
+*150 reg1/FE_PHN0_q_0_58
+*151 reg1/UNCONNECTED
+*152 reg1/UNCONNECTED0
+*153 reg1/UNCONNECTED1
+*154 reg1/UNCONNECTED2
+*155 reg1/UNCONNECTED3
+*156 reg1/UNCONNECTED4
+*157 reg1/UNCONNECTED5
+*158 reg1/UNCONNECTED6
+*159 reg1/n_0
+*160 reg1/n_4
+*161 reg1/n_5
+*162 reg1/n_6
+*163 reg1/n_7
+*164 reg1/n_8
+*165 reg1/n_9
+*166 reg1/n_10
+*167 reg1/n_11
+*168 reg1/n_12
+*169 reg1/n_13
+*170 reg1/n_14
+*171 reg1/n_15
+*172 reg1/n_16
+*173 reg1/n_17
+*174 reg1/n_18
+*175 reg1/n_19
+*176 reg1/q\[0\]_58
+*177 reg1/q\[3\]_61
+*178 reg1/q\[4\]_62
+*179 reg1/FE_PHC39_sum_q_7
+*180 reg1/FE_PHC38_sum_q_1
+*181 reg1/FE_PHC37_n_4
+*182 reg1/FE_PHC36_q_0_58
+*183 reg1/FE_PHC35_sum_q_1
+*184 reg1/FE_PHC34_sum_q_6
+*185 reg1/FE_PHC33_sum_q_5
+*186 reg1/FE_PHC32_q_4_62
+*187 reg1/FE_PHC31_n_7
+*188 reg1/FE_PHC30_sum_q_6
+*189 reg1/FE_PHC29_n_9
+*190 reg1/FE_PHC28_sum_q_7
+*191 reg1/FE_PHC27_sum_q_5
+*192 reg1/FE_PHC26_n_10
+*193 reg1/FE_PHC25_sum_q_3
+*194 reg1/FE_PHC24_n_9
+*195 reg1/FE_PHC23_n_7
+*196 reg1/FE_PHC22_sum_q_7
+*197 reg1/FE_PHC21_sum_q_2
+*198 reg1/FE_PHC20_sum_q_6
+*199 reg1/FE_PHC19_n_10
+*200 reg1/FE_PHC18_sum_q_5
+*201 reg1/FE_PHC17_sum_q_4
+*202 reg1/FE_PHC16_sum_q_3
+*203 reg1/FE_PHC15_n_18
+*204 reg1/FE_PHC14_n_11
+*205 reg1/FE_PHC13_n_9
+*206 reg1/FE_PHC12_n_4
+*207 reg1/FE_PHC11_n_7
+*208 reg1/FE_PHC10_sum_q_5
+*209 reg1/FE_PHC9_sum_q_6
+*210 reg1/FE_PHC8_q_0_58
+*211 reg1/FE_PHC7_n_18
+*212 reg1/FE_PHC6_n_4
+*213 reg1/FE_PHC5_n_5
+*214 reg1/FE_PHC4_n_6
+*215 reg1/FE_PHC3_n_9
+*216 reg1/FE_PHC2_n_11
+*217 reg1/FE_PHC1_sum_q_1
+*218 reg1/FE_PHC0_q_0_58
+*219 reg1/q_reg\[3\]
+*220 reg1/q_reg\[2\]
+*221 reg1/q_reg\[0\]
+*222 reg1/q_reg\[4\]
+*223 reg1/q_reg\[6\]
+*224 reg1/q_reg\[5\]
+*225 reg1/q_reg\[1\]
+*226 reg1/q_reg\[7\]
+*227 reg1/g27__2398
+*228 reg1/g28__5107
+*229 reg1/g29__6260
+*230 reg1/g30__4319
+*231 reg1/g31__8428
+*232 reg1/g32__5526
+*233 reg1/g33__6783
+*234 reg1/g34__3680
+*235 reg1/g35__1617
+*236 reg1/g36__2802
+*237 reg1/g37__1705
+*238 reg1/g38__5122
+*239 reg1/g39__8246
+*240 reg1/g40__7098
+*241 reg1/g41__6131
+*242 reg1/g42__1881
+*243 reg1/g43
+*244 reg1/g44
+*245 reg1/g45
+*246 reg1/g46
+*247 csa_tree_add1_add_30_16_groupi_g417__5115
+*248 csa_tree_add1_add_30_16_groupi_g418__7482
+*249 csa_tree_add1_add_30_16_groupi_g419__4733
+*250 csa_tree_add1_add_30_16_groupi_g420__6161
+*251 csa_tree_add1_add_30_16_groupi_g421__9315
+*252 csa_tree_add1_add_30_16_groupi_g422__9945
+*253 csa_tree_add1_add_30_16_groupi_g423__2883
+*254 csa_tree_add1_add_30_16_groupi_g424__2346
+*255 csa_tree_add1_add_30_16_groupi_g425__1666
+*256 csa_tree_add1_add_30_16_groupi_g426__7410
+*257 csa_tree_add1_add_30_16_groupi_g427__6417
+*258 csa_tree_add1_add_30_16_groupi_g428__5477
+*259 csa_tree_add1_add_30_16_groupi_g429__2398
+*260 csa_tree_add1_add_30_16_groupi_g430__5107
+*261 csa_tree_add1_add_30_16_groupi_g431__6260
+*262 csa_tree_add1_add_30_16_groupi_g432__4319
+*263 csa_tree_add1_add_30_16_groupi_g433__8428
+*264 csa_tree_add1_add_30_16_groupi_g434__5526
+*265 csa_tree_add1_add_30_16_groupi_g435__6783
+*266 csa_tree_add1_add_30_16_groupi_g436__3680
+*267 csa_tree_add1_add_30_16_groupi_g437__1617
+*268 csa_tree_add1_add_30_16_groupi_g438__2802
+*269 csa_tree_add1_add_30_16_groupi_g439__1705
+*270 csa_tree_add1_add_30_16_groupi_g440__5122
+*271 csa_tree_add1_add_30_16_groupi_g441__8246
+*272 csa_tree_add1_add_30_16_groupi_g442__7098
+*273 csa_tree_add1_add_30_16_groupi_g443__6131
+*274 csa_tree_add1_add_30_16_groupi_g445__5115
+*275 csa_tree_add1_add_30_16_groupi_g446__7482
+*276 csa_tree_add1_add_30_16_groupi_g447__4733
+*277 csa_tree_add1_add_30_16_groupi_g448__6161
+*278 csa_tree_add1_add_30_16_groupi_g449__9315
+*279 csa_tree_add1_add_30_16_groupi_g450__9945
+*280 csa_tree_add1_add_30_16_groupi_g451__2883
+*281 csa_tree_add1_add_30_16_groupi_g452__2346
+*282 csa_tree_add1_add_30_16_groupi_g454__7410
+*283 csa_tree_add1_add_30_16_groupi_g455__6417
+*284 csa_tree_add1_add_30_16_groupi_g456__5477
+*285 csa_tree_add1_add_30_16_groupi_g457__2398
+*286 csa_tree_add1_add_30_16_groupi_g458__5107
+*287 csa_tree_add1_add_30_16_groupi_g459__6260
+*288 csa_tree_add1_add_30_16_groupi_g461__8428
+*289 csa_tree_add1_add_30_16_groupi_g462__5526
+*290 csa_tree_add1_add_30_16_groupi_g463__6783
+*291 csa_tree_add1_add_30_16_groupi_g464__3680
+*292 csa_tree_add1_add_30_16_groupi_g465__1617
+*293 csa_tree_add1_add_30_16_groupi_g466__2802
+*294 csa_tree_add1_add_30_16_groupi_g467__1705
+*295 csa_tree_add1_add_30_16_groupi_g468__5122
+*296 csa_tree_add1_add_30_16_groupi_g469__8246
+*297 csa_tree_add1_add_30_16_groupi_g470__7098
+*298 csa_tree_add1_add_30_16_groupi_g471__6131
+*299 csa_tree_add1_add_30_16_groupi_g472__1881
+*300 csa_tree_add1_add_30_16_groupi_g474__5115
+*301 csa_tree_add1_add_30_16_groupi_g475__7482
+*302 csa_tree_add1_add_30_16_groupi_g476__4733
+*303 csa_tree_add1_add_30_16_groupi_g477__6161
+*304 csa_tree_add1_add_30_16_groupi_g478__9315
+*305 csa_tree_add1_add_30_16_groupi_g479__9945
+*306 csa_tree_add1_add_30_16_groupi_g480__2883
+*307 csa_tree_add1_add_30_16_groupi_g481__2346
+*308 csa_tree_add1_add_30_16_groupi_g483
+*309 csa_tree_add1_add_30_16_groupi_g484__1666
+*310 csa_tree_add1_add_30_16_groupi_g485__7410
+*311 csa_tree_add1_add_30_16_groupi_g486__6417
+*312 csa_tree_add1_add_30_16_groupi_g487__5477
+*313 csa_tree_add1_add_30_16_groupi_g488__2398
+*314 csa_tree_add1_add_30_16_groupi_g490__5107
+*315 csa_tree_add1_add_30_16_groupi_g491__6260
+*316 csa_tree_add1_add_30_16_groupi_g492__4319
+*317 csa_tree_add1_add_30_16_groupi_g493__8428
+*318 csa_tree_add1_add_30_16_groupi_g494__5526
+*319 csa_tree_add1_add_30_16_groupi_g495__6783
+*320 csa_tree_add1_add_30_16_groupi_g496__3680
+*321 csa_tree_add1_add_30_16_groupi_g497__1617
+*322 csa_tree_add1_add_30_16_groupi_g498__2802
+*323 csa_tree_add1_add_30_16_groupi_g499__1705
+*324 csa_tree_add1_add_30_16_groupi_g500__5122
+*325 csa_tree_add1_add_30_16_groupi_g501__8246
+*326 csa_tree_add1_add_30_16_groupi_g502__7098
+*327 csa_tree_add1_add_30_16_groupi_g503__6131
+*328 csa_tree_add1_add_30_16_groupi_g504__1881
+*329 csa_tree_add1_add_30_16_groupi_g505__5115
+*330 csa_tree_add1_add_30_16_groupi_g506__7482
+*331 csa_tree_add1_add_30_16_groupi_g507__4733
+*332 csa_tree_add1_add_30_16_groupi_g510
+*333 csa_tree_add1_add_30_16_groupi_g513
+*334 g2
+*335 g3
+*336 g515
+*337 g516
+
+
+*PORTS
+
+*1 I *C 78.48 0
+*2 I *C 73.2 0
+*3 I *C 68.88 0
+*4 I *C 71.28 0
+*5 I *C 76.56 0
+*6 I *C 74.16 0
+*7 I *C 68.505 0
+*8 I *C 72.24 0
+*9 I *C 64.56 133.94
+*10 I *C 68.4 133.94
+*11 I *C 70.8 133.94
+*12 O *C 86.16 133.94
+*13 O *C 142.08 72.35
+*14 O *C 142.08 63.2
+*15 O *C 0 64.42
+*16 O *C 0 63.2
+*17 O *C 56.4 133.94
+*18 O *C 61.2 133.94
+*19 O *C 76.56 133.94
+
+
+*D_NET *1 0.00984947
+
+*CONN
+*P *1 I *C 78.48 0 *L 0
+*I *330:B I *C 87.79 57.35 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+*I *328:B I *C 79.91 44.03 *L 0.0042 *D sky130_osu_sc_18T_ms__nand2_l
+*I *327:B I *C 79.8 49.95 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *320:B I *C 87.19 44.03 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *1 0.00010128
+2 *320:B 0.00013166
+3 *1:5 6.826e-05
+4 *1:6 0.00111838
+5 *1:7 0.00372913
+6 *1:8 0.00016144
+7 *1:9 4.009e-05
+8 *1:10 0.00059262
+9 *1:11 0.00014441
+10 *1:12 0.00029726
+11 *1:14 3.054e-05
+12 *1:15 0.00039177
+13 *1:16 1.466e-05
+14 *1:17 0.00035815
+15 *1:19 0.00024806
+16 *1:21 5.089e-05
+17 *1:22 0.00026071
+18 *1:24 0.00064706
+19 *1:5 *5:5 0.00054368
+20 *1:10 *22:3 0.00050129
+21 *1:12 *174:2 0.00041813
+
+*RES
+1 *1:18 *1:21 0.579785
+2 *330:B *1:21 9.24915
+3 *1:17 *1:18 7.18274
+4 *1:17 *1:20 0.246796
+5 *1:19 *1:20 3.59549
+6 *1:16 *1:19 0.264717
+7 *1:15 *1:16 3.57757
+8 *1:15 *1:23 1.12373
+9 *1:22 *1:23 1.79775
+10 *1:9 *1:22 9.24915
+11 *320:B *1:9 97.5378
+12 *1:24 *1:22 5.6449
+13 *1:24 *1:11 8.77436
+14 *1:11 *1:6 11.6742
+15 *1:7 *1:6 40.328
+16 *1 *1:7 1.14649
+17 *1:11 *1:12 1.03078
+18 *1:12 *1:13 2.80991
+19 *1:10 *1:13 1.12373
+20 *1:10 *1:5 13.3001
+21 *1:5 *1:8 30.7844
+22 *1:8 *327:B 78.3264
+23 *1:12 *1:14 0.415709
+24 *328:B *1:14 9.24915
+*END
+
+*D_NET *2 0.00903774
+
+*CONN
+*P *2 I *C 73.2 0 *L 0
+*I *329:B I *C 71.28 49.95 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+*I *324:B I *C 73.31 44.03 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *323:B I *C 86.2 49.95 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *322:B I *C 86.24 44.03 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+
+*CAP
+1 *2 0.00309042
+2 *329:B 0.00019812
+3 *322:B 1.941e-05
+4 *2:5 0.00088063
+5 *2:6 0.00017847
+6 *2:7 0.00010427
+7 *2:9 0.00104977
+8 *2:11 3.544e-05
+9 *2:12 0.00012994
+10 *2:13 7.234e-05
+11 *2:14 1.504e-05
+12 *2:15 5e-05
+13 *2:16 0.00056289
+14 *2:17 0.00051637
+15 *2:18 3.517e-05
+16 *2:19 0.00015826
+17 *2:21 0.000207
+18 *2:5 *6:5 0.00091472
+19 *2:5 *8:5 0.00081948
+
+*RES
+1 *2:17 *2:18 4.47886
+2 *2:18 *2:21 0.264717
+3 *2:21 *2:13 10.1456
+4 *2:13 *2:14 30.7844
+5 *2:14 *2:15 10.2022
+6 *2:15 *323:B 21.8451
+7 *2:17 *2:20 0.246796
+8 *2:19 *2:20 0.896455
+9 *322:B *2:19 9.24915
+10 *2:12 *322:B 116.986
+11 *2:11 *2:12 90.8738
+12 *2:9 *2:11 781.723
+13 *2:9 *2:10 29.9563
+14 *2:6 *2:10 157.481
+15 *2:6 *324:B 52.3676
+16 *324:B *2:16 9.24915
+17 *2:16 *2:5 12.8434
+18 *2 *2:5 40.3328
+19 *2:16 *2:7 16.0088
+20 *2:7 *2:8 30.0152
+21 *329:B *2:8 156.771
+*END
+
+*D_NET *3 0.00937797
+
+*CONN
+*P *3 I *C 68.88 0 *L 0
+*I *331:B I *C 70.34 57.35 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *326:B I *C 73.2 57.35 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *321:A I *C 69.12 43.66 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *317:B I *C 77.51 44.03 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *3 0.00303573
+2 *331:B 0.00011648
+3 *3:5 0.00075859
+4 *3:6 0.00020036
+5 *3:7 0.00054777
+6 *3:8 0.00023989
+7 *3:9 0.00016093
+8 *3:10 0.00071647
+9 *3:11 7.955e-05
+10 *3:12 8.43e-05
+11 *3:13 2.959e-05
+12 *3:14 6.846e-05
+13 *3:15 0.00088305
+14 *3:16 3.763e-05
+15 *3:17 9.3e-07
+16 *3:5 *4:5 0.00076825
+17 *3:5 *7:5 0.00164999
+
+*RES
+1 *331:B *3:17 9.24915
+2 *3:16 *3:17 0.579785
+3 *3:15 *3:16 8.98532
+4 *3:14 *3:15 0.557028
+5 *3:13 *3:14 0.423052
+6 *3:12 *3:13 0.557028
+7 *3:10 *3:12 7.18757
+8 *321:A *3:10 9.24915
+9 *3:8 *3:10 0.718597
+10 *3:8 *3:5 11.6742
+11 *3 *3:5 40.3328
+12 *3:8 *3:7 5.49377
+13 *3:9 *3:7 7.53
+14 *3:9 *3:11 1.16924
+15 *317:B *3:11 9.24915
+16 *331:B *3:6 58.5227
+17 *326:B *3:6 175.568
+*END
+
+*D_NET *4 0.0101882
+
+*CONN
+*P *4 I *C 71.28 0 *L 0
+*I *325:B I *C 67.26 44.03 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *319:B I *C 77.4 49.95 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *318:A I *C 67.95 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *316:B I *C 75.31 57.35 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *4 0.00032553
+2 *4:5 0.00357611
+3 *4:6 0.00101625
+4 *4:7 0.0002547
+5 *4:8 0.0003342
+6 *4:9 0.00066113
+7 *4:10 0.00019753
+8 *4:11 7.15e-06
+9 *4:12 7.68e-05
+10 *4:13 0.0001044
+11 *4:14 0.00018371
+12 *4:15 0.00039052
+13 *4:16 9.023e-05
+14 *4:17 0.00011472
+15 *4:18 0.00011308
+16 *4:19 0.00011015
+17 *4:20 0.00124037
+18 *4:21 2.603e-05
+19 *4:22 2.665e-05
+20 *4:23 0.00057071
+21 *4:5 *3:5 0.00076825
+
+*RES
+1 *4 *4:12 4.05581
+2 *4:12 *4:11 28.7567
+3 *4:5 *4:11 331.628
+4 *4:6 *4:5 45.5261
+5 *4:7 *4:6 12.8251
+6 *325:B *4:7 9.24915
+7 *4:7 *4:13 2.24874
+8 *4:13 *4:15 0.557028
+9 *4:15 *4:16 3.57757
+10 *4:16 *4:18 0.557028
+11 *4:18 *4:20 1.14005
+12 *4:20 *4:9 5.94627
+13 *4:17 *4:9 7.53
+14 *4:17 *4:19 0.078453
+15 *319:B *4:19 9.24915
+16 *4:20 *4:22 8.76932
+17 *318:A *4:22 9.24915
+18 *4:22 *4:23 0.066795
+19 *4:23 *4:8 5.94627
+20 *4:21 *4:8 1.47061
+21 *4:14 *4:21 4.47566
+22 *4:14 *4:10 9.37675
+23 *4:10 *316:B 117.045
+*END
+
+*D_NET *5 0.0092481
+
+*CONN
+*P *5 I *C 76.56 0 *L 0
+*I *330:A I *C 87.31 56.98 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *323:A I *C 87.16 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *319:A I *C 78.36 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *317:A I *C 78.47 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *5 0.00340001
+2 *5:5 0.00010014
+3 *5:6 0.00094953
+4 *5:7 0.00010313
+5 *5:8 6.402e-05
+6 *5:9 1.989e-05
+7 *5:10 0.00020645
+8 *5:11 0.00035737
+9 *5:12 5.183e-05
+10 *5:13 0.00020637
+11 *5:15 0.00011395
+12 *5:16 3.375e-05
+13 *5:17 3.405e-05
+14 *5:18 9.647e-05
+15 *5:19 0.00010442
+16 *5:20 0.00022941
+17 *5:22 0.00043749
+18 *5:24 0.00031904
+19 *5:26 0.00010172
+20 *5:27 0.00108498
+21 *5:5 *1:5 0.00054368
+22 *5:6 *6:5 0.0006904
+
+*RES
+1 *5 *5:6 40.3328
+2 *5:10 *5:6 11.0181
+3 *5:10 *5:19 2.31089
+4 *5:19 *5:20 1.3471
+5 *317:A *5:20 9.24915
+6 *5:20 *5:21 1.3471
+7 *5:13 *5:21 0.539107
+8 *5:13 *5:14 0.891619
+9 *5:11 *5:14 0.539107
+10 *5:11 *5:12 3.12693
+11 *5:12 *5:15 0.557028
+12 *5:15 *5:5 1.29838
+13 *5:27 *5:5 8.77436
+14 *5:27 *5:24 5.87631
+15 *323:A *5:24 9.24915
+16 *5:24 *5:25 0.896455
+17 *5:22 *5:25 0.246796
+18 *5:22 *5:23 5.38015
+19 *5:23 *5:26 0.264717
+20 *5:26 *5:9 10.1456
+21 *5:7 *5:9 39.7254
+22 *5:7 *5:8 60.7996
+23 *5:8 *330:A 49.1666
+24 *5:5 *5:16 0.927253
+25 *5:16 *5:17 0.264717
+26 *5:17 *5:18 0.445809
+27 *319:A *5:18 9.24915
+*END
+
+*D_NET *6 0.00759987
+
+*CONN
+*P *6 I *C 74.16 0 *L 0
+*I *325:A I *C 66.3 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *322:A I *C 86.72 43.66 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *321:B I *C 68.64 44.03 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+*I *320:A I *C 88.15 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *6 7.683e-05
+2 *325:A 0.00019339
+3 *322:A 0.00011539
+4 *6:5 0.0006599
+5 *6:6 0.00306792
+6 *6:7 0.00013014
+7 *6:8 0.00089542
+8 *6:9 0.00025027
+9 *6:10 5.587e-05
+10 *6:11 0.00043553
+11 *6:12 7.788e-05
+12 *6:13 3.621e-05
+13 *6:5 *2:5 0.00091472
+14 *6:5 *5:6 0.0006904
+
+*RES
+1 *6 *6:10 0.878534
+2 *6:10 *6:6 0.557028
+3 *6:6 *6:5 39.4267
+4 *6:14 *6:5 9.68405
+5 *6:7 *6:14 0.539107
+6 *6:7 *6:8 10.1456
+7 *6:8 *6:12 1015.1
+8 *6:12 *322:A 112.516
+9 *322:A *320:A 117.045
+10 *6:8 *6:9 253.598
+11 *6:11 *6:9 215.293
+12 *6:11 *6:13 120.948
+13 *325:A *6:13 156.771
+14 *6:13 *321:B 22.4964
+*END
+
+*D_NET *7 0.00904041
+
+*CONN
+*P *7 I *C 68.505 0 *L 0
+*I *331:A I *C 69.38 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *329:A I *C 71.76 50.32 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *328:A I *C 78.95 43.66 *L 0.00422 *D sky130_osu_sc_18T_ms__nand2_l
+*I *318:B I *C 68.91 57.35 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *7 0.0026345
+2 *331:A 0.00014087
+3 *329:A 1.928e-05
+4 *7:5 0.00039731
+5 *7:6 0.00018057
+6 *7:7 1.001e-05
+7 *7:8 0.00014362
+8 *7:9 0.00034113
+9 *7:10 0.00085883
+10 *7:11 0.00033396
+11 *7:12 1.55e-05
+12 *7:13 2.776e-05
+13 *7:14 0.00013612
+14 *7:15 9.86e-05
+15 *7:16 0.00012903
+16 *7:19 3.011e-05
+17 *7:20 7.68e-05
+18 *7:21 4.01e-05
+19 *7:22 0.00066746
+20 *7:23 0.00018406
+21 *7:25 0.00015986
+22 *7:26 0.00017878
+23 *7:27 0.00046994
+24 *7:29 0.00011622
+25 *7:5 *3:5 0.00164999
+
+*RES
+1 *7:18 *7:7 59.233
+2 *331:A *7:7 136.553
+3 *331:A *7:16 9.24915
+4 *7:16 *7:17 0.445809
+5 *7:14 *7:17 0.561864
+6 *318:B *7:14 9.24915
+7 *7:8 *7:18 29.9563
+8 *7:8 *7:21 78.7405
+9 *7:26 *7:21 10.5962
+10 *7:26 *7:28 0.539107
+11 *7:27 *7:28 4.94743
+12 *7:25 *7:27 0.557028
+13 *7:25 *7:19 10.1277
+14 *7:15 *7:19 77.9713
+15 *329:A *7:15 23.4691
+16 *7:13 *7:15 39.7254
+17 *7:22 *7:13 14.6521
+18 *7:22 *7:12 0.269553
+19 *7:20 *7:12 0.872096
+20 *7:9 *7:20 4.02822
+21 *7:9 *7:6 0.539107
+22 *7:24 *7:6 5.77404
+23 *7:23 *7:24 1.08175
+24 *7:23 *7:5 4.77394
+25 *7 *7:5 5.55761
+26 *7:24 *7:10 0.113124
+27 *7:11 *7:10 8.20874
+28 *7:11 *7:29 2.20451
+29 *328:A *7:29 9.24915
+*END
+
+*D_NET *8 0.00903985
+
+*CONN
+*P *8 I *C 72.24 0 *L 0
+*I *327:A I *C 78.84 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *326:A I *C 72.24 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *324:A I *C 72.35 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *316:A I *C 76.27 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *8 0.00031763
+2 *326:A 0.00045165
+3 *316:A 2.457e-05
+4 *8:5 0.00315648
+5 *8:6 0.00102299
+6 *8:7 0.00030752
+7 *8:9 6.816e-05
+8 *8:10 8.873e-05
+9 *8:11 0.00014926
+10 *8:12 5.67e-05
+11 *8:13 0.00047711
+12 *8:14 4.709e-05
+13 *8:15 0.00076847
+14 *8:17 0.00014132
+15 *8:18 0.0007816
+16 *8:19 0.00036109
+17 *8:5 *2:5 0.00081948
+
+*RES
+1 *8:13 *8:14 4.92951
+2 *8:14 *8:17 0.557028
+3 *8:19 *8:17 5.38429
+4 *8:19 *8:11 5.83314
+5 *8:11 *8:12 1.33976
+6 *316:A *8:12 9.24915
+7 *326:A *316:A 312.121
+8 *8:13 *8:16 0.539107
+9 *8:15 *8:16 0.896455
+10 *8:18 *8:15 8.84814
+11 *8:18 *8:10 7.86937
+12 *8:7 *8:10 3.73914
+13 *8:9 *8:7 9.24915
+14 *8:9 *324:A 58.5227
+15 *8:7 *8:6 12.3928
+16 *8:5 *8:6 35.3708
+17 *8:5 *8:8 0.539107
+18 *8 *8:8 4.95227
+19 *327:A *8:15 9.24915
+*END
+
+*D_NET *9 0.0174329
+
+*CONN
+*P *9 I *C 64.56 133.94 *L 0
+*I *226:CK I *C 93.81 89.54 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *225:CK I *C 68.78 89.54 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *224:CK I *C 76.32 71.04 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *223:CK I *C 84.79 76.22 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *222:CK I *C 68.73 62.9 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *221:CK I *C 73.57 89.54 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *220:CK I *C 57.23 89.54 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *219:CK I *C 57.23 76.22 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *9:9 0.00035691
+2 *9:10 3.452e-05
+3 *9:11 0.00056973
+4 *9:12 0.00105643
+5 *9:13 0.00033982
+6 *9:14 2.725e-05
+7 *9:15 0.00179441
+8 *9:16 6.083e-05
+9 *9:17 4.715e-05
+10 *9:18 0.00010063
+11 *9:19 0.00021158
+12 *9:20 0.00071554
+13 *9:21 0.00013867
+14 *9:22 0.0026629
+15 *9:23 6.828e-05
+16 *9:24 7.402e-05
+17 *9:25 1.408e-05
+18 *9:26 4.503e-05
+19 *9:27 5.756e-05
+20 *9:28 0.00014729
+21 *9:29 7.094e-05
+22 *9:30 0.00025455
+23 *9:31 3.297e-05
+24 *9:32 8.509e-05
+25 *9:33 6.867e-05
+26 *9:34 3.403e-05
+27 *9:35 2.599e-05
+28 *9:36 6.635e-05
+29 *9:37 0.00057656
+30 *9:38 6.131e-05
+31 *9:39 0.00010575
+32 *9:40 2.568e-05
+33 *9:41 3.52e-05
+34 *9:42 4.963e-05
+35 *9:43 6.721e-05
+36 *9:44 0.00069783
+37 *9:45 8.326e-05
+38 *9:46 0.00056751
+39 *9:47 0.00123696
+40 *9:48 0.00108428
+41 *9:49 0.00067808
+42 *9:50 0.00031182
+43 *9:13 *11:16 0.00064427
+44 *9:9 *50:5 0.00040065
+45 *9:9 *119:13 0.0005611
+46 *9:13 *132:5 0.00040608
+47 *9:16 *159:17 0.00067854
+
+*RES
+1 *9:20 *9:19 3.46267
+2 *9:18 *9:19 3.36879
+3 *9:18 *9:17 4.80796
+4 *9:39 *9:17 0.204173
+5 *223:CK *9:39 9.24915
+6 *9:20 *9:12 3.62138
+7 *9:50 *9:12 1.02468
+8 *9:45 *9:50 3.36879
+9 *9:45 *9:32 4.56103
+10 *9:10 *9:32 0.0500962
+11 *224:CK *9:10 9.24915
+12 *9:50 *9:9 0.698796
+13 *9:11 *9:9 0.735752
+14 *9:11 *9:37 3.36879
+15 *9:37 *9:30 3.47708
+16 *9:30 *9:26 3.57382
+17 *9:23 *9:26 4.47566
+18 *9:23 *9:24 0.158234
+19 *222:CK *9:24 9.24915
+20 *9:12 *9:14 5.41814
+21 *9:14 *9:13 2.28369
+22 *9:46 *9:13 2.3756
+23 *9:35 *9:46 4.47566
+24 *9:35 *9:38 0.0561475
+25 *225:CK *9:38 9.24915
+26 *9:44 *9:46 4.0371
+27 *9:40 *9:44 0.0389615
+28 *9:31 *9:40 4.47566
+29 *9:31 *9:33 0.0561475
+30 *220:CK *9:33 9.24915
+31 *9:47 *9:44 3.57372
+32 *9:49 *9:47 3.5853
+33 *9:48 *9:49 3.36879
+34 *9:48 *9:22 2.05691
+35 *9:28 *9:22 8.79201
+36 *9:25 *9:28 0.115058
+37 *9:21 *9:25 4.47566
+38 *9:21 *9 1.01091
+39 *9:47 *9:42 5.41814
+40 *9:16 *9:42 0.0389615
+41 *9:27 *9:16 4.47566
+42 *9:27 *9:29 0.107191
+43 *219:CK *9:29 9.24915
+44 *9:14 *9:15 0.318161
+45 *9:34 *9:15 4.47566
+46 *9:34 *9:36 0.0561475
+47 *221:CK *9:36 9.24915
+48 *9:15 *9:41 13.9781
+49 *9:41 *9:43 0.0561475
+50 *226:CK *9:43 9.24915
+*END
+
+*D_NET *10 0.0160204
+
+*CONN
+*P *10 I *C 68.4 133.94 *L 0
+*I *234:A I *C 56.877 83.62 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *233:A I *C 87.787 70.3 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *232:A I *C 88.333 90.28 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *231:A I *C 70.737 83.62 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *230:A I *C 70.953 90.28 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *229:A I *C 54.457 70.3 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *228:A I *C 60.943 70.3 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *227:A I *C 79.427 76.96 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+
+*CAP
+1 *230:A 7.68e-06
+2 *227:A 3.904e-05
+3 *10:9 0.00042384
+4 *10:10 0.00045317
+5 *10:11 0.00026823
+6 *10:12 0.00017333
+7 *10:13 0.00376289
+8 *10:14 0.00016433
+9 *10:15 4.311e-05
+10 *10:16 0.00039186
+11 *10:17 0.00018245
+12 *10:18 0.00029032
+13 *10:20 0.0003467
+14 *10:21 7.837e-05
+15 *10:22 5.413e-05
+16 *10:23 0.00090443
+17 *10:24 0.00031333
+18 *10:25 0.0001996
+19 *10:26 3.662e-05
+20 *10:27 4.365e-05
+21 *10:28 0.00055897
+22 *10:30 0.00048394
+23 *10:31 0.00020595
+24 *10:33 6.211e-05
+25 *10:34 4.752e-05
+26 *10:35 0.00022981
+27 *10:36 0.00078545
+28 *10:37 0.00014741
+29 *10:39 0.00089186
+30 *10:40 0.00023025
+31 *10:41 0.00024462
+32 *10:42 0.00104114
+33 *10:43 0.00074738
+34 *10:44 0.00044746
+35 *10:45 0.00012913
+36 *10:48 0.00099075
+37 *10:9 *159:9 0.00059953
+
+*RES
+1 *10:33 *10:14 20.2179
+2 *10:15 *10:14 97.5378
+3 *10:12 *10:15 10.1456
+4 *10:12 *10:46 0.539107
+5 *10:44 *10:46 4.04614
+6 *10:40 *10:44 0.557028
+7 *10:40 *10:10 11.029
+8 *10:10 *10:19 351.846
+9 *10:18 *10:19 29.9563
+10 *10:18 *10:26 195.786
+11 *10:26 *10:48 9.24915
+12 *10:48 *10:25 17.8114
+13 *10:25 *10:32 156.771
+14 *10:30 *10:32 29.9563
+15 *10:30 *10:34 391.572
+16 *10:34 *10:35 30.7255
+17 *10:35 *233:A 156.002
+18 *10:26 *10:29 39.7254
+19 *227:A *10:29 22.6999
+20 *10:11 *10:33 195.786
+21 *10:28 *10:11 507.138
+22 *10:27 *10:28 30.7255
+23 *10:20 *10:27 312.831
+24 *10:36 *10:20 16.4546
+25 *10:36 *10:39 0.539107
+26 *10:39 *10:22 17.8066
+27 *10:9 *10:22 351.846
+28 *10:9 *229:A 22.4964
+29 *10:22 *10:24 30.7844
+30 *10:24 *228:A 161.691
+31 *10:17 *10:20 117.756
+32 *10:17 *234:A 52.5706
+33 *10:41 *10:11 10.5783
+34 *10:41 *10:43 0.557028
+35 *10:43 *10:45 7.20549
+36 *10:31 *10:45 9.24915
+37 *10:31 *230:A 156.06
+38 *230:A *10:16 19.5076
+39 *10:21 *10:16 488.399
+40 *10:21 *10:23 60.7996
+41 *10:23 *10:38 858.984
+42 *10:37 *10:38 60.0304
+43 *10:37 *232:A 46.9388
+44 *10:45 *10:47 1.3471
+45 *10:42 *10:47 0.539107
+46 *10:42 *10:13 11.036
+47 *10 *10:13 40.3328
+48 *10:33 *231:A 23.2268
+*END
+
+*D_NET *11 0.0184267
+
+*CONN
+*P *11 I *C 70.8 133.94 *L 0
+*I *246:A I *C 85.95 90.28 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *242:B1 I *C 87.3 84.725 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *241:B1 I *C 80.35 75.855 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *240:B1 I *C 88.71 71.405 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *239:B1 I *C 62.77 89.175 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *238:B1 I *C 55.38 71.405 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *237:B1 I *C 54.06 84.725 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *236:B1 I *C 74.3 84.725 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *235:B1 I *C 54.06 62.535 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *241:B1 0.00014531
+2 *239:B1 4.834e-05
+3 *235:B1 5.28e-05
+4 *11:10 0.0001273
+5 *11:11 0.00073758
+6 *11:12 0.00048745
+7 *11:13 5.902e-05
+8 *11:14 0.00030687
+9 *11:15 8.209e-05
+10 *11:16 0.00047672
+11 *11:17 5.144e-05
+12 *11:18 0.00026933
+13 *11:19 0.00376289
+14 *11:20 0.00031002
+15 *11:21 5.385e-05
+16 *11:22 0.00082429
+17 *11:23 0.00033576
+18 *11:24 4.866e-05
+19 *11:25 0.0001945
+20 *11:26 0.00012847
+21 *11:27 9.454e-05
+22 *11:28 0.00018075
+23 *11:29 0.00022094
+24 *11:30 0.00013743
+25 *11:31 3.513e-05
+26 *11:32 0.00019124
+27 *11:33 5.392e-05
+28 *11:34 0.00011372
+29 *11:35 7.667e-05
+30 *11:36 0.00058333
+31 *11:37 0.0005124
+32 *11:38 0.00035271
+33 *11:39 0.00015814
+34 *11:40 0.00024872
+35 *11:41 0.00055555
+36 *11:42 0.00012933
+37 *11:44 6.469e-05
+38 *11:45 0.00061712
+39 *11:46 0.00056027
+40 *11:47 3.067e-05
+41 *11:48 0.00016223
+42 *11:49 5.268e-05
+43 *11:51 0.00112481
+44 *11:52 0.00010097
+45 *11:53 0.00023224
+46 *11:54 9.705e-05
+47 *11:55 4.012e-05
+48 *11:56 0.0003994
+49 *11:16 *9:13 0.00064427
+50 *11:18 *29:2 0.00044774
+51 *11:12 *119:11 0.00043653
+52 *11:13 *159:14 0.00065534
+53 *11:10 *150:10 0.0006134
+
+*RES
+1 *11:40 *11:41 3.14968
+2 *11:41 *11:43 7.20549
+3 *11:36 *11:43 0.539107
+4 *11:36 *11:38 7.20549
+5 *11:13 *11:38 9.24915
+6 *11:13 *237:B1 39.0151
+7 *11:38 *11:22 12.8543
+8 *11:22 *11:28 624.952
+9 *11:28 *11:29 120.948
+10 *11:29 *239:B1 116.986
+11 *239:B1 *11:31 78.7405
+12 *11:31 *11:32 30.7255
+13 *11:32 *11:33 156.712
+14 *11:33 *11:16 30.7255
+15 *11:47 *11:16 399.341
+16 *11:45 *11:47 5.78532
+17 *11:45 *11:20 4.81503
+18 *11:42 *11:20 1.24436
+19 *11:42 *11:30 4.69514
+20 *11:17 *11:30 9.24915
+21 *11:17 *236:B1 39.6239
+22 *11:42 *11:44 0.67054
+23 *11:44 *11:46 0.277693
+24 *11:46 *11:50 2.25265
+25 *11:48 *11:50 0.284267
+26 *11:48 *11:53 0.698821
+27 *11:53 *11:56 3.36879
+28 *11:56 *11:15 4.80333
+29 *11:52 *11:15 0.0326202
+30 *11:52 *11:34 5.40865
+31 *11:12 *11:34 4.98306
+32 *11:11 *11:12 7.86937
+33 *11:11 *11:39 4.65934
+34 *240:B1 *11:39 9.24915
+35 *11:34 *11:24 9.81101
+36 *241:B1 *11:24 117.045
+37 *11:53 *11:54 1.09475
+38 *11:54 *11:55 0.277693
+39 *11:55 *11:37 4.92652
+40 *11:37 *11:14 10.5158
+41 *11:14 *242:B1 195.076
+42 *11:37 *11:10 14.7422
+43 *11:10 *246:A 78.0302
+44 *11:47 *11:49 0.427888
+45 *11:49 *11:51 0.557028
+46 *11:51 *11:19 12.3879
+47 *11 *11:19 40.3328
+48 *11:41 *11:27 87.9897
+49 *11:26 *11:27 120.179
+50 *11:26 *238:B1 39.7254
+51 *11:35 *11:40 0.557028
+52 *11:35 *11:18 4.03305
+53 *11:23 *11:18 2.69904
+54 *11:23 *11:25 0.539107
+55 *11:25 *11:21 11.0469
+56 *235:B1 *11:21 52.833
+*END
+
+*D_NET *12 0.00704176
+
+*CONN
+*P *12 O *C 86.16 133.94 *L 0.006
+*I *226:Q O *C 99.09 90.28 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *190:A I *C 99.78 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *226:Q 1.993e-05
+2 *12:3 0.00197147
+3 *12:4 0.00376289
+4 *12:5 0.00013934
+5 *12:6 9.048e-05
+6 *12:7 9.605e-05
+7 *12:9 0.00044332
+8 *12:10 7.215e-05
+9 *12:11 0.00012436
+10 *12:12 0.00032177
+
+*RES
+1 *12:12 *12:6 11.9482
+2 *12:6 *12:7 78.7405
+3 *226:Q *12:7 23.4691
+4 *12:7 *12:8 90.1046
+5 *12:3 *12:8 1054.12
+6 *12:4 *12:3 19.8393
+7 *12 *12:4 40.3328
+8 *12:10 *12:12 0.557028
+9 *12:9 *12:10 4.92951
+10 *12:9 *12:11 0.539107
+11 *12:11 *12:5 10.1456
+12 *12:5 *190:A 117.045
+*END
+
+*D_NET *13 0.011335
+
+*CONN
+*P *13 O *C 142.08 72.35 *L 0.006
+*I *301:A I *C 91.48 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *223:Q O *C 90.07 76.96 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *209:A I *C 90.32 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *13:4 0.00047295
+2 *13:5 0.00088183
+3 *13:6 5.637e-05
+4 *13:7 0.00234529
+5 *13:8 0.00505929
+6 *13:9 0.00097381
+7 *13:11 7.758e-05
+8 *13:12 0.00041963
+9 *13:4 *23:4 0.00063881
+10 *13:6 *110:3 0.00040939
+
+*RES
+1 *13 *13:8 16.5538
+2 *13:7 *13:8 12.0549
+3 *13:7 *13:4 6.55263
+4 *13:5 *13:4 9.45872
+5 *13:5 *13:10 0.539107
+6 *13:9 *13:10 10.8107
+7 *301:A *13:9 9.24915
+8 *13:7 *13:12 5.59204
+9 *13:6 *13:12 0.561864
+10 *223:Q *13:6 9.24915
+11 *13:12 *13:13 8.10195
+12 *13:11 *13:13 0.561864
+13 *209:A *13:11 9.24915
+*END
+
+*D_NET *14 0.0131051
+
+*CONN
+*P *14 O *C 142.08 63.2 *L 0.006
+*I *280:B I *C 93.95 63.27 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *278:A I *C 90.76 61.79 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *224:Q O *C 81.6 70.3 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *208:A I *C 81.3 43.66 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *280:B 4.661e-05
+2 *14:5 0.00021016
+3 *14:6 6.013e-05
+4 *14:7 0.00022751
+5 *14:8 7.537e-05
+6 *14:9 6.828e-05
+7 *14:10 0.00497642
+8 *14:11 7.675e-05
+9 *14:12 0.00013743
+10 *14:13 0.00013072
+11 *14:14 6.91e-05
+12 *14:16 0.00064036
+13 *14:17 0.00034065
+14 *14:18 0.0001023
+15 *14:19 8.322e-05
+16 *14:20 0.00016788
+17 *14:21 9.864e-05
+18 *14:22 0.00097751
+19 *14:23 0.00011025
+20 *14:24 0.00022241
+21 *14:25 0.00186233
+22 *14:26 0.00186652
+23 *14:5 *119:2 0.00055458
+
+*RES
+1 *14:23 *14:24 0.277693
+2 *14:24 *14:17 5.15277
+3 *14:17 *14:18 2.74041
+4 *278:A *14:18 9.24915
+5 *14:18 *14:19 0.974369
+6 *14:25 *14:19 5.60689
+7 *14:20 *14:25 4.47566
+8 *14:20 *14:13 9.40738
+9 *14:13 *14:15 30.0152
+10 *280:B *14:15 39.7254
+11 *14:25 *14:10 5.76931
+12 *14:9 *14:10 16.3947
+13 *14:9 *14:11 0.277693
+14 *14:11 *14 0.149204
+15 *14:22 *14:23 3.37731
+16 *14:22 *14:7 0.284267
+17 *14:26 *14:7 4.23729
+18 *14:26 *14:5 1.24809
+19 *14:14 *14:5 3.96511
+20 *14:6 *14:14 0.0326202
+21 *14:6 *14:12 4.59811
+22 *224:Q *14:12 9.24915
+23 *14:26 *14:21 5.41814
+24 *14:21 *14:16 4.95643
+25 *14:16 *14:8 13.7312
+26 *14:8 *208:A 58.5227
+*END
+
+*D_NET *15 0.0114395
+
+*CONN
+*P *15 O *C 0 64.42 *L 0.006
+*I *332:A I *C 61.24 50.32 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *283:A1 I *C 62.91 57.72 *L 0.742 *D sky130_osu_sc_18T_ms__mux2_1
+*I *244:Y O *C 62.15 61.79 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *201:A I *C 58.42 70.3 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *15 0.00467696
+2 *15:5 0.00039594
+3 *15:6 0.00123422
+4 *15:7 0.00022999
+5 *15:8 0.00011645
+6 *15:9 9.218e-05
+7 *15:10 4.612e-05
+8 *15:11 0.00087758
+9 *15:12 0.00066675
+10 *15:13 0.00023652
+11 *15:14 0.00014214
+12 *15:15 0.00069077
+13 *15:16 0.0006453
+14 *15:18 0.00058151
+15 *15:19 1.55e-05
+16 *15:6 *16:6 0.00079161
+
+*RES
+1 *15:13 *15:19 4.47566
+2 *15:18 *15:19 1.58373
+3 *15:16 *15:18 2.02803
+4 *15:16 *15:17 0.284267
+5 *15:15 *15:17 2.70514
+6 *15:14 *15:15 0.565216
+7 *15:14 *15:6 5.98736
+8 *15 *15:6 16.5538
+9 *15:18 *15:5 6.8385
+10 *15:8 *15:5 4.05581
+11 *201:A *15:8 9.24915
+12 *15:13 *15:10 11.3928
+13 *15:10 *244:Y 39.0151
+14 *15:9 *244:Y 78.0302
+15 *15:12 *15:9 15.1075
+16 *15:7 *15:12 9.24915
+17 *15:7 *283:A1 156.06
+18 *15:11 *15:12 9.01291
+19 *332:A *15:11 9.24915
+*END
+
+*D_NET *16 0.0101983
+
+*CONN
+*P *16 O *C 0 63.2 *L 0.006
+*I *294:B I *C 53.43 57.35 *L 0.00431 *D sky130_osu_sc_18T_ms__or2_l
+*I *288:A I *C 49.11 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *275:B0 I *C 56.26 57.72 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *243:Y O *C 56.66 61.79 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *202:A I *C 51.6 63.64 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *16 8.103e-05
+2 *288:A 0.00013199
+3 *275:B0 0.00013438
+4 *243:Y 4.536e-05
+5 *16:6 0.00173513
+6 *16:7 0.00469112
+7 *16:8 0.00046201
+8 *16:10 7.799e-05
+9 *16:11 6.693e-05
+10 *16:12 0.00018881
+11 *16:13 0.00013916
+12 *16:14 3.03e-05
+13 *16:15 0.00053552
+14 *16:16 0.00013378
+15 *16:17 0.00020294
+16 *16:18 0.00062777
+17 *16:20 2.662e-05
+18 *16:21 5.053e-05
+19 *16:22 4.528e-05
+20 *16:6 *15:6 0.00079161
+
+*RES
+1 *16:7 *16:9 0.284267
+2 *16 *16:9 0.368877
+3 *16:7 *16:6 16.1685
+4 *16:8 *16:6 7.1268
+5 *16:17 *16:8 4.47566
+6 *16:16 *16:17 0.969533
+7 *16:16 *16:19 0.539107
+8 *16:18 *16:19 5.39808
+9 *16:18 *16:12 10.3956
+10 *16:12 *294:B 117.045
+11 *16:18 *16:11 9.67703
+12 *288:A *16:11 78.0302
+13 *16:17 *16:10 10.528
+14 *16:10 *202:A 78.0302
+15 *16:8 *16:21 6.73813
+16 *16:20 *16:21 0.0333975
+17 *16:13 *16:20 9.24915
+18 *16:13 *243:Y 97.5378
+19 *243:Y *16:14 53.2394
+20 *16:22 *16:14 9.81101
+21 *16:22 *16:15 14.2014
+22 *275:B0 *16:15 122.735
+*END
+
+*D_NET *17 0.00718693
+
+*CONN
+*P *17 O *C 56.4 133.94 *L 0.006
+*I *269:B I *C 46.21 83.99 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *220:Q O *C 51.95 90.28 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *197:A I *C 44.01 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *220:Q 2.946e-05
+2 *197:A 1.993e-05
+3 *17:4 0.00376289
+4 *17:5 0.00015237
+5 *17:6 0.00065803
+6 *17:7 3.661e-05
+7 *17:8 0.00028212
+8 *17:9 2.835e-05
+9 *17:10 0.00027141
+10 *17:11 0.00011459
+11 *17:12 4.489e-05
+12 *17:13 0.00058449
+13 *17:15 0.00029937
+14 *17:16 0.00090242
+
+*RES
+1 *17:13 *17:14 5.39808
+2 *17:10 *17:14 0.539107
+3 *17:10 *17:6 11.4975
+4 *17:5 *17:6 156.002
+5 *197:A *17:5 23.4691
+6 *17:6 *17:8 546.922
+7 *17:7 *17:8 30.7255
+8 *220:Q *17:7 39.7254
+9 *17:8 *17:9 273.047
+10 *17:15 *17:9 11.9303
+11 *17:15 *17:16 0.557028
+12 *17:16 *17:4 9.2334
+13 *17 *17:4 40.3328
+14 *17:12 *17:13 0.264717
+15 *17:11 *17:12 0.446158
+16 *269:B *17:11 9.24915
+*END
+
+*D_NET *18 0.00537576
+
+*CONN
+*P *18 O *C 61.2 133.94 *L 0.006
+*I *225:Q O *C 63.5 90.28 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *217:A I *C 60.18 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *217:A 5.775e-05
+2 *18:3 0.00281065
+3 *18:4 0.00101889
+4 *18:5 5.419e-05
+5 *18:6 0.00011388
+6 *18:8 0.00116563
+7 *18:9 0.00015477
+
+*RES
+1 *18:6 *18:8 77.9713
+2 *18:8 *18:10 39.7254
+3 *18:9 *18:10 29.9563
+4 *18:9 *225:Q 117.756
+5 *18:8 *18:4 21.1913
+6 *18:7 *18:4 9.68405
+7 *18:3 *18:7 0.539107
+8 *18:3 *18 30.6391
+9 *18:5 *18:6 30.7255
+10 *217:A *18:5 39.7254
+*END
+
+*D_NET *19 0.00779923
+
+*CONN
+*P *19 O *C 76.56 133.94 *L 0.006
+*I *333:A I *C 79.35 83.62 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *245:Y O *C 79.87 88.43 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *236:A1 I *C 75.46 83.99 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *19 0.00017482
+2 *333:A 2.067e-05
+3 *19:4 0.0003943
+4 *19:5 0.00378039
+5 *19:6 9.024e-05
+6 *19:8 0.00014386
+7 *19:9 0.00017624
+8 *19:10 0.00014937
+9 *19:12 0.00032152
+10 *19:13 0.00037362
+11 *19:14 0.00061407
+12 *19:15 9.254e-05
+13 *19:16 0.00015992
+14 *19:18 0.00012215
+15 *19:19 0.00118552
+
+*RES
+1 *19:18 *19:19 0.896455
+2 *19:9 *19:19 9.24915
+3 *19:9 *245:Y 117.045
+4 *19:19 *19:5 12.8434
+5 *19:7 *19:5 40.328
+6 *19 *19:7 2.31573
+7 *19:15 *19:18 0.557028
+8 *19:14 *19:15 4.92951
+9 *19:14 *19:17 0.539107
+10 *19:16 *19:17 0.891619
+11 *19:13 *19:16 0.557028
+12 *19:13 *19:8 11.4796
+13 *19:4 *19:8 273.106
+14 *19:12 *19:4 11.0517
+15 *19:6 *19:12 9.24915
+16 *19:6 *236:A1 78.0302
+17 *19:8 *19:10 117.756
+18 *19:10 *19:11 90.1046
+19 *333:A *19:11 39.7254
+*END
+
+*D_NET *20 0.00222321
+
+*CONN
+*I *334:B I *C 93.67 85.1 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *196:Y O *C 100.59 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *179:A I *C 88.45 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *179:A 0.00012669
+2 *20:3 0.00039556
+3 *20:5 2.64e-05
+4 *20:6 0.00014686
+5 *20:7 0.0008447
+6 *20:8 0.00022607
+7 *20:9 0.00045693
+
+*RES
+1 *20:3 *20:4 29.9563
+2 *179:A *20:4 117.756
+3 *20:3 *20:5 273.816
+4 *20:8 *20:5 11.0517
+5 *20:8 *20:9 0.561864
+6 *20:9 *20:7 13.7508
+7 *20:7 *196:Y 585.227
+8 *20:8 *20:6 40.0336
+9 *20:6 *334:B 39.5143
+*END
+
+*D_NET *21 0.00218338
+
+*CONN
+*I *268:A I *C 47.19 88.43 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *260:A1 I *C 47.64 83.99 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *237:A1 I *C 55.22 83.99 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *197:Y O *C 44.49 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *268:A 4.785e-05
+2 *197:Y 0.0001477
+3 *21:4 0.00013322
+4 *21:5 4.405e-05
+5 *21:6 2.564e-05
+6 *21:7 0.0004942
+7 *21:8 0.00023994
+8 *21:9 7.777e-05
+9 *21:10 0.00069659
+10 *21:11 0.00027642
+
+*RES
+1 *21:11 *21:7 11.4975
+2 *21:7 *237:A1 351.136
+3 *21:10 *21:11 3.46221
+4 *21:9 *21:10 0.423052
+5 *21:8 *21:9 0.557028
+6 *21:8 *21:5 10.1277
+7 *21:4 *21:5 60.0894
+8 *21:4 *260:A1 29.9716
+9 *21:10 *21:6 12.3988
+10 *268:A *21:6 78.0302
+11 *197:Y *268:A 117.045
+*END
+
+*D_NET *22 0.00497359
+
+*CONN
+*I *272:A1 I *C 96.81 63.27 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *208:Y O *C 81.78 45.51 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *185:A I *C 76.57 43.66 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *272:A1 8.625e-05
+2 *208:Y 1.999e-05
+3 *22:3 0.00070138
+4 *22:4 7.885e-05
+5 *22:5 0.00053622
+6 *22:6 2.88e-05
+7 *22:7 0.00011778
+8 *22:9 0.00135987
+9 *22:11 0.00154316
+10 *22:3 *1:10 0.00050129
+
+*RES
+1 *208:Y *22:5 23.4691
+2 *22:5 *22:6 351.077
+3 *22:11 *22:6 27.7256
+4 *22:11 *22:9 790.262
+5 *22:9 *22:10 150.253
+6 *22:7 *22:10 40.4357
+7 *22:7 *22:8 29.9563
+8 *272:A1 *22:8 78.7405
+9 *22:4 *208:Y 52.3676
+10 *22:3 *22:4 489.11
+11 *22:3 *185:A 22.4964
+*END
+
+*D_NET *23 0.00482478
+
+*CONN
+*I *335:A0 I *C 91.38 56.98 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *209:Y O *C 90.8 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *198:A I *C 98.02 76.96 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *23:3 0.00016072
+2 *23:4 0.00087161
+3 *23:5 0.0001126
+4 *23:6 0.00059089
+5 *23:7 0.00035388
+6 *23:8 0.00015563
+7 *23:10 0.00064093
+8 *23:11 0.00030942
+9 *23:12 6.608e-05
+10 *23:13 0.0004486
+11 *23:14 4.058e-05
+12 *23:15 0.00023653
+13 *23:16 5.125e-05
+14 *23:18 0.00014725
+15 *23:4 *13:4 0.00063881
+
+*RES
+1 *23:7 *23:11 0.539107
+2 *23:11 *23:3 11.4975
+3 *23:3 *335:A0 117.654
+4 *23:7 *23:9 2.6942
+5 *23:6 *23:9 0.539107
+6 *23:6 *23:4 7.20549
+7 *23:12 *23:4 9.89145
+8 *23:12 *23:15 0.557028
+9 *23:15 *23:16 2.69904
+10 *23:16 *23:10 556.171
+11 *23:8 *23:10 29.9563
+12 *23:8 *198:A 118.364
+13 *23:16 *23:17 0.896455
+14 *23:13 *23:17 0.539107
+15 *23:13 *23:14 6.28145
+16 *23:14 *23:18 0.557028
+17 *23:18 *23:5 10.1456
+18 *23:5 *209:Y 97.5378
+*END
+
+*D_NET *24 0.00379199
+
+*CONN
+*I *293:B I *C 64.9 76.59 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *291:A I *C 64.03 85.47 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *281:A1 I *C 62.04 76.59 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *217:Y O *C 60.66 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *183:A I *C 59.41 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *293:B 4.164e-05
+2 *183:A 0.00014368
+3 *24:5 0.00023665
+4 *24:6 8.956e-05
+5 *24:7 9.888e-05
+6 *24:8 2.528e-05
+7 *24:9 0.00012009
+8 *24:10 8.661e-05
+9 *24:11 6.789e-05
+10 *24:12 0.00015355
+11 *24:13 0.0002921
+12 *24:15 3.531e-05
+13 *24:16 7.546e-05
+14 *24:17 0.00041346
+15 *24:18 0.00041817
+16 *24:19 0.0002412
+17 *24:20 0.00048231
+18 *24:21 0.00036576
+19 *24:5 *117:5 0.00040439
+
+*RES
+1 *24:12 *24:13 120.948
+2 *24:13 *24:14 60.0304
+3 *24:5 *24:14 195.786
+4 *24:18 *24:5 11.953
+5 *24:6 *24:18 9.24915
+6 *24:6 *217:Y 58.9793
+7 *24:13 *291:A 157.481
+8 *24:9 *24:12 117.697
+9 *24:8 *24:9 30.7255
+10 *183:A *24:8 117.756
+11 *24:7 *24:8 30.7255
+12 *24:7 *24:11 78.7405
+13 *24:20 *24:11 14.6569
+14 *24:19 *24:20 2.69904
+15 *24:19 *24:10 9.81101
+16 *24:10 *281:A1 78.0302
+17 *24:20 *24:17 321.37
+18 *24:17 *24:21 9.24915
+19 *24:21 *24:16 11.5024
+20 *24:15 *24:16 30.0152
+21 *293:B *24:15 39.7254
+*END
+
+*D_NET *25 0.001275
+
+*CONN
+*I *247:Y O *C 95.73 85.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *242:B0 I *C 86.62 84.36 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *25:2 0.00069096
+2 *25:3 0.00021098
+3 *25:5 0.00014932
+4 *25:6 7.81e-05
+5 *25:7 0.00014564
+
+*RES
+1 *25:3 *25:4 29.9563
+2 *25:2 *25:4 546.922
+3 *25:7 *25:2 10.1456
+4 *25:6 *25:7 0.557028
+5 *25:5 *25:6 0.878534
+6 *242:B0 *25:5 9.24915
+7 *25:3 *247:Y 157.38
+*END
+
+*D_NET *26 0.00106316
+
+*CONN
+*I *249:Y O *C 92.6 75.11 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *240:B0 I *C 89.39 71.04 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *240:B0 3.212e-05
+2 *26:2 4.94e-05
+3 *26:3 4.548e-05
+4 *26:4 0.00025409
+5 *26:5 0.00068207
+
+*RES
+1 *26:4 *26:5 9.24915
+2 *26:5 *26:3 13.7556
+3 *26:2 *26:3 30.0152
+4 *240:B0 *26:2 39.7254
+5 *26:4 *249:Y 195.076
+*END
+
+*D_NET *27 0.0018627
+
+*CONN
+*I *251:Y O *C 72.96 72.15 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *241:B0 I *C 81.03 76.22 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *251:Y 0.00103535
+2 *241:B0 0.00014143
+3 *27:2 2.784e-05
+4 *27:3 2.634e-05
+5 *27:4 0.00063174
+
+*RES
+1 *27:4 *27:2 14.2062
+2 *251:Y *27:2 741.287
+3 *27:3 *27:4 9.24915
+4 *241:B0 *27:3 107.292
+*END
+
+*D_NET *28 0.00094493
+
+*CONN
+*I *253:Y O *C 63.39 72.15 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *238:B0 I *C 56.06 71.04 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *238:B0 9.792e-05
+2 *28:2 4.109e-05
+3 *28:3 5.824e-05
+4 *28:4 2.301e-05
+5 *28:5 4.521e-05
+6 *28:6 7.136e-05
+7 *28:7 0.0006081
+
+*RES
+1 *28:3 *28:6 9.24915
+2 *28:7 *28:6 4.52575
+3 *28:7 *28:5 7.19063
+4 *28:4 *28:5 0.0500962
+5 *28:2 *28:4 9.24915
+6 *238:B0 *28:2 83.7199
+7 *28:3 *253:Y 36.9831
+*END
+
+*D_NET *29 0.00325173
+
+*CONN
+*I *255:Y O *C 46.475 76.22 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *235:B0 I *C 54.74 62.9 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *29:2 0.00017352
+2 *29:3 0.00017854
+3 *29:5 0.00031692
+4 *29:6 0.00110715
+5 *29:7 0.00014843
+6 *29:8 0.00030968
+7 *29:10 3.72e-05
+8 *29:12 8.908e-05
+9 *29:2 *11:18 0.00044774
+10 *29:2 *159:11 0.00044347
+
+*RES
+1 *29:12 *29:10 10.1456
+2 *29:6 *29:10 781.013
+3 *29:6 *29:7 90.8738
+4 *29:7 *255:Y 84.727
+5 *29:11 *29:12 0.264717
+6 *29:5 *29:11 4.92951
+7 *29:4 *29:5 0.264717
+8 *29:4 *29:2 3.13176
+9 *29:3 *29:2 1.79775
+10 *29:3 *29:9 0.539107
+11 *29:8 *29:9 3.21058
+12 *235:B0 *29:8 9.24915
+*END
+
+*D_NET *30 0.00135465
+
+*CONN
+*I *258:Y O *C 49.42 88.43 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *237:B0 I *C 54.74 84.36 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *258:Y 0.00056315
+2 *237:B0 5.984e-05
+3 *30:2 4.476e-05
+4 *30:3 4.544e-05
+5 *30:4 0.00010862
+6 *30:5 0.00053284
+
+*RES
+1 *30:2 *30:3 30.0152
+2 *30:5 *30:3 13.305
+3 *30:5 *30:4 39.2643
+4 *258:Y *30:4 468.892
+5 *237:B0 *30:2 39.7254
+*END
+
+*D_NET *31 0.00081868
+
+*CONN
+*I *279:Y O *C 61.8 85.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *239:B0 I *C 62.09 89.54 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *31:2 0.00011303
+2 *31:3 0.00011381
+3 *31:4 8.202e-05
+4 *31:5 0.00050982
+
+*RES
+1 *31:5 *31:4 4.03305
+2 *31:4 *31:3 0.557028
+3 *31:3 *31:2 0.896455
+4 *239:B0 *31:2 9.24915
+5 *279:Y *31:5 9.24915
+*END
+
+*D_NET *32 0.00157323
+
+*CONN
+*I *300:Y O *C 75.86 75.11 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *236:B0 I *C 74.98 84.36 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *300:Y 0.00016293
+2 *236:B0 8.724e-05
+3 *32:2 2.539e-05
+4 *32:3 0.00115141
+5 *32:4 0.00014626
+
+*RES
+1 *32:4 *32:3 19.6092
+2 *300:Y *32:3 117.045
+3 *32:4 *32:2 10.3956
+4 *236:B0 *32:2 78.0302
+*END
+
+*D_NET *33 0.00230155
+
+*CONN
+*I *332:Y O *C 61.72 48.47 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *285:A I *C 63.66 50.32 *L 0.00432 *D sky130_osu_sc_18T_ms__and2_l
+*I *283:A0 I *C 63.87 57.35 *L 0.741 *D sky130_osu_sc_18T_ms__mux2_1
+*I *271:B0 I *C 66.18 57.72 *L 0.00578 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *332:Y 3.549e-05
+2 *271:B0 0.00013483
+3 *33:4 0.0001472
+4 *33:5 0.0001617
+5 *33:6 0.00045196
+6 *33:7 2.939e-05
+7 *33:8 0.00020943
+8 *33:10 0.00054575
+9 *33:11 5.286e-05
+10 *33:12 0.00019722
+11 *33:13 0.00014555
+12 *33:15 0.00019017
+
+*RES
+1 *33:6 *33:8 312.831
+2 *33:8 *33:9 90.1046
+3 *271:B0 *33:9 98.2481
+4 *33:15 *33:6 10.1456
+5 *33:11 *33:15 0.557028
+6 *33:10 *33:11 4.92951
+7 *33:10 *33:14 0.539107
+8 *33:13 *33:14 0.896455
+9 *33:12 *33:13 0.901291
+10 *285:A *33:12 9.24915
+11 *33:13 *33:5 126.236
+12 *33:4 *33:5 90.8738
+13 *332:Y *33:4 39.7254
+14 *33:6 *33:7 60.8586
+15 *33:7 *283:A0 19.4486
+*END
+
+*D_NET *34 0.00128851
+
+*CONN
+*I *333:Y O *C 78.87 85.47 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *309:B I *C 77.77 76.59 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *300:A1 I *C 76.34 76.59 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *309:B 5.404e-05
+2 *300:A1 1.651e-05
+3 *34:3 5.155e-05
+4 *34:4 8.03e-05
+5 *34:5 6.388e-05
+6 *34:6 0.00102223
+
+*RES
+1 *300:A1 *309:B 136.553
+2 *309:B *34:3 39.7254
+3 *34:3 *34:4 30.0152
+4 *34:6 *34:4 17.8114
+5 *34:5 *34:6 9.24915
+6 *34:5 *333:Y 39.0151
+*END
+
+*D_NET *35 0.00402982
+
+*CONN
+*I *337:B I *C 48.18 49.95 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *331:Y O *C 69.38 58.83 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *289:B I *C 46.92 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *337:B 1.932e-05
+2 *331:Y 9.41e-05
+3 *289:B 0.00010902
+4 *35:3 6.226e-05
+5 *35:4 6.046e-05
+6 *35:5 4.518e-05
+7 *35:6 0.0001614
+8 *35:7 6.958e-05
+9 *35:8 0.00019519
+10 *35:9 0.0007138
+11 *35:10 0.00249951
+
+*RES
+1 *337:B *35:3 39.7254
+2 *35:3 *35:4 30.0152
+3 *35:8 *35:4 10.5962
+4 *35:6 *35:8 0.539107
+5 *35:6 *35:7 1.70031
+6 *35:10 *35:7 15.1093
+7 *35:9 *35:10 4.47566
+8 *35:9 *35:5 15.205
+9 *331:Y *35:5 78.0302
+10 *289:B *337:B 117.045
+*END
+
+*D_NET *36 0.0014366
+
+*CONN
+*I *335:A1 I *C 91.86 57.35 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *330:Y O *C 88.75 58.83 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *301:B I *C 90.04 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *330:Y 0.00011972
+2 *36:3 6.485e-05
+3 *36:4 0.00031794
+4 *36:6 0.00093409
+
+*RES
+1 *330:Y *36:5 156.771
+2 *36:4 *36:5 30.6867
+3 *36:6 *36:4 87.9897
+4 *36:6 *36:3 18.2621
+5 *36:3 *301:B 43.993
+6 *36:4 *335:A1 117.756
+*END
+
+*D_NET *37 0.00271004
+
+*CONN
+*I *329:Y O *C 70.32 48.47 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *315:A I *C 57.98 43.66 *L 0.00455 *D sky130_osu_sc_18T_ms__or2_l
+*I *302:B I *C 58.69 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *295:B1 I *C 61.01 44.765 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *302:B 8.051e-05
+2 *37:4 0.00014944
+3 *37:5 7.071e-05
+4 *37:7 0.00127792
+5 *37:8 6.926e-05
+6 *37:9 0.00030578
+7 *37:10 0.00016526
+8 *37:11 0.00038506
+9 *37:12 0.0002061
+
+*RES
+1 *315:A *37:9 9.24915
+2 *37:9 *37:10 1.73111
+3 *37:10 *37:11 1.3471
+4 *37:4 *37:11 9.24915
+5 *37:4 *295:B1 117.045
+6 *37:11 *37:12 3.60517
+7 *37:12 *37:7 829.277
+8 *37:7 *37:8 60.7996
+9 *37:8 *329:Y 39.1084
+10 *37:12 *37:5 11.5024
+11 *37:5 *37:6 30.0152
+12 *302:B *37:6 88.4943
+*END
+
+*D_NET *38 0.00226174
+
+*CONN
+*I *328:Y O *C 78.95 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_l
+*I *310:B I *C 85.14 49.95 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *305:A I *C 85.87 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *328:Y 6.532e-05
+2 *38:3 0.00073064
+3 *38:4 5.425e-05
+4 *38:5 0.00131791
+5 *38:6 9.362e-05
+
+*RES
+1 *328:Y *38:3 53.5433
+2 *38:3 *38:4 507.138
+3 *38:5 *38:4 13.7373
+4 *310:B *38:5 9.24915
+5 *38:5 *38:6 8.58054
+6 *305:A *38:6 9.24915
+*END
+
+*D_NET *39 0.00152355
+
+*CONN
+*I *327:Y O *C 78.84 48.47 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *313:B I *C 80.41 57.35 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *307:B I *C 79.15 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *327:Y 6.92e-05
+2 *307:B 2.986e-05
+3 *39:3 8.972e-05
+4 *39:4 9.128e-05
+5 *39:5 2.868e-05
+6 *39:6 0.0001306
+7 *39:7 0.00108421
+
+*RES
+1 *39:7 *39:5 19.1585
+2 *327:Y *39:5 78.0302
+3 *39:6 *39:7 0.539107
+4 *39:6 *39:3 9.69496
+5 *39:3 *39:4 30.7844
+6 *307:B *39:4 39.7254
+7 *39:4 *313:B 78.6308
+*END
+
+*D_NET *40 0.00366937
+
+*CONN
+*I *326:Y O *C 72.24 58.83 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *314:B I *C 62.71 49.95 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *306:A I *C 63.63 43.66 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *314:B 5.192e-05
+2 *40:3 0.0001135
+3 *40:4 0.0001102
+4 *40:5 0.00017079
+5 *40:7 0.00092332
+6 *40:8 0.0003448
+7 *40:9 0.00075511
+8 *40:11 0.00111918
+9 *40:12 8.055e-05
+
+*RES
+1 *314:B *40:6 39.7254
+2 *40:5 *40:6 60.0894
+3 *40:12 *40:5 9.81101
+4 *40:11 *40:12 0.786838
+5 *40:9 *40:11 5.96801
+6 *306:A *40:9 9.24915
+7 *40:11 *40:4 7.98249
+8 *40:8 *40:4 5.04128
+9 *40:8 *40:10 2.58942
+10 *40:7 *40:10 0.539107
+11 *40:7 *40:3 17.8066
+12 *40:3 *326:Y 78.0302
+*END
+
+*D_NET *41 0.0027089
+
+*CONN
+*I *325:Y O *C 66.3 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *312:A I *C 54.017 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *304:A I *C 47.53 45.51 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *41:3 0.00029254
+2 *41:4 4.251e-05
+3 *41:5 0.00023351
+4 *41:6 0.00029361
+5 *41:7 0.00011471
+6 *41:8 8.483e-05
+7 *41:9 0.00084593
+8 *41:10 8.365e-05
+9 *41:11 7.426e-05
+10 *41:12 0.00024038
+11 *41:3 *42:3 0.00040297
+
+*RES
+1 *41:12 *41:8 5.15277
+2 *41:8 *41:5 9.30529
+3 *41:5 *325:Y 185.322
+4 *41:11 *41:12 0.277693
+5 *41:9 *41:11 4.05605
+6 *41:9 *41:10 0.284267
+7 *41:10 *41:7 5.1462
+8 *41:7 *41:4 10.0165
+9 *41:3 *41:4 351.136
+10 *41:6 *41:3 11.5024
+11 *304:A *41:6 9.24915
+12 *41:4 *312:A 78.0302
+*END
+
+*D_NET *42 0.00345441
+
+*CONN
+*I *324:Y O *C 72.35 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *312:B I *C 53.8 44.03 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *304:B I *C 49.45 45.14 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *304:B 0.00011548
+2 *42:3 9.077e-05
+3 *42:4 0.00013399
+4 *42:6 0.00014886
+5 *42:8 5.958e-05
+6 *42:9 5.986e-05
+7 *42:10 0.00038658
+8 *42:11 0.00107617
+9 *42:12 0.0006335
+10 *42:13 0.00034665
+11 *42:3 *41:3 0.00040297
+
+*RES
+1 *304:B *42:5 156.06
+2 *42:3 *42:5 30.0152
+3 *42:3 *42:7 118.466
+4 *42:6 *42:7 60.0304
+5 *42:6 *312:B 79.1971
+6 *42:5 *42:8 9.24915
+7 *42:8 *42:9 0.18886
+8 *42:11 *42:9 9.67115
+9 *42:11 *42:12 0.277693
+10 *42:12 *42:14 2.25265
+11 *42:13 *42:14 0.284267
+12 *42:13 *42:10 5.1462
+13 *42:10 *42:4 223.832
+14 *324:Y *42:4 97.5378
+*END
+
+*D_NET *43 0.00176416
+
+*CONN
+*I *323:Y O *C 87.16 48.47 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *311:B I *C 95.44 44.03 *L 0.0042 *D sky130_osu_sc_18T_ms__nand2_l
+*I *303:A I *C 91.35 43.66 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *296:A0 I *C 93.755 43.66 *L 0.00553 *D sky130_osu_sc_18T_ms__oai21_l
+
+*CAP
+1 *323:Y 0.00030266
+2 *311:B 8.796e-05
+3 *303:A 0.00015738
+4 *296:A0 2.782e-05
+5 *43:4 0.00014799
+6 *43:5 2.618e-05
+7 *43:6 0.0002417
+8 *43:8 0.00012
+9 *43:10 0.00065247
+
+*RES
+1 *43:6 *43:7 29.9563
+2 *296:A0 *43:7 39.7254
+3 *303:A *296:A0 117.045
+4 *43:4 *303:A 117.045
+5 *43:10 *43:4 15.1075
+6 *43:5 *43:10 9.24915
+7 *323:Y *43:5 234.091
+8 *43:6 *43:8 196.496
+9 *43:8 *43:9 60.0304
+10 *311:B *43:9 78.7405
+*END
+
+*D_NET *44 0.00475821
+
+*CONN
+*I *322:Y O *C 85.28 45.51 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *299:A I *C 83.39 70.3 *L 0.00455 *D sky130_osu_sc_18T_ms__or2_l
+*I *297:B I *C 86.3 62.16 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *287:B1 I *C 86.42 71.405 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *322:Y 0.00013958
+2 *297:B 0.00026528
+3 *44:4 0.00065339
+4 *44:5 0.00037615
+5 *44:6 0.00022679
+6 *44:8 0.0001706
+7 *44:9 0.0003237
+8 *44:10 4.479e-05
+9 *44:11 0.00012633
+10 *44:12 3.245e-05
+11 *44:14 0.0008561
+12 *44:15 5.951e-05
+13 *44:16 0.00073308
+14 *44:17 0.00075046
+
+*RES
+1 *44:4 *44:7 195.786
+2 *297:B *44:7 173.071
+3 *297:B *44:12 29.2613
+4 *44:17 *44:12 16.004
+5 *44:15 *44:17 0.557028
+6 *44:14 *44:15 8.08403
+7 *44:14 *44:16 0.539107
+8 *44:16 *44:10 14.6521
+9 *322:Y *44:10 97.5378
+10 *44:5 *44:4 12.4037
+11 *44:11 *44:5 4.05581
+12 *299:A *44:11 9.24915
+13 *44:11 *44:13 0.445809
+14 *44:8 *44:13 0.539107
+15 *44:8 *44:9 0.873698
+16 *44:9 *44:6 10.9982
+17 *44:6 *287:B1 127.408
+*END
+
+*D_NET *45 0.00240802
+
+*CONN
+*I *321:Y O *C 67.68 45.51 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *315:B I *C 57.5 44.03 *L 0.00431 *D sky130_osu_sc_18T_ms__or2_l
+*I *302:A I *C 57.25 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *295:B0 I *C 60.33 44.4 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *315:B 5.533e-05
+2 *45:4 0.00016212
+3 *45:5 0.00010425
+4 *45:6 2.591e-05
+5 *45:7 0.00017295
+6 *45:8 9.467e-05
+7 *45:9 0.00104586
+8 *45:10 0.0003415
+9 *45:11 0.00040543
+
+*RES
+1 *45:8 *321:Y 39.7254
+2 *45:8 *45:9 29.9563
+3 *45:11 *45:9 751.247
+4 *45:10 *45:11 1.80258
+5 *45:10 *45:5 39.2643
+6 *315:B *45:5 59.233
+7 *45:10 *45:7 10.4184
+8 *45:7 *295:B0 78.0302
+9 *45:11 *45:6 13.305
+10 *45:4 *45:6 39.7254
+11 *45:4 *302:A 90.1635
+*END
+
+*D_NET *46 0.00108985
+
+*CONN
+*I *320:Y O *C 88.15 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *311:A I *C 96.4 43.66 *L 0.00422 *D sky130_osu_sc_18T_ms__nand2_l
+*I *303:B I *C 92.79 44.03 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *296:A1 I *C 94.235 44.03 *L 0.0056 *D sky130_osu_sc_18T_ms__oai21_l
+
+*CAP
+1 *320:Y 0.00031487
+2 *303:B 0.0001788
+3 *296:A1 3.387e-05
+4 *46:5 0.00022671
+5 *46:7 0.0003356
+
+*RES
+1 *320:Y *46:6 234.801
+2 *46:7 *46:6 29.9563
+3 *46:7 *303:B 186.032
+4 *303:B *296:A1 126.799
+5 *296:A1 *46:4 39.7254
+6 *46:5 *46:4 29.9563
+7 *46:5 *311:A 117.756
+*END
+
+*D_NET *47 0.00174272
+
+*CONN
+*I *319:Y O *C 78.36 48.47 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *313:A I *C 80.193 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *307:A I *C 77.71 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *313:A 4.676e-05
+2 *47:3 0.00013142
+3 *47:4 0.00040389
+4 *47:5 7.901e-05
+5 *47:7 0.00084799
+6 *47:8 0.00014807
+7 *47:9 8.558e-05
+
+*RES
+1 *47:4 *307:A 25.9511
+2 *307:A *47:9 9.24915
+3 *47:8 *47:9 1.3471
+4 *47:7 *47:8 0.557028
+5 *47:7 *47:3 16.8874
+6 *47:3 *319:Y 78.0302
+7 *47:4 *47:5 235.511
+8 *47:5 *47:6 29.9563
+9 *313:A *47:6 68.9867
+*END
+
+*D_NET *48 0.00355032
+
+*CONN
+*I *318:Y O *C 67.95 58.83 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *314:A I *C 62.927 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *306:B I *C 65.07 44.03 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *48:3 0.00029552
+2 *48:4 6.89e-05
+3 *48:5 0.00015816
+4 *48:6 0.0001538
+5 *48:7 8.967e-05
+6 *48:8 0.00063106
+7 *48:10 0.00011494
+8 *48:11 1.692e-05
+9 *48:12 9.48e-05
+10 *48:13 0.00063762
+11 *48:14 7.653e-05
+12 *48:15 0.00024698
+13 *48:16 0.0002654
+14 *48:17 0.00014864
+15 *48:18 0.00055138
+
+*RES
+1 *48:6 *48:7 1.32434
+2 *48:7 *48:10 0.557028
+3 *48:10 *48:11 0.896455
+4 *314:A *48:11 9.24915
+5 *48:11 *48:12 0.0389637
+6 *48:18 *48:12 6.51188
+7 *48:18 *48:15 5.7375
+8 *48:13 *48:15 0.539107
+9 *48:13 *48:14 5.8308
+10 *48:14 *48:16 0.557028
+11 *48:16 *48:17 1.77499
+12 *48:17 *48:4 9.82893
+13 *48:4 *318:Y 39.0151
+14 *48:6 *48:9 0.246796
+15 *48:8 *48:9 4.49678
+16 *48:5 *48:8 0.264717
+17 *48:5 *48:3 10.1277
+18 *48:3 *306:B 195.076
+*END
+
+*D_NET *49 0.00251994
+
+*CONN
+*I *317:Y O *C 78.47 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *310:A I *C 84.923 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *305:B I *C 84.43 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *49:3 6.829e-05
+2 *49:4 0.00011757
+3 *49:5 7.953e-05
+4 *49:6 0.00015041
+5 *49:7 0.00067325
+6 *49:8 0.00087088
+7 *49:9 0.00056001
+
+*RES
+1 *49:5 *49:8 9.24915
+2 *49:8 *49:4 17.8114
+3 *49:3 *49:4 78.0302
+4 *49:7 *49:3 15.1075
+5 *49:7 *49:9 4.47566
+6 *49:9 *49:6 6.51188
+7 *317:Y *49:6 9.24915
+8 *49:4 *310:A 82.0938
+9 *49:5 *305:B 78.0302
+*END
+
+*D_NET *50 0.00284635
+
+*CONN
+*I *316:Y O *C 76.27 58.83 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *309:A I *C 77.553 76.96 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *300:A0 I *C 76.82 76.96 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *300:A0 0.00010226
+2 *50:3 7.922e-05
+3 *50:4 8.407e-05
+4 *50:5 0.00104032
+5 *50:6 8.42e-05
+6 *50:7 0.00093566
+7 *50:8 0.00011997
+8 *50:5 *9:9 0.00040065
+
+*RES
+1 *50:7 *50:5 9.90937
+2 *50:8 *50:5 12.5953
+3 *50:8 *50:6 9.82893
+4 *50:4 *50:6 30.0152
+5 *50:4 *300:A0 39.7254
+6 *300:A0 *309:A 78.0302
+7 *50:7 *50:3 9.81101
+8 *50:3 *316:Y 58.5227
+*END
+
+*D_NET *51 0.00020693
+
+*CONN
+*I *315:Y O *C 58.94 45.51 *L 0 *D sky130_osu_sc_18T_ms__or2_l
+*I *295:A1 I *C 59.85 44.03 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *51:2 0.00020693
+
+*RES
+1 *51:2 *295:A1 79.2479
+2 *51:2 *315:Y 30.0152
+*END
+
+*D_NET *52 0.00253426
+
+*CONN
+*I *336:B I *C 49.14 49.95 *L 0.00561 *D sky130_osu_sc_18T_ms__or2_1
+*I *314:Y O *C 62.71 48.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *277:B I *C 47.36 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *336:B 0.00011304
+2 *52:3 0.00020381
+3 *52:4 0.00107986
+4 *52:5 3.519e-05
+5 *52:6 0.00074509
+6 *52:7 0.00029334
+7 *52:8 6.393e-05
+
+*RES
+1 *52:7 *52:8 1.79775
+2 *52:8 *52:5 9.81101
+3 *52:4 *52:5 1014.33
+4 *336:B *52:4 90.9327
+5 *52:3 *52:4 156.771
+6 *52:6 *52:3 16.9101
+7 *277:B *52:6 9.24915
+8 *314:Y *52:7 9.24915
+*END
+
+*D_NET *53 0.00289114
+
+*CONN
+*I *313:Y O *C 80.41 58.83 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *299:B I *C 82.91 70.67 *L 0.00431 *D sky130_osu_sc_18T_ms__or2_l
+*I *297:A I *C 84.38 61.79 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *287:B0 I *C 85.74 71.04 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *299:B 7.121e-05
+2 *53:4 0.00041593
+3 *53:5 0.00029011
+4 *53:6 4.674e-05
+5 *53:7 4.743e-05
+6 *53:8 5.916e-05
+7 *53:9 0.0002343
+8 *53:10 0.00042759
+9 *53:11 0.00038085
+10 *53:12 7.301e-05
+11 *53:13 0.00013739
+12 *53:14 0.00070742
+
+*RES
+1 *53:6 *53:8 30.0152
+2 *53:10 *53:8 11.5876
+3 *287:B0 *53:10 9.24915
+4 *53:10 *53:4 4.9571
+5 *53:14 *53:4 6.30904
+6 *297:A *53:14 9.24915
+7 *53:9 *297:A 156.002
+8 *53:7 *53:9 30.7255
+9 *53:5 *53:7 156.771
+10 *53:13 *53:5 9.69496
+11 *53:12 *53:13 0.557028
+12 *53:11 *53:12 2.68112
+13 *313:Y *53:11 9.24915
+14 *299:B *53:6 78.7405
+*END
+
+*D_NET *54 0.00147807
+
+*CONN
+*I *312:Y O *C 53.8 45.51 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *295:A0 I *C 59.37 43.66 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *292:B I *C 52.86 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *312:Y 0.00010134
+2 *54:3 8.466e-05
+3 *54:4 8.043e-05
+4 *54:5 0.00011018
+5 *54:7 0.00044693
+6 *54:9 4.114e-05
+7 *54:10 0.00010889
+8 *54:11 0.0005045
+
+*RES
+1 *54:7 *54:9 313.542
+2 *54:9 *54:10 30.7255
+3 *54:10 *295:A0 77.9713
+4 *54:7 *54:8 90.1046
+5 *312:Y *54:8 98.2481
+6 *54:5 *312:Y 59.233
+7 *54:5 *54:6 29.9563
+8 *54:3 *54:6 78.7405
+9 *54:11 *54:3 14.2062
+10 *54:4 *54:11 9.24915
+11 *54:4 *292:B 78.0302
+*END
+
+*D_NET *55 0.00077215
+
+*CONN
+*I *311:Y O *C 96.4 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_l
+*I *298:B I *C 97.07 49.95 *L 0.0042 *D sky130_osu_sc_18T_ms__nand2_l
+
+*CAP
+1 *311:Y 5.495e-05
+2 *298:B 4.287e-05
+3 *55:2 3.329e-05
+4 *55:3 2.42e-05
+5 *55:4 0.00049254
+6 *55:5 0.0001243
+
+*RES
+1 *55:5 *55:3 10.1456
+2 *298:B *55:3 78.0302
+3 *55:4 *55:5 0.557028
+4 *55:4 *55:2 13.7328
+5 *311:Y *55:2 78.0302
+*END
+
+*D_NET *56 0.00169071
+
+*CONN
+*I *310:Y O *C 85.14 48.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *298:A I *C 96.11 50.32 *L 0.00422 *D sky130_osu_sc_18T_ms__nand2_l
+*I *290:A I *C 94.67 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *290:A 0.00013837
+2 *56:3 9.617e-05
+3 *56:4 0.00013646
+4 *56:5 0.00020564
+5 *56:6 0.00010258
+6 *56:7 0.00101149
+
+*RES
+1 *290:A *298:A 117.045
+2 *56:4 *290:A 78.0302
+3 *56:4 *56:6 9.24915
+4 *56:7 *56:6 4.51462
+5 *56:7 *56:5 8.54811
+6 *56:5 *56:3 10.2357
+7 *56:3 *310:Y 78.0302
+*END
+
+*D_NET *57 0.00148545
+
+*CONN
+*I *309:Y O *C 77.77 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *308:A I *C 71.21 76.96 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *300:B0 I *C 75.86 76.22 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *308:A 7.202e-05
+2 *300:B0 0.00018804
+3 *57:3 3.947e-05
+4 *57:4 8.837e-05
+5 *57:5 0.00017492
+6 *57:6 6.063e-05
+7 *57:7 0.00010762
+8 *57:8 0.00069105
+9 *57:9 6.333e-05
+
+*RES
+1 *300:B0 *309:Y 136.553
+2 *57:4 *309:Y 58.5227
+3 *57:4 *57:6 9.24915
+4 *57:6 *57:7 0.161421
+5 *57:8 *57:7 6.27743
+6 *57:8 *57:9 0.284267
+7 *57:9 *57:5 4.91995
+8 *57:5 *57:3 10.4062
+9 *308:A *57:3 81.2815
+*END
+
+*D_NET *58 0.00214013
+
+*CONN
+*I *308:Y O *C 70.73 75.11 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *286:B I *C 63.48 76.59 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *279:B I *C 62.76 83.99 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *279:B 2.129e-05
+2 *58:3 4.857e-05
+3 *58:4 0.00041436
+4 *58:5 0.00040044
+5 *58:6 0.00014984
+6 *58:8 0.00015312
+7 *58:9 0.00076416
+8 *58:10 0.00018835
+
+*RES
+1 *58:4 *58:7 313.542
+2 *58:6 *58:7 90.1046
+3 *58:6 *308:Y 39.7254
+4 *58:4 *58:5 29.9563
+5 *58:9 *58:5 283.065
+6 *58:8 *58:9 1.32918
+7 *58:8 *58:11 0.0893495
+8 *58:10 *58:11 0.436864
+9 *286:B *58:10 9.24915
+10 *58:9 *58:3 16.4595
+11 *279:B *58:3 39.0151
+*END
+
+*D_NET *59 0.00092144
+
+*CONN
+*I *303:Y O *C 91.83 45.51 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *290:B I *C 93.23 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *303:Y 5.452e-05
+2 *59:2 4.933e-05
+3 *59:3 4.545e-05
+4 *59:4 0.00012266
+5 *59:5 0.00064948
+
+*RES
+1 *59:2 *59:3 30.0152
+2 *59:5 *59:3 15.5582
+3 *59:4 *59:5 9.24915
+4 *59:4 *290:B 78.0302
+5 *303:Y *59:2 78.7405
+*END
+
+*D_NET *60 0.00031012
+
+*CONN
+*I *302:Y O *C 57.73 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *292:A I *C 54.3 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *60:2 0.00031012
+
+*RES
+1 *60:2 *302:Y 235.105
+2 *60:2 *292:A 60.0894
+*END
+
+*D_NET *61 0.00383256
+
+*CONN
+*I *307:Y O *C 78.19 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *294:A I *C 53.91 56.98 *L 0.00455 *D sky130_osu_sc_18T_ms__or2_l
+*I *288:B I *C 50.55 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *275:B1 I *C 56.94 58.085 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *294:A 4.329e-05
+2 *288:B 0.00010227
+3 *61:4 0.00012544
+4 *61:5 0.00066259
+5 *61:6 0.00044166
+6 *61:8 5.564e-05
+7 *61:9 7.644e-05
+8 *61:10 7.539e-05
+9 *61:11 0.00016061
+10 *61:12 0.00012752
+11 *61:13 0.00010128
+12 *61:14 2.032e-05
+13 *61:15 0.00184011
+
+*RES
+1 *61:4 *61:8 9.24915
+2 *61:8 *61:9 0.128024
+3 *61:9 *61:5 7.0775
+4 *61:15 *61:5 11.8287
+5 *61:14 *61:15 0.128024
+6 *61:11 *61:14 9.24915
+7 *61:11 *275:B1 117.045
+8 *61:13 *61:14 0.896455
+9 *61:12 *61:13 0.557028
+10 *61:12 *61:10 9.67703
+11 *294:A *61:10 78.0302
+12 *61:6 *294:A 195.786
+13 *61:6 *61:7 29.9563
+14 *288:B *61:7 88.4943
+15 *61:4 *307:Y 117.045
+*END
+
+*D_NET *62 0.00651601
+
+*CONN
+*I *306:Y O *C 64.11 45.51 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *293:A I *C 64.683 76.96 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+*I *291:B I *C 65.95 85.1 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *281:A0 I *C 62.52 76.96 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *293:A 1.796e-05
+2 *281:A0 9.411e-05
+3 *62:4 0.00018722
+4 *62:5 0.00032358
+5 *62:6 0.00010551
+6 *62:7 9.358e-05
+7 *62:8 0.00016172
+8 *62:9 0.00144456
+9 *62:10 7.78e-05
+10 *62:11 7.851e-05
+11 *62:13 0.0005647
+12 *62:14 0.00036497
+13 *62:16 0.0001636
+14 *62:17 0.00045602
+15 *62:19 3.108e-05
+16 *62:20 9.637e-05
+17 *62:21 7.661e-05
+18 *62:22 0.00071182
+19 *62:23 7.501e-05
+20 *62:24 0.00098137
+21 *62:4 *174:12 0.00040991
+
+*RES
+1 *62:21 *62:5 3.58241
+2 *62:13 *62:5 5.85356
+3 *62:13 *62:18 0.539107
+4 *62:17 *62:18 3.14485
+5 *62:11 *62:17 0.557028
+6 *62:9 *62:11 13.0411
+7 *62:9 *62:15 0.539107
+8 *62:14 *62:15 3.14485
+9 *62:7 *62:14 0.557028
+10 *62:4 *62:7 0.878534
+11 *306:Y *62:4 9.24915
+12 *62:21 *62:22 0.557028
+13 *62:22 *62:23 8.55743
+14 *293:A *62:23 9.24915
+15 *293:A *62:16 23.4691
+16 *62:10 *62:16 40.4357
+17 *62:10 *62:12 29.9563
+18 *62:8 *62:12 78.6816
+19 *62:6 *62:8 60.7996
+20 *281:A0 *62:6 78.7405
+21 *62:16 *62:19 116.986
+22 *62:24 *62:19 17.8114
+23 *62:24 *62:20 70.1077
+24 *291:B *62:20 4.71647
+*END
+
+*D_NET *63 0.00229716
+
+*CONN
+*I *305:Y O *C 85.39 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *287:A0 I *C 84.78 70.3 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *282:A I *C 81.67 63.64 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *282:A 7.63e-06
+2 *63:3 0.00011498
+3 *63:4 0.00031171
+4 *63:5 5.348e-05
+5 *63:6 0.0002384
+6 *63:7 0.00023156
+7 *63:8 8.198e-05
+8 *63:10 0.00058312
+9 *63:11 0.00010048
+10 *63:12 7.073e-05
+11 *63:13 0.00021495
+12 *63:14 0.00028814
+
+*RES
+1 *63:7 *63:9 0.539107
+2 *63:9 *63:4 3.14968
+3 *63:14 *63:4 2.69904
+4 *63:12 *63:14 0.557028
+5 *63:11 *63:12 0.878534
+6 *63:10 *63:11 4.95227
+7 *63:10 *63:13 0.539107
+8 *63:13 *63:8 10.5962
+9 *63:8 *305:Y 58.5227
+10 *63:11 *63:6 126.236
+11 *63:5 *63:6 30.7255
+12 *282:A *63:5 20.2179
+13 *63:7 *63:3 10.1456
+14 *63:3 *287:A0 45.7206
+*END
+
+*D_NET *64 0.00091535
+
+*CONN
+*I *337:A I *C 47.963 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *304:Y O *C 48.235 44.4 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *289:A I *C 45.48 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *289:A 7.99e-05
+2 *64:3 0.00011333
+3 *64:4 0.00010242
+4 *64:5 0.0006197
+
+*RES
+1 *64:3 *304:Y 78.0302
+2 *64:5 *64:3 15.5582
+3 *64:4 *64:5 9.24915
+4 *289:A *64:4 58.5227
+5 *64:4 *337:A 43.0787
+*END
+
+*D_NET *65 0.00145388
+
+*CONN
+*I *301:Y O *C 91 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *284:A I *C 93.73 58.83 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *301:Y 0.00021036
+2 *65:2 2.719e-05
+3 *65:3 0.0009979
+4 *65:4 0.00011458
+5 *65:5 0.00010385
+
+*RES
+1 *301:Y *65:2 164.595
+2 *65:3 *65:2 20.0419
+3 *65:3 *65:4 0.557028
+4 *65:4 *65:5 0.896455
+5 *284:A *65:5 9.24915
+*END
+
+*D_NET *66 0.00019626
+
+*CONN
+*I *299:Y O *C 84.35 72.15 *L 0 *D sky130_osu_sc_18T_ms__or2_l
+*I *287:A1 I *C 85.26 70.67 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *299:Y 0.00012367
+2 *287:A1 7.259e-05
+
+*RES
+1 *299:Y *66:2 78.7405
+2 *287:A1 *66:2 22.6999
+*END
+
+*D_NET *67 0.0010706
+
+*CONN
+*I *298:Y O *C 96.11 48.47 *L 0 *D sky130_osu_sc_18T_ms__nand2_l
+*I *296:B0 I *C 94.54 44.4 *L 0.00468 *D sky130_osu_sc_18T_ms__oai21_l
+
+*CAP
+1 *67:2 8.487e-05
+2 *67:3 0.00018849
+3 *67:4 0.00036632
+4 *67:5 0.00043092
+
+*RES
+1 *67:5 *67:3 11.9482
+2 *67:3 *298:Y 117.045
+3 *67:4 *67:5 1.14165
+4 *67:4 *67:2 11.4796
+5 *67:2 *296:B0 39.3703
+*END
+
+*D_NET *68 0.00028588
+
+*CONN
+*I *297:Y O *C 85.085 62.9 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *282:B I *C 83.11 63.27 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *282:B 8.284e-05
+2 *68:2 0.00015726
+3 *68:3 4.578e-05
+
+*RES
+1 *282:B *68:3 78.7405
+2 *68:3 *68:2 30.7255
+3 *68:2 *297:Y 116.986
+*END
+
+*D_NET *69 0.00213859
+
+*CONN
+*I *335:B0 I *C 92.34 57.72 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *296:Y O *C 95.02 45.51 *L 0 *D sky130_osu_sc_18T_ms__oai21_l
+*I *284:B I *C 95.65 58.46 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *335:B0 0.00015183
+2 *296:Y 2.613e-05
+3 *69:3 3.766e-05
+4 *69:4 0.00024045
+5 *69:5 3.771e-05
+6 *69:6 4.405e-05
+7 *69:7 0.00094835
+8 *69:8 0.00017614
+9 *69:9 0.00047627
+
+*RES
+1 *69:4 *284:B 58.4637
+2 *69:8 *69:4 70.1077
+3 *69:7 *69:8 10.8107
+4 *69:7 *69:9 0.539107
+5 *69:9 *69:6 12.8495
+6 *69:5 *69:6 30.0152
+7 *296:Y *69:5 39.7254
+8 *69:8 *69:3 10.4184
+9 *335:B0 *69:3 117.045
+*END
+
+*D_NET *70 0.00277
+
+*CONN
+*I *295:Y O *C 60.33 45.51 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *285:B I *C 64.14 49.95 *L 0.00442 *D sky130_osu_sc_18T_ms__and2_l
+*I *283:S0 I *C 64.83 56.98 *L 0.0111 *D sky130_osu_sc_18T_ms__mux2_1
+*I *271:B1 I *C 65.43 58.085 *L 0.00566 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *295:Y 0.00016138
+2 *285:B 4.495e-05
+3 *70:4 4.515e-05
+4 *70:5 0.00047456
+5 *70:6 0.00011249
+6 *70:7 8.525e-05
+7 *70:8 5e-05
+8 *70:9 4.613e-05
+9 *70:10 0.00048314
+10 *70:11 0.00025952
+11 *70:12 0.00029543
+12 *70:13 0.000712
+
+*RES
+1 *295:Y *70:4 111.762
+2 *70:10 *70:4 12.4037
+3 *70:10 *70:5 127.005
+4 *70:5 *70:6 151.022
+5 *70:6 *285:B 58.4637
+6 *285:B *70:8 59.233
+7 *70:8 *70:9 30.0152
+8 *70:13 *70:9 15.5533
+9 *70:11 *70:13 0.539107
+10 *70:11 *70:12 1.79775
+11 *283:S0 *70:12 9.24915
+12 *70:12 *70:7 10.6011
+13 *70:7 *271:B1 78.0302
+*END
+
+*D_NET *71 0.00030677
+
+*CONN
+*I *294:Y O *C 54.87 58.83 *L 0 *D sky130_osu_sc_18T_ms__or2_l
+*I *275:A1 I *C 55.78 57.35 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *71:2 4.902e-05
+2 *71:3 0.00025775
+
+*RES
+1 *71:3 *275:A1 156.771
+2 *71:3 *71:2 30.7255
+3 *71:2 *294:Y 58.4637
+*END
+
+*D_NET *72 0.000399
+
+*CONN
+*I *293:Y O *C 64.9 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *286:A I *C 63.697 76.96 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+
+*CAP
+1 *72:2 0.00011477
+2 *72:3 0.00017518
+3 *72:4 0.00010905
+
+*RES
+1 *286:A *72:4 9.24915
+2 *72:3 *72:4 0.957353
+3 *72:3 *72:2 9.81101
+4 *72:2 *293:Y 78.0302
+*END
+
+*D_NET *73 0.00329303
+
+*CONN
+*I *292:Y O *C 53.82 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *270:A I *C 48.843 70.3 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *267:B I *C 47.8 70.67 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *254:A0 I *C 48.48 63.64 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *73:4 0.00032527
+2 *73:5 0.00010363
+3 *73:6 0.00014596
+4 *73:7 4.766e-05
+5 *73:8 9.057e-05
+6 *73:9 0.00040072
+7 *73:11 0.00163917
+8 *73:12 0.00054005
+
+*RES
+1 *73:7 *73:9 0.04453
+2 *73:12 *73:9 6.51188
+3 *73:11 *73:12 4.47566
+4 *73:11 *73:5 27.0314
+5 *73:5 *292:Y 78.1317
+6 *73:9 *73:4 3.84876
+7 *73:8 *73:4 4.05581
+8 *270:A *73:8 9.24915
+9 *73:8 *73:10 0.445809
+10 *73:6 *73:10 1.14649
+11 *267:B *73:6 9.24915
+12 *254:A0 *73:7 9.24915
+*END
+
+*D_NET *74 0.00034372
+
+*CONN
+*I *291:Y O *C 64.735 84.36 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *279:A I *C 61.32 83.62 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *279:A 0.00034372
+
+*RES
+1 *279:A *291:Y 214.583
+*END
+
+*D_NET *75 0.00333274
+
+*CONN
+*I *290:Y O *C 94.19 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *280:A I *C 94.167 63.64 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+*I *278:B I *C 92.68 62.16 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *272:A0 I *C 96.33 63.64 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *290:Y 0.00013712
+2 *280:A 5.89e-05
+3 *272:A0 5.495e-05
+4 *75:4 0.00011057
+5 *75:5 0.00011442
+6 *75:6 0.00012261
+7 *75:7 0.00019221
+8 *75:8 0.00025359
+9 *75:9 3.003e-05
+10 *75:10 0.0001167
+11 *75:12 0.00027241
+12 *75:13 0.00085047
+13 *75:15 0.00016247
+14 *75:16 0.00021288
+15 *75:18 0.00064341
+
+*RES
+1 *75:12 *75:14 1.14649
+2 *75:13 *75:14 7.20066
+3 *75:13 *75:17 0.539107
+4 *75:16 *75:17 1.79291
+5 *75:16 *75:19 0.539107
+6 *75:18 *75:19 7.20066
+7 *75:15 *75:18 0.557028
+8 *75:15 *75:9 10.1277
+9 *290:Y *75:9 117.045
+10 *280:A *75:12 9.24915
+11 *75:7 *280:A 116.986
+12 *75:6 *75:7 90.8738
+13 *75:5 *75:6 78.6816
+14 *75:4 *75:5 30.7255
+15 *75:4 *278:B 39.7254
+16 *75:12 *75:8 10.1504
+17 *75:8 *75:11 234.801
+18 *75:10 *75:11 60.0304
+19 *272:A0 *75:10 39.7254
+*END
+
+*D_NET *76 0.00087981
+
+*CONN
+*I *289:Y O *C 45.96 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *277:A I *C 45.92 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *76:2 8.829e-05
+2 *76:3 0.00079152
+
+*RES
+1 *76:3 *76:2 9.01291
+2 *277:A *76:2 9.24915
+3 *289:Y *76:3 9.24915
+*END
+
+*D_NET *77 0.0010455
+
+*CONN
+*I *288:Y O *C 49.59 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *276:A I *C 46.25 63.64 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *276:A 0.00010631
+2 *77:2 9.872e-05
+3 *77:3 0.0001126
+4 *77:4 0.00072787
+
+*RES
+1 *77:4 *77:3 39.2643
+2 *276:A *77:3 78.7405
+3 *77:4 *77:2 16.0088
+4 *77:2 *288:Y 78.1317
+*END
+
+*D_NET *78 0.00252719
+
+*CONN
+*I *287:Y O *C 85.74 72.15 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *274:A I *C 95.153 63.64 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+*I *266:B I *C 87.4 63.27 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *287:Y 8.73e-05
+2 *274:A 4.201e-05
+3 *78:3 5.774e-05
+4 *78:4 0.00055705
+5 *78:5 6.315e-05
+6 *78:6 0.0001349
+7 *78:7 0.00102807
+8 *78:8 7.236e-05
+9 *78:10 0.00022793
+10 *78:11 0.00025668
+
+*RES
+1 *78:11 *78:4 2.69904
+2 *78:6 *78:4 15.1075
+3 *287:Y *78:6 68.2765
+4 *78:10 *78:11 0.557028
+5 *78:10 *78:3 11.029
+6 *78:3 *78:5 39.7254
+7 *78:5 *78:7 61.5301
+8 *78:7 *78:9 702.923
+9 *78:8 *78:9 29.9563
+10 *274:A *78:8 39.7254
+11 *78:5 *266:B 39.7254
+*END
+
+*D_NET *79 0.00017131
+
+*CONN
+*I *286:Y O *C 63.48 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *281:B0 I *C 61.56 76.22 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *281:B0 0.00017131
+
+*RES
+1 *281:B0 *286:Y 117.045
+*END
+
+*D_NET *80 0.00137359
+
+*CONN
+*I *285:Y O *C 65.1 48.47 *L 0 *D sky130_osu_sc_18T_ms__and2_l
+*I *271:A1 I *C 66.485 57.35 *L 0.00564 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *285:Y 3.134e-05
+2 *80:2 2.923e-05
+3 *80:3 0.0001044
+4 *80:4 0.00021556
+5 *80:5 0.00024839
+6 *80:6 0.00074467
+
+*RES
+1 *80:6 *80:7 7.20066
+2 *80:5 *80:7 0.539107
+3 *80:5 *80:3 10.5962
+4 *80:3 *271:A1 58.6241
+5 *80:4 *80:6 0.557028
+6 *80:4 *80:2 10.1277
+7 *285:Y *80:2 39.0151
+*END
+
+*D_NET *81 0.00309445
+
+*CONN
+*I *284:Y O *C 94.435 57.72 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *263:A I *C 93.43 70.3 *L 0.00432 *D sky130_osu_sc_18T_ms__and2_l
+*I *261:A I *C 94.83 75.11 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *248:B0 I *C 94.87 71.04 *L 0.00578 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *248:B0 3.465e-05
+2 *81:4 0.00038017
+3 *81:5 0.0007114
+4 *81:6 0.00011446
+5 *81:7 0.00055772
+6 *81:9 0.00010141
+7 *81:11 0.00013315
+8 *81:12 0.00091312
+9 *81:13 0.00014837
+
+*RES
+1 *81:6 *261:A 117.045
+2 *81:12 *81:6 15.0828
+3 *81:11 *81:12 0.561864
+4 *263:A *81:11 9.24915
+5 *81:12 *81:4 4.03305
+6 *81:5 *81:4 6.3042
+7 *81:5 *81:8 0.539107
+8 *81:7 *81:8 4.05097
+9 *284:Y *81:7 9.24915
+10 *81:12 *81:13 1.70835
+11 *81:13 *81:9 9.69496
+12 *81:9 *81:10 30.0152
+13 *248:B0 *81:10 39.7254
+*END
+
+*D_NET *82 0.00058014
+
+*CONN
+*I *283:Y O *C 63.39 58.83 *L 0 *D sky130_osu_sc_18T_ms__mux2_1
+*I *273:A I *C 60.33 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *273:A 8.863e-05
+2 *82:2 3.342e-05
+3 *82:3 0.00017253
+4 *82:4 0.00028556
+
+*RES
+1 *82:3 *82:4 9.24915
+2 *82:4 *82:2 10.6011
+3 *273:A *82:2 78.0302
+4 *82:3 *283:Y 97.5378
+*END
+
+*D_NET *83 0.00350515
+
+*CONN
+*I *282:Y O *C 82.15 61.79 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *273:B I *C 61.77 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *271:A0 I *C 66.965 56.98 *L 0.00538 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *83:3 9.562e-05
+2 *83:4 0.00105748
+3 *83:5 0.00022196
+4 *83:6 0.0004629
+5 *83:7 9.868e-05
+6 *83:8 0.00010837
+7 *83:9 6.129e-05
+8 *83:10 0.00066739
+9 *83:11 0.00073146
+
+*RES
+1 *83:11 *83:7 6.96438
+2 *83:7 *83:8 0.127608
+3 *273:B *83:8 9.24915
+4 *83:10 *83:11 4.47566
+5 *83:9 *83:10 0.066795
+6 *271:A0 *83:9 9.24915
+7 *83:10 *83:6 14.0601
+8 *83:6 *83:4 331.628
+9 *83:3 *83:4 761.505
+10 *83:3 *83:5 60.7996
+11 *83:5 *282:Y 117.291
+*END
+
+*D_NET *84 0.00355051
+
+*CONN
+*I *281:Y O *C 61.56 75.11 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *265:B I *C 49.5 83.99 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *258:A I *C 49.9 90.28 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *281:Y 0.00013174
+2 *265:B 4.964e-05
+3 *258:A 0.00010412
+4 *84:3 0.00023952
+5 *84:5 4.291e-05
+6 *84:6 0.00116152
+7 *84:7 4.376e-05
+8 *84:8 0.00049561
+9 *84:9 0.00093623
+10 *84:11 0.00034546
+
+*RES
+1 *258:A *84:5 78.0302
+2 *84:8 *84:5 13.7508
+3 *84:8 *84:10 0.539107
+4 *84:9 *84:10 3.60033
+5 *84:9 *84:3 127.005
+6 *84:3 *84:4 29.9563
+7 *265:B *84:4 39.7254
+8 *84:9 *84:6 16.4595
+9 *84:11 *84:6 906.597
+10 *84:11 *84:7 11.5024
+11 *281:Y *84:7 117.045
+*END
+
+*D_NET *85 0.00033873
+
+*CONN
+*I *280:Y O *C 93.95 61.79 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *274:B I *C 95.37 63.27 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+
+*CAP
+1 *280:Y 9.261e-05
+2 *85:2 0.00010476
+3 *85:3 0.00014136
+
+*RES
+1 *280:Y *85:3 78.7405
+2 *85:3 *85:2 90.8738
+3 *85:2 *274:B 58.4637
+*END
+
+*D_NET *86 0.00032305
+
+*CONN
+*I *278:Y O *C 91.465 62.9 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *266:A I *C 88.84 63.64 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *266:A 0.00032305
+
+*RES
+1 *266:A *278:Y 195.076
+*END
+
+*D_NET *87 0.0041439
+
+*CONN
+*I *277:Y O *C 46.4 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *269:A I *C 46.427 83.62 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+*I *268:B I *C 45.27 88.8 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *260:A0 I *C 47.16 83.62 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *269:A 6.542e-05
+2 *87:4 0.0006684
+3 *87:5 0.00103069
+4 *87:6 8.574e-05
+5 *87:7 5.497e-05
+6 *87:8 0.0005513
+7 *87:9 6.538e-05
+8 *87:10 0.00050122
+9 *87:11 0.0001222
+10 *87:13 9.573e-05
+11 *87:14 9.798e-05
+12 *87:15 0.00037713
+13 *87:16 5.802e-05
+14 *87:18 0.00036972
+
+*RES
+1 *268:B *87:14 9.24915
+2 *87:13 *87:14 0.896455
+3 *87:9 *87:13 0.557028
+4 *87:8 *87:9 4.92951
+5 *87:8 *87:12 0.539107
+6 *87:11 *87:12 0.896455
+7 *87:10 *87:11 4.95227
+8 *87:10 *87:19 1.12373
+9 *87:18 *87:19 3.59549
+10 *87:16 *87:18 0.557028
+11 *87:15 *87:16 3.57757
+12 *87:15 *87:17 0.539107
+13 *87:17 *87:4 7.65614
+14 *87:5 *87:4 9.91421
+15 *277:Y *87:5 9.24915
+16 *87:11 *87:6 48.9746
+17 *87:6 *87:7 30.7255
+18 *87:7 *269:A 38.9562
+19 *269:A *260:A0 58.5227
+*END
+
+*D_NET *88 0.00192479
+
+*CONN
+*I *276:Y O *C 46.73 61.79 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *270:B I *C 49.06 70.67 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *267:A I *C 46.36 70.3 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *254:A1 I *C 48.96 63.27 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *276:Y 6.389e-05
+2 *267:A 0.00014163
+3 *254:A1 6.3e-05
+4 *88:4 0.00034558
+5 *88:5 3.628e-05
+6 *88:6 6.47e-05
+7 *88:7 9.877e-05
+8 *88:8 0.00018467
+9 *88:9 5.882e-05
+10 *88:10 0.00024798
+11 *88:11 0.00061947
+
+*RES
+1 *254:A1 *88:8 39.7254
+2 *88:8 *88:10 90.1046
+3 *88:11 *88:10 205.035
+4 *88:11 *88:5 11.5024
+5 *276:Y *88:5 58.5227
+6 *88:11 *88:4 3.15452
+7 *88:9 *88:4 4.05581
+8 *267:A *88:9 9.24915
+9 *267:A *88:6 78.7405
+10 *88:6 *88:7 30.7255
+11 *88:7 *270:B 77.9713
+*END
+
+*D_NET *89 0.00249099
+
+*CONN
+*I *275:Y O *C 56.26 58.83 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *264:B I *C 63.59 63.27 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+*I *262:B I *C 59.24 62.16 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *252:B1 I *C 66.69 62.535 *L 0.00566 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *275:Y 0.00024535
+2 *252:B1 1.72e-06
+3 *89:4 2.522e-05
+4 *89:5 7.765e-05
+5 *89:6 0.00017201
+6 *89:7 0.00013897
+7 *89:8 0.00041321
+8 *89:9 7.189e-05
+9 *89:10 0.00026091
+10 *89:11 5.141e-05
+11 *89:12 9.302e-05
+12 *89:13 0.00093963
+
+*RES
+1 *275:Y *89:4 209.3
+2 *89:8 *89:4 13.0857
+3 *89:13 *89:8 6.05939
+4 *89:10 *89:13 4.47566
+5 *89:10 *89:5 10.3697
+6 *89:5 *89:6 30.7844
+7 *89:6 *264:B 75.9392
+8 *89:13 *89:12 6.51188
+9 *89:11 *89:12 0.105759
+10 *89:11 *89:7 69.5246
+11 *252:B1 *89:7 9.24485
+12 *89:8 *89:9 0.0918777
+13 *262:B *89:9 9.24915
+*END
+
+*D_NET *90 0.00012007
+
+*CONN
+*I *274:Y O *C 95.37 61.79 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *272:B0 I *C 97.29 62.9 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *274:Y 0.00012007
+
+*RES
+1 *274:Y *272:B0 117.045
+*END
+
+*D_NET *91 0.0017299
+
+*CONN
+*I *273:Y O *C 60.81 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *264:A I *C 63.11 63.64 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *262:A I *C 61.16 61.79 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *252:B0 I *C 65.94 62.9 *L 0.00578 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *273:Y 4.308e-05
+2 *264:A 0.00016361
+3 *91:4 5.401e-05
+4 *91:5 0.00067824
+5 *91:7 0.00010719
+6 *91:9 0.00015826
+7 *91:11 0.00016458
+8 *91:12 0.00036093
+
+*RES
+1 *264:A *91:8 117.756
+2 *91:7 *91:8 29.9563
+3 *91:7 *91:10 40.4357
+4 *91:9 *91:10 29.9563
+5 *91:9 *252:B0 55.5753
+6 *91:11 *252:B0 112.516
+7 *91:5 *91:11 468.892
+8 *91:5 *91:12 9.24915
+9 *91:12 *91:4 11.953
+10 *91:4 *91:6 39.7254
+11 *273:Y *91:6 22.6999
+12 *91:5 *262:A 24.9938
+*END
+
+*D_NET *92 0.00258572
+
+*CONN
+*I *272:Y O *C 97.29 61.79 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *263:B I *C 92.95 70.67 *L 0.00442 *D sky130_osu_sc_18T_ms__and2_l
+*I *261:B I *C 96.75 75.48 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *248:B1 I *C 95.62 71.405 *L 0.00566 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *263:B 0.00011342
+2 *92:4 0.00031457
+3 *92:5 8.456e-05
+4 *92:6 0.00051331
+5 *92:7 0.00023957
+6 *92:8 6.313e-05
+7 *92:9 0.00014379
+8 *92:10 0.0001843
+9 *92:11 6.032e-05
+10 *92:12 7.147e-05
+11 *92:13 5.056e-05
+12 *92:15 0.00037439
+13 *92:16 0.00037233
+
+*RES
+1 *92:15 *92:14 2.69904
+2 *92:16 *92:14 1.70835
+3 *92:16 *92:4 2.69904
+4 *92:8 *92:4 3.13176
+5 *92:8 *92:7 0.557028
+6 *92:7 *92:6 2.22563
+7 *92:9 *92:6 1.14649
+8 *248:B1 *92:9 9.24915
+9 *92:10 *248:B1 97.4788
+10 *92:11 *92:10 30.7255
+11 *92:12 *92:11 39.6665
+12 *92:13 *92:12 30.7255
+13 *263:B *92:13 78.7405
+14 *92:6 *92:5 4.95227
+15 *261:B *92:5 9.24915
+16 *272:Y *92:15 9.24915
+*END
+
+*D_NET *93 0.00450724
+
+*CONN
+*I *271:Y O *C 65.7 58.83 *L 0 *D sky130_osu_sc_18T_ms__oai22_l
+*I *259:A I *C 77.01 63.64 *L 0.00582 *D sky130_osu_sc_18T_ms__or2_1
+*I *257:B I *C 68.04 70.67 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *250:B1 I *C 80.04 62.535 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *271:Y 0.00018527
+2 *257:B 0.00018157
+3 *93:4 0.00018237
+4 *93:5 6.186e-05
+5 *93:6 0.00081477
+6 *93:7 9.039e-05
+7 *93:8 0.00018512
+8 *93:9 5.557e-05
+9 *93:10 0.00035139
+10 *93:11 0.00032533
+11 *93:12 3.025e-05
+12 *93:13 0.00017835
+13 *93:14 0.00092609
+14 *93:15 0.00049032
+15 *93:16 2.349e-05
+16 *93:17 0.0001924
+17 *93:19 0.0002327
+
+*RES
+1 *93:19 *93:15 12.8543
+2 *93:15 *93:6 604.734
+3 *93:14 *93:6 58.5227
+4 *93:11 *93:14 234.032
+5 *93:7 *93:11 60.7996
+6 *271:Y *93:7 137.263
+7 *93:14 *93:5 18.2393
+8 *93:16 *93:5 0.287474
+9 *93:16 *93:10 0.269553
+10 *93:18 *93:10 3.59549
+11 *93:13 *93:18 0.539107
+12 *93:13 *93:9 10.1456
+13 *257:B *93:9 156.06
+14 *93:17 *93:19 9.24915
+15 *93:17 *250:B1 113.286
+16 *93:19 *93:12 11.003
+17 *93:4 *93:12 78.7405
+18 *93:4 *93:8 90.8738
+19 *93:8 *259:A 78.4786
+*END
+
+*D_NET *94 0.00086249
+
+*CONN
+*I *270:Y O *C 49.06 72.15 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *256:B I *C 48.95 76.59 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+
+*CAP
+1 *270:Y 3.054e-05
+2 *256:B 0.00010423
+3 *94:2 2.817e-05
+4 *94:3 4.043e-05
+5 *94:4 0.00019967
+6 *94:5 0.00045945
+
+*RES
+1 *270:Y *94:2 39.0151
+2 *94:4 *94:2 10.5783
+3 *94:4 *94:5 0.557028
+4 *94:5 *94:3 13.3001
+5 *256:B *94:3 78.0302
+*END
+
+*D_NET *95 0.00060261
+
+*CONN
+*I *269:Y O *C 46.21 85.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *265:A I *C 49.283 83.62 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+
+*CAP
+1 *269:Y 6.587e-05
+2 *95:2 4.84e-05
+3 *95:3 0.00025811
+4 *95:4 0.00023023
+
+*RES
+1 *95:3 *265:A 78.0302
+2 *95:4 *95:3 10.1456
+3 *95:4 *95:2 10.9803
+4 *269:Y *95:2 58.5227
+*END
+
+*D_NET *96 0.00018186
+
+*CONN
+*I *268:Y O *C 46.485 89.54 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *258:B I *C 48.46 89.91 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *268:Y 0.00018186
+
+*RES
+1 *268:Y *258:B 156.06
+*END
+
+*D_NET *97 0.00063957
+
+*CONN
+*I *267:Y O *C 46.84 72.15 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *255:A I *C 45.77 75.11 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *267:Y 6.715e-05
+2 *255:A 5.517e-05
+3 *97:2 2.362e-05
+4 *97:3 0.0001196
+5 *97:4 0.00037403
+
+*RES
+1 *255:A *97:3 39.7254
+2 *97:4 *97:3 39.2643
+3 *97:4 *97:2 12.4037
+4 *267:Y *97:2 78.0302
+*END
+
+*D_NET *98 0.00375359
+
+*CONN
+*I *266:Y O *C 88.36 61.79 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *259:B I *C 76.53 63.27 *L 0.00561 *D sky130_osu_sc_18T_ms__or2_1
+*I *257:A I *C 69.48 70.3 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *250:B0 I *C 79.36 62.9 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *98:4 9.85e-05
+2 *98:5 4.287e-05
+3 *98:6 0.00073596
+4 *98:7 0.00051552
+5 *98:8 6.314e-05
+6 *98:9 9.508e-05
+7 *98:10 0.00041768
+8 *98:11 7.362e-05
+9 *98:12 0.00012311
+10 *98:13 0.0003101
+11 *98:15 6.881e-05
+12 *98:16 8.013e-05
+13 *98:18 7.732e-05
+14 *98:19 0.00105175
+
+*RES
+1 *98:15 *98:16 0.158234
+2 *250:B0 *98:16 9.24915
+3 *98:16 *98:17 0.445809
+4 *98:10 *98:17 3.48497
+5 *259:B *98:10 9.24915
+6 *98:10 *98:11 0.878534
+7 *98:11 *98:13 0.557028
+8 *98:13 *98:14 3.14485
+9 *98:12 *98:14 0.539107
+10 *98:12 *98:5 0.445809
+11 *98:4 *98:5 0.608981
+12 *98:6 *98:4 7.0775
+13 *98:7 *98:6 5.26752
+14 *98:7 *98:9 3.44683
+15 *257:A *98:9 9.24915
+16 *98:19 *98:15 8.54811
+17 *98:19 *98:18 4.50905
+18 *98:8 *98:18 9.24915
+19 *98:8 *266:Y 39.3195
+*END
+
+*D_NET *99 0.00018731
+
+*CONN
+*I *265:Y O *C 49.5 85.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *260:B0 I *C 48.12 84.36 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *260:B0 0.00018731
+
+*RES
+1 *260:B0 *265:Y 132.489
+*END
+
+*D_NET *100 0.0003431
+
+*CONN
+*I *264:Y O *C 64.55 61.79 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *252:A0 I *C 65.155 63.64 *L 0.00538 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *100:2 0.00010658
+2 *100:3 0.0001186
+3 *100:4 0.00011792
+
+*RES
+1 *100:4 *100:3 0.561864
+2 *100:3 *100:2 0.896455
+3 *252:A0 *100:2 9.24915
+4 *264:Y *100:4 9.24915
+*END
+
+*D_NET *101 0.00056723
+
+*CONN
+*I *263:Y O *C 91.99 72.15 *L 0 *D sky130_osu_sc_18T_ms__and2_l
+*I *248:A0 I *C 94.085 70.3 *L 0.00538 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *248:A0 5.515e-05
+2 *101:3 8.643e-05
+3 *101:4 2.004e-05
+4 *101:5 0.00040561
+
+*RES
+1 *101:4 *263:Y 19.4486
+2 *101:5 *101:4 90.8738
+3 *101:5 *101:3 235.511
+4 *101:3 *101:2 29.9563
+5 *248:A0 *101:2 39.7254
+*END
+
+*D_NET *102 0.00157476
+
+*CONN
+*I *262:Y O *C 60.455 62.9 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *253:B I *C 62.43 70.67 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *102:2 9.227e-05
+2 *102:3 0.0003478
+3 *102:4 0.00028414
+4 *102:5 8.239e-05
+5 *102:6 4.07e-05
+6 *102:7 0.00015977
+7 *102:8 0.00034584
+8 *102:9 0.00022185
+
+*RES
+1 *102:6 *253:B 38.9562
+2 *102:5 *102:6 60.7996
+3 *102:3 *102:5 234.801
+4 *102:9 *102:3 10.1456
+5 *102:9 *102:10 0.539107
+6 *102:10 *102:4 2.69904
+7 *102:8 *102:4 3.14968
+8 *102:7 *102:8 0.557028
+9 *102:7 *102:2 10.1277
+10 *102:2 *262:Y 97.5378
+*END
+
+*D_NET *103 0.00022035
+
+*CONN
+*I *261:Y O *C 95.535 76.22 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *249:B I *C 93.56 76.59 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *249:B 0.00022035
+
+*RES
+1 *249:B *261:Y 175.568
+*END
+
+*D_NET *104 0.001551
+
+*CONN
+*I *260:Y O *C 48.12 85.47 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *256:A I *C 48.733 76.96 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *255:B I *C 47.69 75.48 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *256:A 1.956e-05
+2 *255:B 5.313e-05
+3 *104:3 0.00013632
+4 *104:4 5.015e-05
+5 *104:5 5.108e-05
+6 *104:6 2.883e-05
+7 *104:7 0.00021622
+8 *104:8 0.00013617
+9 *104:9 0.00085954
+
+*RES
+1 *104:3 *104:4 120.948
+2 *104:4 *256:A 38.9562
+3 *256:A *104:5 23.4691
+4 *104:5 *104:6 38.9562
+5 *104:9 *104:6 18.2572
+6 *104:7 *104:9 1.12373
+7 *104:7 *104:8 0.896455
+8 *260:Y *104:8 9.24915
+9 *255:B *104:3 49.4792
+*END
+
+*D_NET *105 0.00018067
+
+*CONN
+*I *259:Y O *C 77.97 61.79 *L 0 *D sky130_osu_sc_18T_ms__or2_1
+*I *250:A0 I *C 78.4 63.64 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *259:Y 6.747e-05
+2 *105:2 0.0001132
+
+*RES
+1 *259:Y *105:2 59.233
+2 *105:2 *250:A0 60.0894
+*END
+
+*D_NET *106 0.00028438
+
+*CONN
+*I *257:Y O *C 69 72.15 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *251:B I *C 72 70.67 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *257:Y 0.00013601
+2 *106:2 1.437e-05
+3 *106:4 0.000134
+
+*RES
+1 *106:4 *251:B 78.7405
+2 *106:4 *106:3 29.9563
+3 *106:3 *106:2 20.2179
+4 *257:Y *106:2 136.553
+*END
+
+*D_NET *107 0.00208039
+
+*CONN
+*I *256:Y O *C 48.95 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *254:B0 I *C 49.44 62.9 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *256:Y 0.00021574
+2 *254:B0 0.00026439
+3 *107:2 0.00092213
+4 *107:3 0.00060133
+5 *107:4 7.68e-05
+
+*RES
+1 *256:Y *107:4 195.076
+2 *107:4 *107:2 20.5153
+3 *107:3 *107:2 14.2062
+4 *254:B0 *107:3 195.076
+*END
+
+*D_NET *108 0.00457768
+
+*CONN
+*I *254:Y O *C 49.44 61.79 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *253:A I *C 63.87 70.3 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *252:A1 I *C 65.635 63.27 *L 0.00564 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *254:Y 4.11e-05
+2 *253:A 0.00013218
+3 *108:3 0.0002101
+4 *108:4 5.702e-05
+5 *108:5 2.344e-05
+6 *108:6 0.00021304
+7 *108:7 0.00011043
+8 *108:8 0.00027928
+9 *108:9 8.407e-05
+10 *108:10 8.148e-05
+11 *108:12 0.00012933
+12 *108:13 0.000298
+13 *108:14 0.00035226
+14 *108:15 0.0005039
+15 *108:16 0.00125018
+16 *108:17 0.00081187
+
+*RES
+1 *108:15 *108:6 4.52473
+2 *108:12 *108:6 2.83785
+3 *108:16 *108:12 8.76616
+4 *108:16 *108:17 0.284267
+5 *108:17 *108:9 7.63492
+6 *108:7 *108:9 1.32274
+7 *108:7 *108:11 0.539107
+8 *108:11 *108:3 2.24839
+9 *108:14 *108:3 3.14968
+10 *108:10 *108:14 0.557028
+11 *108:8 *108:10 1.77499
+12 *108:8 *108:13 0.539107
+13 *108:13 *108:4 10.5962
+14 *254:Y *108:4 39.0151
+15 *108:12 *108:5 10.4671
+16 *253:A *108:5 117.045
+17 *252:A1 *108:15 9.24915
+*END
+
+*D_NET *109 0.00290376
+
+*CONN
+*I *252:Y O *C 66.42 61.79 *L 0 *D sky130_osu_sc_18T_ms__oai22_l
+*I *251:A I *C 73.44 70.3 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *250:A1 I *C 78.88 63.27 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *250:A1 4.901e-05
+2 *109:3 0.00028935
+3 *109:4 0.00026019
+4 *109:5 0.00081205
+5 *109:6 0.00016109
+6 *109:7 0.00012233
+7 *109:8 5.023e-05
+8 *109:9 0.00021762
+9 *109:11 0.00011297
+10 *109:12 0.00011236
+11 *109:13 9.802e-05
+12 *109:14 0.00061854
+
+*RES
+1 *109:11 *109:6 58.4637
+2 *251:A *109:6 136.553
+3 *109:8 *109:11 30.7255
+4 *109:3 *109:8 234.801
+5 *109:4 *109:3 12.8543
+6 *109:14 *109:4 3.60517
+7 *109:13 *109:14 1.3471
+8 *109:12 *109:13 1.14165
+9 *109:9 *109:12 1.10386
+10 *252:Y *109:9 9.24915
+11 *109:14 *109:5 301.863
+12 *109:10 *109:5 683.475
+13 *109:7 *109:10 60.0304
+14 *250:A1 *109:7 39.7254
+*END
+
+*D_NET *110 0.00520773
+
+*CONN
+*I *250:Y O *C 79.36 61.79 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *249:A I *C 92.12 76.96 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *248:A1 I *C 94.565 70.67 *L 0.00564 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *250:Y 9.922e-05
+2 *110:3 0.00029533
+3 *110:4 0.00014299
+4 *110:5 0.0002623
+5 *110:6 5.024e-05
+6 *110:7 0.00034882
+7 *110:8 0.00037158
+8 *110:9 6.214e-05
+9 *110:11 0.00056441
+10 *110:12 7.439e-05
+11 *110:13 0.00026531
+12 *110:14 9.145e-05
+13 *110:15 6.92e-05
+14 *110:16 6.221e-05
+15 *110:17 0.00026708
+16 *110:18 6.984e-05
+17 *110:19 0.00170183
+18 *110:3 *13:6 0.00040939
+
+*RES
+1 *248:A1 *110:13 9.24915
+2 *110:13 *110:14 1.34745
+3 *110:14 *110:15 0.557028
+4 *110:15 *110:16 0.423052
+5 *110:16 *110:17 0.557028
+6 *110:17 *110:18 2.46763
+7 *110:19 *110:18 6.73813
+8 *110:3 *110:19 4.47566
+9 *110:3 *110:4 12.6351
+10 *110:4 *249:A 78.6391
+11 *110:19 *110:12 9.4531
+12 *110:11 *110:12 5.62214
+13 *110:9 *110:11 0.557028
+14 *110:9 *110:5 3.13176
+15 *110:7 *110:5 3.60033
+16 *110:7 *110:10 0.539107
+17 *110:8 *110:10 2.24356
+18 *110:8 *110:6 9.81101
+19 *250:Y *110:6 82.0943
+*END
+
+*D_NET *111 0.00154737
+
+*CONN
+*I *248:Y O *C 95.35 72.15 *L 0 *D sky130_osu_sc_18T_ms__oai22_l
+*I *247:A I *C 96.21 83.62 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *111:2 7.513e-05
+2 *111:3 8.683e-05
+3 *111:4 0.00138541
+
+*RES
+1 *111:4 *111:3 48.9746
+2 *111:3 *247:A 22.4964
+3 *111:4 *111:2 22.7685
+4 *111:2 *248:Y 39.0151
+*END
+
+*D_NET *112 0.00376792
+
+*CONN
+*I *335:Y O *C 92.34 58.83 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *334:A I *C 91.75 85.47 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *335:Y 3.487e-05
+2 *112:2 0.000293
+3 *112:3 3.528e-05
+4 *112:4 0.00026555
+5 *112:5 7.219e-05
+6 *112:6 8.887e-05
+7 *112:8 0.00082721
+8 *112:9 0.00039868
+9 *112:10 9.119e-05
+10 *112:11 6.668e-05
+11 *112:12 0.00065072
+12 *112:13 0.00047609
+13 *112:15 0.00046759
+
+*RES
+1 *112:11 *112:15 0.557028
+2 *112:15 *112:16 3.59549
+3 *112:4 *112:16 1.12373
+4 *112:4 *112:6 1.32434
+5 *112:6 *112:13 0.557028
+6 *112:13 *112:14 4.49678
+7 *112:8 *112:14 0.539107
+8 *112:8 *112:10 9.90937
+9 *334:A *112:10 9.24915
+10 *112:11 *112:2 3.13176
+11 *112:9 *112:2 4.05097
+12 *112:9 *112:12 0.539107
+13 *112:12 *112:3 14.6521
+14 *112:3 *112:7 39.7254
+15 *112:5 *112:7 29.9563
+16 *335:Y *112:5 49.4792
+*END
+
+*D_NET *113 0.00022045
+
+*CONN
+*I *334:Y O *C 92.455 84.36 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *247:B I *C 94.77 83.99 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *334:Y 0.00022045
+
+*RES
+1 *334:Y *247:B 195.076
+*END
+
+*D_NET *114 0.00039404
+
+*CONN
+*I *337:Y O *C 48.18 48.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *336:A I *C 49.62 50.32 *L 0.00582 *D sky130_osu_sc_18T_ms__or2_1
+
+*CAP
+1 *114:2 9.035e-05
+2 *114:3 0.00011147
+3 *114:4 0.00019222
+
+*RES
+1 *114:4 *114:3 1.73111
+2 *114:3 *114:2 1.3471
+3 *336:A *114:2 9.24915
+4 *337:Y *114:4 9.24915
+*END
+
+*D_NET *115 0.00267832
+
+*CONN
+*I *336:Y O *C 50.58 48.47 *L 0 *D sky130_osu_sc_18T_ms__or2_1
+*I *276:B I *C 47.69 63.27 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *275:A0 I *C 55.3 56.98 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *336:Y 4.115e-05
+2 *276:B 2.64e-06
+3 *115:3 0.00022437
+4 *115:5 3.003e-05
+5 *115:6 0.00090971
+6 *115:7 2.691e-05
+7 *115:8 0.0004304
+8 *115:9 3.782e-05
+9 *115:10 0.00017805
+10 *115:11 0.00079724
+
+*RES
+1 *115:9 *275:A0 22.4964
+2 *115:8 *115:9 351.787
+3 *115:6 *115:8 117.756
+4 *115:10 *115:6 16.4546
+5 *115:10 *115:5 10.3956
+6 *115:3 *115:5 78.7405
+7 *115:3 *115:4 60.0304
+8 *276:B *115:4 10.4641
+9 *115:11 *115:8 40.0336
+10 *115:11 *115:7 17.3608
+11 *336:Y *115:7 48.7689
+*END
+
+*D_NET *116 0.00022161
+
+*CONN
+*I *242:A1 I *C 86.14 83.99 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *179:Y O *C 88.93 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *242:A1 0.00022161
+
+*RES
+1 *242:A1 *179:Y 195.076
+*END
+
+*D_NET *117 0.00200512
+
+*CONN
+*I *239:A1 I *C 61.61 89.91 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *180:Y O *C 60.66 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *117:2 8.64e-05
+2 *117:3 6.499e-05
+3 *117:4 0.00137328
+4 *117:6 7.606e-05
+5 *117:5 *24:5 0.00040439
+
+*RES
+1 *117:2 *117:3 30.7844
+2 *117:3 *239:A1 38.9562
+3 *117:6 *117:2 9.69496
+4 *117:5 *117:6 0.557028
+5 *117:4 *117:5 15.2992
+6 *180:Y *117:4 9.24915
+*END
+
+*D_NET *118 0.0001702
+
+*CONN
+*I *232:B I *C 88.55 89.91 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *181:Y O *C 90.47 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *232:B 0.0001702
+
+*RES
+1 *232:B *181:Y 136.553
+*END
+
+*D_NET *119 0.00616261
+
+*CONN
+*I *245:A I *C 79.39 90.28 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *182:Y O *C 81.23 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *182:Y 4e-05
+2 *119:2 0.00013829
+3 *119:3 2.682e-05
+4 *119:4 0.00077819
+5 *119:5 0.00167187
+6 *119:6 9.071e-05
+7 *119:7 6.444e-05
+8 *119:8 0.00011908
+9 *119:9 0.00013997
+10 *119:10 9.356e-05
+11 *119:11 0.00061904
+12 *119:12 6.49e-06
+13 *119:13 0.00063072
+14 *119:14 0.00019122
+15 *119:13 *9:9 0.0005611
+16 *119:11 *11:12 0.00043653
+17 *119:2 *14:5 0.00055458
+
+*RES
+1 *245:A *119:6 9.24915
+2 *119:4 *119:6 7.72187
+3 *119:10 *119:4 4.82917
+4 *119:14 *119:10 3.67569
+5 *119:12 *119:14 0.101117
+6 *119:11 *119:12 1.12495
+7 *119:11 *119:13 0.0999136
+8 *119:13 *119:9 4.49544
+9 *119:9 *119:7 5.02713
+10 *119:7 *119:2 2.09489
+11 *119:5 *119:2 19.8236
+12 *119:5 *119:8 0.539107
+13 *119:8 *119:3 10.1456
+14 *182:Y *119:3 58.5227
+*END
+
+*D_NET *120 0.00116625
+
+*CONN
+*I *183:Y O *C 59.89 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *180:A I *C 60.18 76.96 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *120:2 7.045e-05
+2 *120:3 0.00090817
+3 *120:4 9.768e-05
+4 *120:5 8.995e-05
+
+*RES
+1 *120:2 *180:A 78.0302
+2 *120:3 *120:2 16.8874
+3 *120:3 *120:4 0.557028
+4 *120:4 *120:5 0.896455
+5 *183:Y *120:5 9.24915
+*END
+
+*D_NET *121 0.00178835
+
+*CONN
+*I *188:A I *C 98.68 63.64 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+*I *184:Y O *C 99.82 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *188:A 0.00030989
+2 *184:Y 6.014e-05
+3 *121:2 2.465e-05
+4 *121:3 2.344e-05
+5 *121:4 0.00137023
+
+*RES
+1 *184:Y *121:2 78.0302
+2 *121:4 *121:2 25.923
+3 *121:3 *121:4 9.24915
+4 *188:A *121:3 234.091
+*END
+
+*D_NET *122 0.00402947
+
+*CONN
+*I *200:A I *C 74.48 76.96 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+*I *185:Y O *C 77.05 45.51 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *122:2 0.00020225
+2 *122:3 0.0011036
+3 *122:4 0.00010017
+4 *122:5 0.00049928
+5 *122:6 0.00212417
+
+*RES
+1 *122:4 *122:3 12.1674
+2 *122:5 *122:3 4.95227
+3 *122:5 *122:6 0.539107
+4 *122:6 *122:2 30.4247
+5 *122:2 *185:Y 195.076
+6 *200:A *122:4 9.24915
+*END
+
+*D_NET *123 0.00208785
+
+*CONN
+*I *222:QN O *C 73.05 63.27 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *186:A I *C 81.85 56.98 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *123:2 0.0001003
+2 *123:3 0.00083954
+3 *123:4 7.698e-05
+4 *123:5 0.00107103
+
+*RES
+1 *123:5 *123:2 48.9746
+2 *123:2 *222:QN 22.4964
+3 *123:5 *123:3 17.3608
+4 *123:3 *123:4 663.967
+5 *123:4 *186:A 52.5706
+*END
+
+*D_NET *124 0.00212576
+
+*CONN
+*I *230:B I *C 71.17 89.91 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *187:Y O *C 87.39 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *230:B 0.0006219
+2 *124:2 0.00016603
+3 *124:3 4.909e-05
+4 *124:5 0.00110246
+5 *124:7 0.00018628
+
+*RES
+1 *124:5 *124:3 625.662
+2 *124:3 *124:2 30.7255
+3 *124:2 *187:Y 87.7251
+4 *124:5 *124:4 120.179
+5 *124:7 *124:4 79.4508
+6 *124:7 *124:6 29.9563
+7 *230:B *124:6 507.907
+*END
+
+*D_NET *125 0.00230991
+
+*CONN
+*I *240:A1 I *C 89.87 70.67 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *188:Y O *C 99.16 61.79 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *240:A1 0.00013213
+2 *125:2 0.00026754
+3 *125:3 0.00019689
+4 *125:4 3.798e-05
+5 *125:5 5.587e-05
+6 *125:6 0.00010734
+7 *125:7 0.00028453
+8 *125:8 0.00016477
+9 *125:10 0.00106286
+
+*RES
+1 *125:6 *125:4 9.32571
+2 *240:A1 *125:4 117.045
+3 *125:10 *125:6 8.54811
+4 *125:10 *125:8 5.64006
+5 *125:8 *125:9 0.539107
+6 *125:9 *125:2 3.14968
+7 *125:7 *125:2 3.14968
+8 *125:5 *125:7 0.557028
+9 *125:3 *125:5 1.32918
+10 *188:Y *125:3 9.24915
+*END
+
+*D_NET *126 0.00193429
+
+*CONN
+*I *205:A I *C 41.26 63.64 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+*I *189:Y O *C 43.17 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *126:2 0.00028107
+2 *126:3 4.858e-05
+3 *126:4 0.00070595
+4 *126:5 5.587e-05
+5 *126:6 0.00012436
+6 *126:7 0.00071846
+
+*RES
+1 *126:3 *205:A 39.0151
+2 *126:7 *126:3 16.4546
+3 *126:5 *126:7 0.557028
+4 *126:4 *126:5 8.53467
+5 *126:4 *126:6 0.539107
+6 *126:6 *126:2 10.1456
+7 *126:2 *189:Y 195.076
+*END
+
+*D_NET *127 0.00081355
+
+*CONN
+*I *196:A I *C 100.11 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+*I *190:Y O *C 100.26 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *127:3 0.00043422
+2 *127:4 8.551e-05
+3 *127:5 0.00010367
+4 *127:6 6.368e-05
+5 *127:7 0.00012647
+
+*RES
+1 *127:7 *127:6 0.878534
+2 *127:6 *127:3 0.557028
+3 *127:3 *127:2 4.04614
+4 *127:5 *127:2 0.539107
+5 *127:5 *127:4 0.896455
+6 *196:A *127:4 9.24915
+7 *190:Y *127:7 9.24915
+*END
+
+*D_NET *128 0.00146116
+
+*CONN
+*I *241:A1 I *C 81.51 76.59 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *191:Y O *C 73.53 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *128:2 0.00016026
+2 *128:3 0.0001011
+3 *128:5 2.714e-05
+4 *128:6 7.803e-05
+5 *128:7 0.00109463
+
+*RES
+1 *128:3 *128:4 0.106008
+2 *128:7 *128:4 7.64312
+3 *128:6 *128:7 4.47566
+4 *128:5 *128:6 0.0166987
+5 *128:2 *128:5 9.24915
+6 *128:2 *241:A1 78.0302
+7 *191:Y *128:3 9.24915
+*END
+
+*D_NET *129 0.0015079
+
+*CONN
+*I *231:B I *C 70.52 83.99 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *192:Y O *C 77.38 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *192:Y 4.162e-05
+2 *129:2 0.00014708
+3 *129:3 5.403e-05
+4 *129:4 0.000553
+5 *129:5 0.00023407
+6 *129:6 0.00015123
+7 *129:7 0.0001441
+8 *129:9 0.00018277
+
+*RES
+1 *129:2 *129:4 97.5378
+2 *129:3 *129:4 410.369
+3 *129:3 *129:5 30.7255
+4 *129:5 *129:7 156.712
+5 *129:7 *129:8 60.0304
+6 *192:Y *129:8 59.233
+7 *129:9 *129:2 10.1504
+8 *129:9 *129:6 40.0336
+9 *129:6 *231:B 38.9562
+*END
+
+*D_NET *130 0.00049049
+
+*CONN
+*I *235:A1 I *C 55.22 63.27 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *193:Y O *C 58.13 61.79 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *235:A1 9.025e-05
+2 *130:2 0.00011199
+3 *130:4 8.476e-05
+4 *130:5 0.00020349
+
+*RES
+1 *130:2 *130:3 30.0152
+2 *235:A1 *130:3 78.7405
+3 *130:5 *130:2 11.003
+4 *130:4 *130:5 9.24915
+5 *130:4 *193:Y 58.5227
+*END
+
+*D_NET *131 0.00107697
+
+*CONN
+*I *194:Y O *C 42.84 58.83 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+*I *189:A I *C 42.69 50.32 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *131:2 0.00012331
+2 *131:3 0.00014255
+3 *131:4 0.00081111
+
+*RES
+1 *131:2 *189:A 78.0302
+2 *131:4 *131:2 17.8114
+3 *131:3 *131:4 9.24915
+4 *131:3 *194:Y 117.045
+*END
+
+*D_NET *132 0.00250866
+
+*CONN
+*I *195:Y O *C 72.43 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *187:A I *C 86.91 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *195:Y 8.176e-05
+2 *132:2 4.283e-05
+3 *132:3 0.00036591
+4 *132:4 0.00039988
+5 *132:5 0.0012122
+6 *132:5 *9:13 0.00040608
+
+*RES
+1 *187:A *132:4 9.24915
+2 *132:5 *132:4 7.73979
+3 *132:5 *132:3 10.8106
+4 *132:3 *132:2 11.8434
+5 *195:Y *132:2 78.0302
+*END
+
+*D_NET *133 0.00333132
+
+*CONN
+*I *198:Y O *C 98.5 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+*I *184:A I *C 99.34 50.32 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *133:2 4.609e-05
+2 *133:3 0.00012829
+3 *133:4 0.00102588
+4 *133:5 0.00022467
+5 *133:6 0.00033726
+6 *133:7 7.609e-05
+7 *133:8 0.00094889
+8 *133:9 0.00054415
+
+*RES
+1 *133:9 *133:10 4.94743
+2 *133:5 *133:10 1.12373
+3 *133:5 *133:4 1.3471
+4 *133:4 *133:3 19.1634
+5 *133:3 *198:Y 78.0302
+6 *133:7 *133:9 0.557028
+7 *133:6 *133:7 3.12693
+8 *133:6 *133:8 0.539107
+9 *133:8 *133:2 20.0598
+10 *133:2 *184:A 39.0151
+*END
+
+*D_NET *134 0.00136804
+
+*CONN
+*I *199:Y O *C 68.25 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+*I *192:A I *C 76.9 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *134:2 0.00071986
+2 *134:3 0.00041882
+3 *134:4 0.00010147
+4 *134:6 0.00012789
+
+*RES
+1 *192:A *134:4 9.24915
+2 *134:4 *134:6 0.17812
+3 *134:6 *134:2 7.0775
+4 *134:3 *134:2 5.49377
+5 *134:3 *134:5 0.00510432
+6 *199:Y *134:5 9.24915
+*END
+
+*D_NET *135 0.00059975
+
+*CONN
+*I *200:Y O *C 74.96 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *191:A I *C 73.05 76.96 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *200:Y 5.251e-05
+2 *191:A 7.964e-05
+3 *135:3 0.00015708
+4 *135:4 0.00026314
+5 *135:5 4.738e-05
+
+*RES
+1 *135:4 *135:2 156.712
+2 *135:3 *135:2 60.0304
+3 *200:Y *135:3 59.233
+4 *135:5 *135:4 30.7255
+5 *191:A *135:5 78.7405
+*END
+
+*D_NET *136 0.00027617
+
+*CONN
+*I *238:A1 I *C 56.54 70.67 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *201:Y O *C 58.9 72.15 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *238:A1 0.00027617
+
+*RES
+1 *238:A1 *201:Y 175.568
+*END
+
+*D_NET *137 0.00076092
+
+*CONN
+*I *202:Y O *C 52.08 61.79 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+*I *193:A I *C 57.65 63.64 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *202:Y 8.102e-05
+2 *137:3 0.00015566
+3 *137:4 0.00038942
+4 *137:5 0.00013482
+
+*RES
+1 *137:5 *137:4 90.8738
+2 *137:4 *137:2 273.757
+3 *137:3 *137:2 60.0304
+4 *137:3 *193:A 39.7254
+5 *202:Y *137:5 78.7405
+*END
+
+*D_NET *138 0.00457108
+
+*CONN
+*I *211:A I *C 66.34 50.32 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+*I *203:Y O *C 97.84 45.51 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *211:A 0.00050062
+2 *203:Y 1.787e-05
+3 *138:2 0.00304813
+4 *138:3 0.00010167
+5 *138:4 5.786e-05
+6 *138:5 3.158e-05
+7 *138:6 3.241e-05
+8 *138:7 0.00047643
+9 *138:8 0.00030451
+
+*RES
+1 *138:6 *138:8 9.24915
+2 *138:8 *138:4 11.5024
+3 *203:Y *138:4 24.7909
+4 *138:6 *138:2 2204.35
+5 *138:3 *138:2 58.5227
+6 *138:7 *138:3 12.4037
+7 *138:5 *138:7 9.24915
+8 *211:A *138:5 351.136
+*END
+
+*D_NET *139 0.00347398
+
+*CONN
+*I *235:Y O *C 54.74 61.79 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *204:A I *C 43.02 43.66 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *139:2 0.00133558
+2 *139:3 4.078e-05
+3 *139:4 0.00134948
+4 *139:5 5.612e-05
+5 *139:6 0.00017024
+6 *139:7 0.00052178
+
+*RES
+1 *139:3 *235:Y 26.3063
+2 *139:2 *139:3 937.073
+3 *139:6 *139:2 10.1456
+4 *139:6 *139:8 0.539107
+5 *139:7 *139:8 4.94743
+6 *139:5 *139:7 0.557028
+7 *139:4 *139:5 15.7498
+8 *204:A *139:4 9.24915
+*END
+
+*D_NET *140 0.00458293
+
+*CONN
+*I *234:B I *C 56.66 83.99 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *205:Y O *C 41.74 61.79 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *234:B 5.836e-05
+2 *205:Y 5.15e-05
+3 *140:2 0.00025606
+4 *140:3 3.796e-05
+5 *140:4 2.478e-05
+6 *140:5 2.603e-05
+7 *140:6 6.769e-05
+8 *140:7 0.00030592
+9 *140:8 0.00085504
+10 *140:9 3.6e-05
+11 *140:10 0.00017333
+12 *140:11 0.00057493
+13 *140:12 8.778e-05
+14 *140:13 0.0001879
+15 *140:14 0.00015748
+16 *140:15 0.0011899
+17 *140:8 *142:2 0.00049227
+
+*RES
+1 *140:10 *140:5 10.1456
+2 *140:3 *140:5 38.9562
+3 *205:Y *140:3 53.5433
+4 *140:7 *140:10 0.539107
+5 *140:7 *140:2 2.69904
+6 *140:6 *140:2 3.13176
+7 *140:6 *140:8 0.557028
+8 *140:8 *140:9 9.33693
+9 *140:15 *140:9 10.8106
+10 *140:15 *140:13 5.49391
+11 *140:11 *140:13 0.539107
+12 *140:11 *140:12 6.28145
+13 *140:12 *140:14 0.557028
+14 *140:14 *140:4 10.1456
+15 *234:B *140:4 53.2394
+*END
+
+*D_NET *141 0.00467858
+
+*CONN
+*I *206:Y O *C 97.4 58.83 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *181:A I *C 89.99 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *206:Y 7.82e-05
+2 *181:A 0.00069887
+3 *141:2 0.00233529
+4 *141:3 0.00011255
+5 *141:4 0.00027135
+6 *141:5 3.631e-05
+7 *141:7 0.00012195
+8 *141:8 8.368e-05
+9 *141:9 0.00046332
+10 *141:11 0.00047706
+
+*RES
+1 *141:11 *141:5 13.3001
+2 *141:3 *141:5 77.9713
+3 *206:Y *141:3 55.5753
+4 *141:9 *141:11 0.246796
+5 *141:9 *141:10 4.04614
+6 *141:7 *141:10 0.246796
+7 *141:7 *141:2 0.896455
+8 *141:8 *141:2 36.7385
+9 *141:4 *141:8 117.756
+10 *141:4 *141:6 60.0304
+11 *181:A *141:6 624.952
+*END
+
+*D_NET *142 0.00422384
+
+*CONN
+*I *207:Y O *C 41.74 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *195:A I *C 71.95 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *207:Y 2.9e-05
+2 *142:2 0.00026109
+3 *142:3 8.324e-05
+4 *142:4 8.62e-06
+5 *142:5 2.652e-05
+6 *142:6 0.00057092
+7 *142:7 1.644e-05
+8 *142:8 0.00254621
+9 *142:9 0.00018953
+10 *142:2 *140:8 0.00049227
+
+*RES
+1 *142:6 *142:7 4.47566
+2 *142:7 *142:4 0.113124
+3 *142:9 *142:4 0.790238
+4 *142:8 *142:9 0.277693
+5 *142:8 *142:2 16.0061
+6 *142:2 *142:5 12.2575
+7 *207:Y *142:5 78.0302
+8 *142:6 *142:3 14.0601
+9 *142:3 *195:A 39.0151
+*END
+
+*D_NET *143 0.00070343
+
+*CONN
+*I *210:Y O *C 73.86 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *182:A I *C 80.75 50.32 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *210:Y 6.356e-05
+2 *143:3 0.00019538
+3 *143:4 0.00025392
+4 *143:5 5.606e-05
+5 *143:6 7.312e-05
+6 *143:7 6.139e-05
+
+*RES
+1 *143:7 *143:6 30.7255
+2 *143:6 *143:5 39.6665
+3 *143:5 *143:4 30.7255
+4 *143:4 *143:2 156.712
+5 *143:3 *143:2 29.9563
+6 *143:3 *182:A 79.2479
+7 *210:Y *143:7 78.7405
+*END
+
+*D_NET *144 0.00209588
+
+*CONN
+*I *222:D I *C 68.25 62.53 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+*I *211:Y O *C 66.82 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *144:3 0.00110016
+2 *144:5 0.00045184
+3 *144:6 8.704e-05
+4 *144:7 0.00045684
+
+*RES
+1 *144:3 *144:2 8.55743
+2 *144:5 *144:2 0.539107
+3 *144:5 *144:4 2.6942
+4 *144:7 *144:4 0.539107
+5 *144:7 *144:6 4.05097
+6 *222:D *144:6 9.24915
+7 *211:Y *144:3 9.24915
+*END
+
+*D_NET *145 0.00552217
+
+*CONN
+*I *212:Y O *C 67.15 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *206:A I *C 96.92 56.98 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *212:Y 5.227e-05
+2 *145:2 7.781e-05
+3 *145:3 0.00076376
+4 *145:4 0.00012716
+5 *145:5 0.000648
+6 *145:6 0.00012013
+7 *145:7 0.00047218
+8 *145:9 7.349e-05
+9 *145:10 0.00220761
+10 *145:11 0.00097976
+
+*RES
+1 *212:Y *145:8 78.7405
+2 *145:6 *145:8 29.9563
+3 *145:6 *145:4 59.233
+4 *145:2 *145:4 136.553
+5 *145:3 *145:2 18.7127
+6 *145:5 *145:3 6.82058
+7 *145:11 *145:5 7.86117
+8 *145:10 *145:11 0.284267
+9 *145:10 *145:9 12.3861
+10 *145:7 *145:9 4.60389
+11 *206:A *145:7 9.24915
+*END
+
+*D_NET *146 0.00134949
+
+*CONN
+*I *227:B I *C 79.21 76.59 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *213:Y O *C 80.79 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *227:B 0.00011724
+2 *146:2 6.44e-05
+3 *146:3 0.00013428
+4 *146:4 4.615e-05
+5 *146:5 0.00098742
+
+*RES
+1 *146:3 *146:4 77.9713
+2 *146:5 *146:4 17.7627
+3 *213:Y *146:5 9.24915
+4 *146:2 *146:3 30.7255
+5 *227:B *146:2 78.7405
+*END
+
+*D_NET *147 0.00225729
+
+*CONN
+*I *233:B I *C 87.57 70.67 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *214:Y O *C 97.18 72.15 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *147:2 0.00022732
+2 *147:3 0.00010324
+3 *147:4 0.00022239
+4 *147:5 0.00013488
+5 *147:6 0.00109357
+6 *147:7 0.00012209
+7 *147:8 8.798e-05
+8 *147:9 0.00026582
+
+*RES
+1 *147:2 *147:3 1.68688
+2 *233:B *147:3 9.24915
+3 *147:7 *147:2 5.1462
+4 *147:6 *147:7 0.284267
+5 *147:6 *147:8 3.60356
+6 *147:8 *147:9 0.277693
+7 *147:9 *147:4 5.15277
+8 *147:4 *147:5 1.65034
+9 *214:Y *147:5 9.24915
+*END
+
+*D_NET *148 0.00297954
+
+*CONN
+*I *215:Y O *C 42.18 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *194:A I *C 42.36 56.98 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *148:2 0.00165945
+2 *148:3 9.322e-05
+3 *148:4 0.00122687
+
+*RES
+1 *215:Y *148:3 9.24915
+2 *148:3 *148:2 20.7297
+3 *148:4 *148:2 12.1674
+4 *194:A *148:4 9.24915
+*END
+
+*D_NET *149 0.00120886
+
+*CONN
+*I *229:B I *C 54.24 70.67 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *216:Y O *C 41.85 72.15 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *149:2 0.00045253
+2 *149:3 8.664e-05
+3 *149:4 0.00066969
+
+*RES
+1 *149:3 *149:2 60.7996
+2 *149:2 *229:B 351.077
+3 *149:4 *149:3 469.602
+4 *149:4 *216:Y 58.209
+*END
+
+*D_NET *150 0.00621413
+
+*CONN
+*I *218:Y O *C 81.34 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *210:A I *C 73.38 50.32 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *218:Y 2.398e-05
+2 *210:A 0.00033475
+3 *150:2 0.000557
+4 *150:3 0.00010361
+5 *150:4 3.308e-05
+6 *150:5 0.0006439
+7 *150:6 5.977e-05
+8 *150:7 0.00196839
+9 *150:8 0.00140303
+10 *150:9 9.383e-05
+11 *150:10 0.00037939
+12 *150:10 *11:10 0.0006134
+
+*RES
+1 *150:6 *150:2 6.28628
+2 *150:7 *150:2 28.1763
+3 *150:5 *150:7 546.153
+4 *150:3 *150:5 90.8738
+5 *210:A *150:3 234.801
+6 *150:6 *150:8 0.557028
+7 *150:8 *150:9 16.1957
+8 *150:9 *150:10 1.14165
+9 *150:10 *150:4 13.3001
+10 *218:Y *150:4 39.0151
+*END
+
+*D_NET *159 0.0127336
+
+*CONN
+*I *246:Y O *C 85.47 88.43 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *242:A0 I *C 85.66 83.62 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *241:A0 I *C 81.99 76.96 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *240:A0 I *C 90.35 70.3 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *239:A0 I *C 61.13 90.28 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *238:A0 I *C 57.02 70.3 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *237:A0 I *C 55.7 83.62 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *236:A0 I *C 75.94 83.62 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *235:A0 I *C 55.7 63.64 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *246:Y 4.1e-05
+2 *242:A0 1.257e-05
+3 *241:A0 0.0005618
+4 *159:9 0.00011705
+5 *159:10 0.0005535
+6 *159:11 0.00026781
+7 *159:12 0.00028802
+8 *159:13 0.00038527
+9 *159:14 0.00075366
+10 *159:15 7.23e-06
+11 *159:16 7.223e-05
+12 *159:17 0.00100885
+13 *159:18 0.00049668
+14 *159:19 1.759e-05
+15 *159:20 0.00012617
+16 *159:22 4.789e-05
+17 *159:23 0.00019196
+18 *159:24 4.583e-05
+19 *159:25 2.344e-05
+20 *159:26 0.00025247
+21 *159:28 0.00048851
+22 *159:29 0.00030651
+23 *159:30 0.00128746
+24 *159:31 0.00052686
+25 *159:32 8.902e-05
+26 *159:33 0.00055582
+27 *159:34 0.00056539
+28 *159:35 3.069e-05
+29 *159:36 0.00041372
+30 *159:37 7.684e-05
+31 *159:38 0.00020283
+32 *159:39 0.00022905
+33 *159:40 7.528e-05
+34 *159:41 0.00023772
+35 *159:17 *9:16 0.00067854
+36 *159:14 *11:13 0.00065534
+37 *159:11 *29:2 0.00044347
+38 *159:9 *10:9 0.00059953
+
+*RES
+1 *159:34 *159:35 6.28628
+2 *159:35 *159:22 9.82893
+3 *246:Y *159:22 58.5227
+4 *242:A0 *159:34 9.24915
+5 *159:18 *242:A0 312.062
+6 *159:33 *159:18 40.0336
+7 *159:33 *159:15 15.5582
+8 *241:A0 *159:15 82.9071
+9 *241:A0 *159:25 507.197
+10 *159:39 *159:25 11.0469
+11 *159:37 *159:39 0.557028
+12 *159:36 *159:37 3.57757
+13 *159:36 *159:38 0.539107
+14 *159:38 *159:24 11.0469
+15 *159:24 *159:27 39.7254
+16 *159:26 *159:27 60.0304
+17 *159:26 *240:A0 118.263
+18 *159:10 *159:15 507.197
+19 *159:31 *159:10 14.9127
+20 *159:41 *159:31 5.15277
+21 *159:40 *159:41 0.277693
+22 *159:40 *159:12 1.46241
+23 *159:29 *159:12 1.46241
+24 *159:29 *159:30 0.284267
+25 *159:30 *159:19 10.3499
+26 *159:17 *159:19 15.1271
+27 *159:9 *159:17 9.24915
+28 *159:9 *238:A0 97.7407
+29 *159:17 *159:11 4.05581
+30 *159:13 *159:11 3.94619
+31 *235:A0 *159:13 9.24915
+32 *159:19 *159:20 1.03527
+33 *237:A0 *159:20 9.24915
+34 *159:20 *159:21 0.957353
+35 *159:14 *159:21 1.12373
+36 *159:14 *159:16 7.65614
+37 *159:28 *159:16 7.64312
+38 *159:28 *159:23 4.66452
+39 *239:A0 *159:23 9.24915
+40 *159:31 *159:32 1.03527
+41 *236:A0 *159:32 9.24915
+*END
+
+*D_NET *160 0.00337667
+
+*CONN
+*I *242:Y O *C 86.62 85.47 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *212:A I *C 66.67 76.96 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *212:A 0.0002071
+2 *160:2 2.482e-05
+3 *160:3 0.00128387
+4 *160:4 4.663e-05
+5 *160:5 0.0003243
+6 *160:6 0.00024939
+7 *160:7 0.00033081
+8 *160:8 0.00016755
+9 *160:9 0.00039455
+10 *160:10 0.00034765
+
+*RES
+1 *160:6 *160:7 9.24915
+2 *160:7 *160:4 11.953
+3 *212:A *160:4 156.06
+4 *160:6 *160:3 214.583
+5 *160:2 *160:3 1072.92
+6 *160:8 *160:2 10.1277
+7 *160:8 *160:10 0.557028
+8 *160:10 *160:11 3.59549
+9 *160:9 *160:11 0.539107
+10 *160:9 *160:5 11.9482
+11 *160:5 *242:Y 234.091
+*END
+
+*D_NET *161 0.00133668
+
+*CONN
+*I *241:Y O *C 81.03 75.11 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *213:A I *C 80.31 83.62 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *161:2 8.247e-05
+2 *161:3 0.00010645
+3 *161:4 0.00114776
+
+*RES
+1 *161:4 *161:2 1.14649
+2 *241:Y *161:2 9.24915
+3 *161:4 *161:3 10.4209
+4 *213:A *161:3 9.24915
+*END
+
+*D_NET *162 0.00121013
+
+*CONN
+*I *240:Y O *C 89.39 72.15 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *214:A I *C 96.7 70.3 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *240:Y 7.073e-05
+2 *162:3 0.00035126
+3 *162:4 0.00078814
+
+*RES
+1 *162:3 *214:A 39.7254
+2 *162:3 *162:2 210.401
+3 *162:4 *162:2 546.863
+4 *240:Y *162:4 53.5433
+*END
+
+*D_NET *163 0.00425985
+
+*CONN
+*I *239:Y O *C 62.09 88.43 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *207:A I *C 41.26 76.96 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *239:Y 5.612e-05
+2 *163:2 2.851e-05
+3 *163:3 0.00068023
+4 *163:4 5.407e-05
+5 *163:5 0.00015739
+6 *163:7 7.632e-05
+7 *163:8 6.088e-05
+8 *163:9 0.00047523
+9 *163:10 0.0026711
+
+*RES
+1 *207:A *163:5 9.24915
+2 *163:5 *163:6 0.896455
+3 *163:3 *163:6 0.539107
+4 *163:3 *163:4 8.08403
+5 *163:4 *163:7 0.557028
+6 *163:7 *163:8 0.969533
+7 *163:10 *163:8 14.883
+8 *163:9 *163:10 4.47566
+9 *163:9 *163:2 13.2319
+10 *239:Y *163:2 78.0302
+*END
+
+*D_NET *164 0.00081545
+
+*CONN
+*I *238:Y O *C 56.06 72.15 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *228:B I *C 61.16 70.67 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+
+*CAP
+1 *238:Y 0.000206
+2 *164:3 0.00026201
+3 *164:4 0.0002974
+4 *164:5 5.004e-05
+
+*RES
+1 *164:4 *164:2 195.727
+2 *164:3 *164:2 150.253
+3 *164:3 *228:B 39.7254
+4 *164:5 *164:4 30.7255
+5 *238:Y *164:5 166.525
+*END
+
+*D_NET *165 0.00182066
+
+*CONN
+*I *237:Y O *C 54.74 85.47 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *215:A I *C 41.7 83.62 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *215:A 0.00043819
+2 *165:3 0.00050012
+3 *165:4 0.0005929
+4 *165:5 0.00028945
+
+*RES
+1 *165:4 *165:2 390.802
+2 *165:3 *165:2 29.9563
+3 *165:3 *237:Y 351.846
+4 *165:5 *165:4 181.096
+5 *215:A *165:5 312.831
+*END
+
+*D_NET *166 0.00121588
+
+*CONN
+*I *236:Y O *C 74.98 85.47 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *199:A I *C 67.77 83.62 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *236:Y 4.558e-05
+2 *166:2 0.00041453
+3 *166:3 0.00042666
+4 *166:5 0.00032911
+
+*RES
+1 *166:5 *166:3 11.953
+2 *166:3 *166:2 292.613
+3 *166:4 *166:2 293.324
+4 *236:Y *166:4 25.9511
+5 *199:A *166:5 9.24915
+*END
+
+*D_NET *167 0.003344
+
+*CONN
+*I *216:A I *C 41.37 70.3 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+*I *204:Y O *C 43.5 45.51 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *216:A 0.00018662
+2 *204:Y 5.886e-05
+3 *167:2 0.00020378
+4 *167:3 0.00010896
+5 *167:4 0.00031161
+6 *167:5 3.623e-05
+7 *167:7 0.00069735
+8 *167:8 7.97e-05
+9 *167:9 5.587e-05
+10 *167:10 0.00037933
+11 *167:11 0.00122569
+
+*RES
+1 *167:11 *167:2 13.5145
+2 *167:8 *167:2 11.953
+3 *167:4 *167:8 156.771
+4 *167:4 *167:6 90.1046
+5 *216:A *167:6 156.771
+6 *167:9 *167:11 0.557028
+7 *167:7 *167:9 8.08403
+8 *167:7 *167:10 0.539107
+9 *167:10 *167:5 12.8495
+10 *167:3 *167:5 77.9713
+11 *204:Y *167:3 56.7945
+*END
+
+*D_NET *168 0.00101682
+
+*CONN
+*I *234:Y O *C 56.66 85.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *220:D I *C 57.71 89.17 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *234:Y 0.00021047
+2 *220:D 0.00013434
+3 *168:2 3.486e-05
+4 *168:3 2.53e-05
+5 *168:4 0.00061185
+
+*RES
+1 *168:4 *168:2 13.7556
+2 *234:Y *168:2 209.3
+3 *168:3 *168:4 9.24915
+4 *220:D *168:3 117.045
+*END
+
+*D_NET *169 0.00097663
+
+*CONN
+*I *233:Y O *C 87.57 72.15 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *223:D I *C 84.31 75.85 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *233:Y 9.818e-05
+2 *169:2 0.00037235
+3 *169:4 0.0005061
+
+*RES
+1 *223:D *169:4 9.24915
+2 *169:4 *169:2 12.836
+3 *169:2 *169:3 273.816
+4 *233:Y *169:3 52.774
+*END
+
+*D_NET *170 0.00058744
+
+*CONN
+*I *232:Y O *C 88.55 88.43 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *226:D I *C 93.33 89.17 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *170:2 0.00023045
+2 *170:3 0.00010974
+3 *170:4 0.00024725
+
+*RES
+1 *170:3 *170:2 90.8738
+2 *170:2 *226:D 195.017
+3 *170:4 *170:3 196.496
+4 *170:4 *232:Y 25.2393
+*END
+
+*D_NET *171 0.00104293
+
+*CONN
+*I *231:Y O *C 70.52 85.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *221:D I *C 73.09 89.17 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *231:Y 5.905e-05
+2 *171:2 3.191e-05
+3 *171:3 8.04e-06
+4 *171:4 7.384e-05
+5 *171:5 0.00016249
+6 *171:6 0.00025992
+7 *171:7 0.00044768
+
+*RES
+1 *171:5 *221:D 81.9334
+2 *171:4 *171:5 30.7844
+3 *171:7 *171:4 13.3001
+4 *171:6 *171:7 0.557028
+5 *171:6 *171:2 10.5783
+6 *171:2 *171:3 19.5076
+7 *231:Y *171:3 58.5227
+*END
+
+*D_NET *172 0.000226
+
+*CONN
+*I *230:Y O *C 71.17 88.43 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *225:D I *C 69.26 89.17 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *225:D 0.00021018
+2 *172:2 1.582e-05
+
+*RES
+1 *225:D *172:2 136.553
+2 *230:Y *172:2 19.5076
+*END
+
+*D_NET *173 0.00162085
+
+*CONN
+*I *229:Y O *C 54.24 72.15 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *219:D I *C 57.71 75.85 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *219:D 9.174e-05
+2 *173:2 0.0001052
+3 *173:3 0.00087894
+4 *173:5 0.00054497
+
+*RES
+1 *173:5 *173:3 517.156
+2 *173:3 *173:4 60.0304
+3 *219:D *173:4 117.756
+4 *173:5 *173:2 14.2062
+5 *173:2 *229:Y 78.0302
+*END
+
+*D_NET *174 0.00769624
+
+*CONN
+*I *228:Y O *C 61.16 72.15 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *203:A I *C 97.36 43.66 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *174:3 0.00146243
+2 *174:4 0.00075464
+3 *174:5 0.00013304
+4 *174:6 0.00044559
+5 *174:7 0.0001172
+6 *174:8 0.00011388
+7 *174:9 0.00031574
+8 *174:10 2.02e-06
+9 *174:11 0.0005435
+10 *174:12 0.00241484
+11 *174:13 0.00056532
+12 *174:2 *1:12 0.00041813
+13 *174:12 *62:4 0.00040991
+
+*RES
+1 *174:8 *174:6 4.9571
+2 *174:5 *174:6 0.876932
+3 *174:9 *174:5 5.95334
+4 *174:12 *174:9 7.05713
+5 *174:12 *174:11 3.67701
+6 *174:11 *174:3 2.06451
+7 *174:2 *174:3 6.2136
+8 *174:2 *174:13 0.277693
+9 *174:13 *174:14 2.47889
+10 *174:4 *174:14 0.284267
+11 *174:4 *174:10 8.08741
+12 *174:7 *174:10 0.767316
+13 *203:A *174:7 9.24915
+14 *228:Y *174:8 9.24915
+*END
+
+*D_NET *175 0.00130171
+
+*CONN
+*I *227:Y O *C 79.21 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *224:D I *C 75.84 71.41 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *227:Y 8.139e-05
+2 *224:D 7.961e-05
+3 *175:2 6.382e-05
+4 *175:3 0.00062697
+5 *175:5 0.00044992
+
+*RES
+1 *175:5 *175:3 283.065
+2 *175:3 *175:4 150.253
+3 *227:Y *175:4 78.7405
+4 *175:5 *175:2 12.8543
+5 *224:D *175:2 58.5227
+*END
+
+*D_NET *176 0.00046136
+
+*CONN
+*I *221:QN O *C 77.89 89.91 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *218:A I *C 80.86 90.28 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *221:QN 6.772e-05
+2 *176:3 6.622e-05
+3 *176:4 0.00032742
+
+*RES
+1 *176:3 *218:A 20.3193
+2 *176:3 *176:2 29.9563
+3 *176:4 *176:2 195.727
+4 *221:QN *176:4 59.6394
+*END
+
+*D_NET *177 0.00245242
+
+*CONN
+*I *243:A I *C 56.18 63.64 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *219:QN O *C 52.91 76.59 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *219:QN 0.00041659
+2 *177:2 0.00034785
+3 *177:3 0.00018446
+4 *177:4 4.159e-05
+5 *177:5 8.412e-05
+6 *177:6 0.00035115
+7 *177:7 0.00030752
+8 *177:8 7.169e-05
+9 *177:9 0.00028659
+10 *177:11 0.00036086
+
+*RES
+1 *177:7 *177:2 2.69904
+2 *177:10 *177:2 3.60033
+3 *177:6 *177:10 0.539107
+4 *177:6 *177:8 2.67628
+5 *177:8 *177:11 0.557028
+6 *177:11 *177:12 3.59549
+7 *177:9 *177:12 0.539107
+8 *177:9 *177:4 11.0469
+9 *219:QN *177:4 273.106
+10 *177:5 *177:7 0.557028
+11 *177:3 *177:5 1.21956
+12 *243:A *177:3 9.24915
+*END
+
+*D_NET *178 0.00320953
+
+*CONN
+*I *244:A I *C 62.63 63.64 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *186:Y O *C 82.33 58.83 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *186:Y 4.445e-05
+2 *178:2 0.00029465
+3 *178:3 0.00101867
+4 *178:4 9.178e-05
+5 *178:5 9.04e-05
+6 *178:7 0.00146334
+7 *178:9 0.00018839
+8 *178:10 1.785e-05
+
+*RES
+1 *178:10 *178:3 3.95933
+2 *178:7 *178:3 8.20874
+3 *178:7 *178:8 3.7952
+4 *178:4 *178:8 0.539107
+5 *178:4 *178:5 0.445809
+6 *244:A *178:5 9.24915
+7 *178:9 *178:10 4.47566
+8 *178:9 *178:2 10.4062
+9 *178:2 *178:6 234.801
+10 *186:Y *178:6 22.6999
+*END
+
diff --git a/sky130_cds/pnr/SPEF/mult_seq_iqrc.spef b/sky130_cds/pnr/SPEF/mult_seq_iqrc.spef
new file mode 100755
index 000000000..5013d99e5
--- /dev/null
+++ b/sky130_cds/pnr/SPEF/mult_seq_iqrc.spef
@@ -0,0 +1,5599 @@
+*SPEF "IEEE 1481-1998"
+*DESIGN "mult_seq"
+*DATE "Mon Aug  1 10:19:22 2022"
+*VENDOR "Cadence Design Systems, Inc."
+*PROGRAM "Innovus"
+*VERSION "19.18-s072_1"
+*DESIGN_FLOW "COUPLING C" "PIN_CAP NONE" "NAME_SCOPE LOCAL"
+*DIVIDER /
+*DELIMITER :
+*BUS_DELIMITER []
+*T_UNIT 1 NS
+*C_UNIT 1 PF
+*R_UNIT 1 OHM
+*L_UNIT 1 HENRY
+
+// MMMC spef file for corner 'rc_typ'
+
+*NAME_MAP
+
+*1 a[3]
+*2 a[2]
+*3 a[1]
+*4 a[0]
+*5 b[3]
+*6 b[2]
+*7 b[1]
+*8 b[0]
+*9 clk
+*10 reset
+*11 en
+*12 sum_q[7]
+*13 sum_q[6]
+*14 sum_q[5]
+*15 sum_q[4]
+*16 sum_q[3]
+*17 sum_q[2]
+*18 sum_q[1]
+*19 sum_q[0]
+*20 FE_PHN22_sum_q_7
+*21 FE_PHN21_sum_q_2
+*22 FE_PHN10_sum_q_5
+*23 FE_PHN9_sum_q_6
+*24 FE_PHN1_sum_q_1
+*25 sum[7]
+*26 sum[6]
+*27 sum[5]
+*28 sum[4]
+*29 sum[3]
+*30 sum[2]
+*31 sum[1]
+*32 sum[0]
+*33 csa_tree_add1_add_30_16_groupi_n_0
+*34 csa_tree_add1_add_30_16_groupi_n_1
+*35 csa_tree_add1_add_30_16_groupi_n_4
+*36 csa_tree_add1_add_30_16_groupi_n_5
+*37 csa_tree_add1_add_30_16_groupi_n_6
+*38 csa_tree_add1_add_30_16_groupi_n_7
+*39 csa_tree_add1_add_30_16_groupi_n_8
+*40 csa_tree_add1_add_30_16_groupi_n_9
+*41 csa_tree_add1_add_30_16_groupi_n_10
+*42 csa_tree_add1_add_30_16_groupi_n_11
+*43 csa_tree_add1_add_30_16_groupi_n_12
+*44 csa_tree_add1_add_30_16_groupi_n_13
+*45 csa_tree_add1_add_30_16_groupi_n_14
+*46 csa_tree_add1_add_30_16_groupi_n_15
+*47 csa_tree_add1_add_30_16_groupi_n_16
+*48 csa_tree_add1_add_30_16_groupi_n_17
+*49 csa_tree_add1_add_30_16_groupi_n_18
+*50 csa_tree_add1_add_30_16_groupi_n_19
+*51 csa_tree_add1_add_30_16_groupi_n_20
+*52 csa_tree_add1_add_30_16_groupi_n_21
+*53 csa_tree_add1_add_30_16_groupi_n_23
+*54 csa_tree_add1_add_30_16_groupi_n_24
+*55 csa_tree_add1_add_30_16_groupi_n_25
+*56 csa_tree_add1_add_30_16_groupi_n_26
+*57 csa_tree_add1_add_30_16_groupi_n_27
+*58 csa_tree_add1_add_30_16_groupi_n_28
+*59 csa_tree_add1_add_30_16_groupi_n_30
+*60 csa_tree_add1_add_30_16_groupi_n_31
+*61 csa_tree_add1_add_30_16_groupi_n_32
+*62 csa_tree_add1_add_30_16_groupi_n_33
+*63 csa_tree_add1_add_30_16_groupi_n_34
+*64 csa_tree_add1_add_30_16_groupi_n_35
+*65 csa_tree_add1_add_30_16_groupi_n_36
+*66 csa_tree_add1_add_30_16_groupi_n_39
+*67 csa_tree_add1_add_30_16_groupi_n_40
+*68 csa_tree_add1_add_30_16_groupi_n_41
+*69 csa_tree_add1_add_30_16_groupi_n_42
+*70 csa_tree_add1_add_30_16_groupi_n_43
+*71 csa_tree_add1_add_30_16_groupi_n_44
+*72 csa_tree_add1_add_30_16_groupi_n_45
+*73 csa_tree_add1_add_30_16_groupi_n_46
+*74 csa_tree_add1_add_30_16_groupi_n_47
+*75 csa_tree_add1_add_30_16_groupi_n_48
+*76 csa_tree_add1_add_30_16_groupi_n_49
+*77 csa_tree_add1_add_30_16_groupi_n_50
+*78 csa_tree_add1_add_30_16_groupi_n_52
+*79 csa_tree_add1_add_30_16_groupi_n_53
+*80 csa_tree_add1_add_30_16_groupi_n_54
+*81 csa_tree_add1_add_30_16_groupi_n_55
+*82 csa_tree_add1_add_30_16_groupi_n_56
+*83 csa_tree_add1_add_30_16_groupi_n_57
+*84 csa_tree_add1_add_30_16_groupi_n_59
+*85 csa_tree_add1_add_30_16_groupi_n_60
+*86 csa_tree_add1_add_30_16_groupi_n_62
+*87 csa_tree_add1_add_30_16_groupi_n_63
+*88 csa_tree_add1_add_30_16_groupi_n_64
+*89 csa_tree_add1_add_30_16_groupi_n_65
+*90 csa_tree_add1_add_30_16_groupi_n_66
+*91 csa_tree_add1_add_30_16_groupi_n_68
+*92 csa_tree_add1_add_30_16_groupi_n_69
+*93 csa_tree_add1_add_30_16_groupi_n_70
+*94 csa_tree_add1_add_30_16_groupi_n_71
+*95 csa_tree_add1_add_30_16_groupi_n_72
+*96 csa_tree_add1_add_30_16_groupi_n_73
+*97 csa_tree_add1_add_30_16_groupi_n_74
+*98 csa_tree_add1_add_30_16_groupi_n_75
+*99 csa_tree_add1_add_30_16_groupi_n_76
+*100 csa_tree_add1_add_30_16_groupi_n_77
+*101 csa_tree_add1_add_30_16_groupi_n_78
+*102 csa_tree_add1_add_30_16_groupi_n_79
+*103 csa_tree_add1_add_30_16_groupi_n_80
+*104 csa_tree_add1_add_30_16_groupi_n_81
+*105 csa_tree_add1_add_30_16_groupi_n_82
+*106 csa_tree_add1_add_30_16_groupi_n_84
+*107 csa_tree_add1_add_30_16_groupi_n_85
+*108 csa_tree_add1_add_30_16_groupi_n_87
+*109 csa_tree_add1_add_30_16_groupi_n_89
+*110 csa_tree_add1_add_30_16_groupi_n_91
+*111 csa_tree_add1_add_30_16_groupi_n_93
+*112 n_111
+*113 n_112
+*114 n_113
+*115 n_114
+*116 reg1/FE_PHN39_sum_q_7
+*117 reg1/FE_PHN38_sum_q_1
+*118 reg1/FE_PHN37_n_4
+*119 reg1/FE_PHN36_q_0_58
+*120 reg1/FE_PHN35_sum_q_1
+*121 reg1/FE_PHN34_sum_q_6
+*122 reg1/FE_PHN33_sum_q_5
+*123 reg1/FE_PHN32_q_4_62
+*124 reg1/FE_PHN31_n_7
+*125 reg1/FE_PHN30_sum_q_6
+*126 reg1/FE_PHN29_n_9
+*127 reg1/FE_PHN28_sum_q_7
+*128 reg1/FE_PHN27_sum_q_5
+*129 reg1/FE_PHN26_n_10
+*130 reg1/FE_PHN25_sum_q_3
+*131 reg1/FE_PHN24_n_9
+*132 reg1/FE_PHN23_n_7
+*133 reg1/FE_PHN20_sum_q_6
+*134 reg1/FE_PHN19_n_10
+*135 reg1/FE_PHN18_sum_q_5
+*136 reg1/FE_PHN17_sum_q_4
+*137 reg1/FE_PHN16_sum_q_3
+*138 reg1/FE_PHN15_n_18
+*139 reg1/FE_PHN14_n_11
+*140 reg1/FE_PHN13_n_9
+*141 reg1/FE_PHN12_n_4
+*142 reg1/FE_PHN11_n_7
+*143 reg1/FE_PHN8_q_0_58
+*144 reg1/FE_PHN7_n_18
+*145 reg1/FE_PHN6_n_4
+*146 reg1/FE_PHN5_n_5
+*147 reg1/FE_PHN4_n_6
+*148 reg1/FE_PHN3_n_9
+*149 reg1/FE_PHN2_n_11
+*150 reg1/FE_PHN0_q_0_58
+*151 reg1/UNCONNECTED
+*152 reg1/UNCONNECTED0
+*153 reg1/UNCONNECTED1
+*154 reg1/UNCONNECTED2
+*155 reg1/UNCONNECTED3
+*156 reg1/UNCONNECTED4
+*157 reg1/UNCONNECTED5
+*158 reg1/UNCONNECTED6
+*159 reg1/n_0
+*160 reg1/n_4
+*161 reg1/n_5
+*162 reg1/n_6
+*163 reg1/n_7
+*164 reg1/n_8
+*165 reg1/n_9
+*166 reg1/n_10
+*167 reg1/n_11
+*168 reg1/n_12
+*169 reg1/n_13
+*170 reg1/n_14
+*171 reg1/n_15
+*172 reg1/n_16
+*173 reg1/n_17
+*174 reg1/n_18
+*175 reg1/n_19
+*176 reg1/q\[0\]_58
+*177 reg1/q\[3\]_61
+*178 reg1/q\[4\]_62
+*179 reg1/FE_PHC39_sum_q_7
+*180 reg1/FE_PHC38_sum_q_1
+*181 reg1/FE_PHC37_n_4
+*182 reg1/FE_PHC36_q_0_58
+*183 reg1/FE_PHC35_sum_q_1
+*184 reg1/FE_PHC34_sum_q_6
+*185 reg1/FE_PHC33_sum_q_5
+*186 reg1/FE_PHC32_q_4_62
+*187 reg1/FE_PHC31_n_7
+*188 reg1/FE_PHC30_sum_q_6
+*189 reg1/FE_PHC29_n_9
+*190 reg1/FE_PHC28_sum_q_7
+*191 reg1/FE_PHC27_sum_q_5
+*192 reg1/FE_PHC26_n_10
+*193 reg1/FE_PHC25_sum_q_3
+*194 reg1/FE_PHC24_n_9
+*195 reg1/FE_PHC23_n_7
+*196 reg1/FE_PHC22_sum_q_7
+*197 reg1/FE_PHC21_sum_q_2
+*198 reg1/FE_PHC20_sum_q_6
+*199 reg1/FE_PHC19_n_10
+*200 reg1/FE_PHC18_sum_q_5
+*201 reg1/FE_PHC17_sum_q_4
+*202 reg1/FE_PHC16_sum_q_3
+*203 reg1/FE_PHC15_n_18
+*204 reg1/FE_PHC14_n_11
+*205 reg1/FE_PHC13_n_9
+*206 reg1/FE_PHC12_n_4
+*207 reg1/FE_PHC11_n_7
+*208 reg1/FE_PHC10_sum_q_5
+*209 reg1/FE_PHC9_sum_q_6
+*210 reg1/FE_PHC8_q_0_58
+*211 reg1/FE_PHC7_n_18
+*212 reg1/FE_PHC6_n_4
+*213 reg1/FE_PHC5_n_5
+*214 reg1/FE_PHC4_n_6
+*215 reg1/FE_PHC3_n_9
+*216 reg1/FE_PHC2_n_11
+*217 reg1/FE_PHC1_sum_q_1
+*218 reg1/FE_PHC0_q_0_58
+*219 reg1/q_reg\[3\]
+*220 reg1/q_reg\[2\]
+*221 reg1/q_reg\[0\]
+*222 reg1/q_reg\[4\]
+*223 reg1/q_reg\[6\]
+*224 reg1/q_reg\[5\]
+*225 reg1/q_reg\[1\]
+*226 reg1/q_reg\[7\]
+*227 reg1/g27__2398
+*228 reg1/g28__5107
+*229 reg1/g29__6260
+*230 reg1/g30__4319
+*231 reg1/g31__8428
+*232 reg1/g32__5526
+*233 reg1/g33__6783
+*234 reg1/g34__3680
+*235 reg1/g35__1617
+*236 reg1/g36__2802
+*237 reg1/g37__1705
+*238 reg1/g38__5122
+*239 reg1/g39__8246
+*240 reg1/g40__7098
+*241 reg1/g41__6131
+*242 reg1/g42__1881
+*243 reg1/g43
+*244 reg1/g44
+*245 reg1/g45
+*246 reg1/g46
+*247 csa_tree_add1_add_30_16_groupi_g417__5115
+*248 csa_tree_add1_add_30_16_groupi_g418__7482
+*249 csa_tree_add1_add_30_16_groupi_g419__4733
+*250 csa_tree_add1_add_30_16_groupi_g420__6161
+*251 csa_tree_add1_add_30_16_groupi_g421__9315
+*252 csa_tree_add1_add_30_16_groupi_g422__9945
+*253 csa_tree_add1_add_30_16_groupi_g423__2883
+*254 csa_tree_add1_add_30_16_groupi_g424__2346
+*255 csa_tree_add1_add_30_16_groupi_g425__1666
+*256 csa_tree_add1_add_30_16_groupi_g426__7410
+*257 csa_tree_add1_add_30_16_groupi_g427__6417
+*258 csa_tree_add1_add_30_16_groupi_g428__5477
+*259 csa_tree_add1_add_30_16_groupi_g429__2398
+*260 csa_tree_add1_add_30_16_groupi_g430__5107
+*261 csa_tree_add1_add_30_16_groupi_g431__6260
+*262 csa_tree_add1_add_30_16_groupi_g432__4319
+*263 csa_tree_add1_add_30_16_groupi_g433__8428
+*264 csa_tree_add1_add_30_16_groupi_g434__5526
+*265 csa_tree_add1_add_30_16_groupi_g435__6783
+*266 csa_tree_add1_add_30_16_groupi_g436__3680
+*267 csa_tree_add1_add_30_16_groupi_g437__1617
+*268 csa_tree_add1_add_30_16_groupi_g438__2802
+*269 csa_tree_add1_add_30_16_groupi_g439__1705
+*270 csa_tree_add1_add_30_16_groupi_g440__5122
+*271 csa_tree_add1_add_30_16_groupi_g441__8246
+*272 csa_tree_add1_add_30_16_groupi_g442__7098
+*273 csa_tree_add1_add_30_16_groupi_g443__6131
+*274 csa_tree_add1_add_30_16_groupi_g445__5115
+*275 csa_tree_add1_add_30_16_groupi_g446__7482
+*276 csa_tree_add1_add_30_16_groupi_g447__4733
+*277 csa_tree_add1_add_30_16_groupi_g448__6161
+*278 csa_tree_add1_add_30_16_groupi_g449__9315
+*279 csa_tree_add1_add_30_16_groupi_g450__9945
+*280 csa_tree_add1_add_30_16_groupi_g451__2883
+*281 csa_tree_add1_add_30_16_groupi_g452__2346
+*282 csa_tree_add1_add_30_16_groupi_g454__7410
+*283 csa_tree_add1_add_30_16_groupi_g455__6417
+*284 csa_tree_add1_add_30_16_groupi_g456__5477
+*285 csa_tree_add1_add_30_16_groupi_g457__2398
+*286 csa_tree_add1_add_30_16_groupi_g458__5107
+*287 csa_tree_add1_add_30_16_groupi_g459__6260
+*288 csa_tree_add1_add_30_16_groupi_g461__8428
+*289 csa_tree_add1_add_30_16_groupi_g462__5526
+*290 csa_tree_add1_add_30_16_groupi_g463__6783
+*291 csa_tree_add1_add_30_16_groupi_g464__3680
+*292 csa_tree_add1_add_30_16_groupi_g465__1617
+*293 csa_tree_add1_add_30_16_groupi_g466__2802
+*294 csa_tree_add1_add_30_16_groupi_g467__1705
+*295 csa_tree_add1_add_30_16_groupi_g468__5122
+*296 csa_tree_add1_add_30_16_groupi_g469__8246
+*297 csa_tree_add1_add_30_16_groupi_g470__7098
+*298 csa_tree_add1_add_30_16_groupi_g471__6131
+*299 csa_tree_add1_add_30_16_groupi_g472__1881
+*300 csa_tree_add1_add_30_16_groupi_g474__5115
+*301 csa_tree_add1_add_30_16_groupi_g475__7482
+*302 csa_tree_add1_add_30_16_groupi_g476__4733
+*303 csa_tree_add1_add_30_16_groupi_g477__6161
+*304 csa_tree_add1_add_30_16_groupi_g478__9315
+*305 csa_tree_add1_add_30_16_groupi_g479__9945
+*306 csa_tree_add1_add_30_16_groupi_g480__2883
+*307 csa_tree_add1_add_30_16_groupi_g481__2346
+*308 csa_tree_add1_add_30_16_groupi_g483
+*309 csa_tree_add1_add_30_16_groupi_g484__1666
+*310 csa_tree_add1_add_30_16_groupi_g485__7410
+*311 csa_tree_add1_add_30_16_groupi_g486__6417
+*312 csa_tree_add1_add_30_16_groupi_g487__5477
+*313 csa_tree_add1_add_30_16_groupi_g488__2398
+*314 csa_tree_add1_add_30_16_groupi_g490__5107
+*315 csa_tree_add1_add_30_16_groupi_g491__6260
+*316 csa_tree_add1_add_30_16_groupi_g492__4319
+*317 csa_tree_add1_add_30_16_groupi_g493__8428
+*318 csa_tree_add1_add_30_16_groupi_g494__5526
+*319 csa_tree_add1_add_30_16_groupi_g495__6783
+*320 csa_tree_add1_add_30_16_groupi_g496__3680
+*321 csa_tree_add1_add_30_16_groupi_g497__1617
+*322 csa_tree_add1_add_30_16_groupi_g498__2802
+*323 csa_tree_add1_add_30_16_groupi_g499__1705
+*324 csa_tree_add1_add_30_16_groupi_g500__5122
+*325 csa_tree_add1_add_30_16_groupi_g501__8246
+*326 csa_tree_add1_add_30_16_groupi_g502__7098
+*327 csa_tree_add1_add_30_16_groupi_g503__6131
+*328 csa_tree_add1_add_30_16_groupi_g504__1881
+*329 csa_tree_add1_add_30_16_groupi_g505__5115
+*330 csa_tree_add1_add_30_16_groupi_g506__7482
+*331 csa_tree_add1_add_30_16_groupi_g507__4733
+*332 csa_tree_add1_add_30_16_groupi_g510
+*333 csa_tree_add1_add_30_16_groupi_g513
+*334 g2
+*335 g3
+*336 g515
+*337 g516
+
+
+*PORTS
+
+*1 I *C 78.48 0
+*2 I *C 73.2 0
+*3 I *C 68.88 0
+*4 I *C 71.28 0
+*5 I *C 76.56 0
+*6 I *C 74.16 0
+*7 I *C 68.505 0
+*8 I *C 72.24 0
+*9 I *C 64.56 133.94
+*10 I *C 68.4 133.94
+*11 I *C 70.8 133.94
+*12 O *C 86.16 133.94
+*13 O *C 142.08 72.35
+*14 O *C 142.08 63.2
+*15 O *C 0 64.42
+*16 O *C 0 63.2
+*17 O *C 56.4 133.94
+*18 O *C 61.2 133.94
+*19 O *C 76.56 133.94
+
+
+*D_NET *1 0.00984947
+
+*CONN
+*P *1 I *C 78.48 0 *L 0
+*I *330:B I *C 87.79 57.35 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+*I *328:B I *C 79.91 44.03 *L 0.0042 *D sky130_osu_sc_18T_ms__nand2_l
+*I *327:B I *C 79.8 49.95 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *320:B I *C 87.19 44.03 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *1 0.00010128
+2 *320:B 0.00013166
+3 *1:5 6.826e-05
+4 *1:6 0.00111838
+5 *1:7 0.00372913
+6 *1:8 0.00016144
+7 *1:9 4.009e-05
+8 *1:10 0.00059262
+9 *1:11 0.00014441
+10 *1:12 0.00029726
+11 *1:14 3.054e-05
+12 *1:15 0.00039177
+13 *1:16 1.466e-05
+14 *1:17 0.00035815
+15 *1:19 0.00024806
+16 *1:21 5.089e-05
+17 *1:22 0.00026071
+18 *1:24 0.00064706
+19 *1:5 *5:5 0.00054368
+20 *1:10 *22:3 0.00050129
+21 *1:12 *174:2 0.00041813
+
+*RES
+1 *1:18 *1:21 0.579785
+2 *330:B *1:21 9.24915
+3 *1:17 *1:18 7.18274
+4 *1:17 *1:20 0.246796
+5 *1:19 *1:20 3.59549
+6 *1:16 *1:19 0.264717
+7 *1:15 *1:16 3.57757
+8 *1:15 *1:23 1.12373
+9 *1:22 *1:23 1.79775
+10 *1:9 *1:22 9.24915
+11 *320:B *1:9 97.5378
+12 *1:24 *1:22 5.6449
+13 *1:24 *1:11 8.77436
+14 *1:11 *1:6 11.6742
+15 *1:7 *1:6 40.328
+16 *1 *1:7 1.14649
+17 *1:11 *1:12 1.03078
+18 *1:12 *1:13 2.80991
+19 *1:10 *1:13 1.12373
+20 *1:10 *1:5 13.3001
+21 *1:5 *1:8 30.7844
+22 *1:8 *327:B 78.3264
+23 *1:12 *1:14 0.415709
+24 *328:B *1:14 9.24915
+*END
+
+*D_NET *2 0.00903774
+
+*CONN
+*P *2 I *C 73.2 0 *L 0
+*I *329:B I *C 71.28 49.95 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+*I *324:B I *C 73.31 44.03 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *323:B I *C 86.2 49.95 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *322:B I *C 86.24 44.03 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+
+*CAP
+1 *2 0.00309042
+2 *329:B 0.00019812
+3 *322:B 1.941e-05
+4 *2:5 0.00088063
+5 *2:6 0.00017847
+6 *2:7 0.00010427
+7 *2:9 0.00104977
+8 *2:11 3.544e-05
+9 *2:12 0.00012994
+10 *2:13 7.234e-05
+11 *2:14 1.504e-05
+12 *2:15 5e-05
+13 *2:16 0.00056289
+14 *2:17 0.00051637
+15 *2:18 3.517e-05
+16 *2:19 0.00015826
+17 *2:21 0.000207
+18 *2:5 *6:5 0.00091472
+19 *2:5 *8:5 0.00081948
+
+*RES
+1 *2:17 *2:18 4.47886
+2 *2:18 *2:21 0.264717
+3 *2:21 *2:13 10.1456
+4 *2:13 *2:14 30.7844
+5 *2:14 *2:15 10.2022
+6 *2:15 *323:B 21.8451
+7 *2:17 *2:20 0.246796
+8 *2:19 *2:20 0.896455
+9 *322:B *2:19 9.24915
+10 *2:12 *322:B 116.986
+11 *2:11 *2:12 90.8738
+12 *2:9 *2:11 781.723
+13 *2:9 *2:10 29.9563
+14 *2:6 *2:10 157.481
+15 *2:6 *324:B 52.3676
+16 *324:B *2:16 9.24915
+17 *2:16 *2:5 12.8434
+18 *2 *2:5 40.3328
+19 *2:16 *2:7 16.0088
+20 *2:7 *2:8 30.0152
+21 *329:B *2:8 156.771
+*END
+
+*D_NET *3 0.00937797
+
+*CONN
+*P *3 I *C 68.88 0 *L 0
+*I *331:B I *C 70.34 57.35 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *326:B I *C 73.2 57.35 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *321:A I *C 69.12 43.66 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *317:B I *C 77.51 44.03 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *3 0.00303573
+2 *331:B 0.00011648
+3 *3:5 0.00075859
+4 *3:6 0.00020036
+5 *3:7 0.00054777
+6 *3:8 0.00023989
+7 *3:9 0.00016093
+8 *3:10 0.00071647
+9 *3:11 7.955e-05
+10 *3:12 8.43e-05
+11 *3:13 2.959e-05
+12 *3:14 6.846e-05
+13 *3:15 0.00088305
+14 *3:16 3.763e-05
+15 *3:17 9.3e-07
+16 *3:5 *4:5 0.00076825
+17 *3:5 *7:5 0.00164999
+
+*RES
+1 *331:B *3:17 9.24915
+2 *3:16 *3:17 0.579785
+3 *3:15 *3:16 8.98532
+4 *3:14 *3:15 0.557028
+5 *3:13 *3:14 0.423052
+6 *3:12 *3:13 0.557028
+7 *3:10 *3:12 7.18757
+8 *321:A *3:10 9.24915
+9 *3:8 *3:10 0.718597
+10 *3:8 *3:5 11.6742
+11 *3 *3:5 40.3328
+12 *3:8 *3:7 5.49377
+13 *3:9 *3:7 7.53
+14 *3:9 *3:11 1.16924
+15 *317:B *3:11 9.24915
+16 *331:B *3:6 58.5227
+17 *326:B *3:6 175.568
+*END
+
+*D_NET *4 0.0101882
+
+*CONN
+*P *4 I *C 71.28 0 *L 0
+*I *325:B I *C 67.26 44.03 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *319:B I *C 77.4 49.95 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *318:A I *C 67.95 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *316:B I *C 75.31 57.35 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *4 0.00032553
+2 *4:5 0.00357611
+3 *4:6 0.00101625
+4 *4:7 0.0002547
+5 *4:8 0.0003342
+6 *4:9 0.00066113
+7 *4:10 0.00019753
+8 *4:11 7.15e-06
+9 *4:12 7.68e-05
+10 *4:13 0.0001044
+11 *4:14 0.00018371
+12 *4:15 0.00039052
+13 *4:16 9.023e-05
+14 *4:17 0.00011472
+15 *4:18 0.00011308
+16 *4:19 0.00011015
+17 *4:20 0.00124037
+18 *4:21 2.603e-05
+19 *4:22 2.665e-05
+20 *4:23 0.00057071
+21 *4:5 *3:5 0.00076825
+
+*RES
+1 *4 *4:12 4.05581
+2 *4:12 *4:11 28.7567
+3 *4:5 *4:11 331.628
+4 *4:6 *4:5 45.5261
+5 *4:7 *4:6 12.8251
+6 *325:B *4:7 9.24915
+7 *4:7 *4:13 2.24874
+8 *4:13 *4:15 0.557028
+9 *4:15 *4:16 3.57757
+10 *4:16 *4:18 0.557028
+11 *4:18 *4:20 1.14005
+12 *4:20 *4:9 5.94627
+13 *4:17 *4:9 7.53
+14 *4:17 *4:19 0.078453
+15 *319:B *4:19 9.24915
+16 *4:20 *4:22 8.76932
+17 *318:A *4:22 9.24915
+18 *4:22 *4:23 0.066795
+19 *4:23 *4:8 5.94627
+20 *4:21 *4:8 1.47061
+21 *4:14 *4:21 4.47566
+22 *4:14 *4:10 9.37675
+23 *4:10 *316:B 117.045
+*END
+
+*D_NET *5 0.0092481
+
+*CONN
+*P *5 I *C 76.56 0 *L 0
+*I *330:A I *C 87.31 56.98 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *323:A I *C 87.16 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *319:A I *C 78.36 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *317:A I *C 78.47 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *5 0.00340001
+2 *5:5 0.00010014
+3 *5:6 0.00094953
+4 *5:7 0.00010313
+5 *5:8 6.402e-05
+6 *5:9 1.989e-05
+7 *5:10 0.00020645
+8 *5:11 0.00035737
+9 *5:12 5.183e-05
+10 *5:13 0.00020637
+11 *5:15 0.00011395
+12 *5:16 3.375e-05
+13 *5:17 3.405e-05
+14 *5:18 9.647e-05
+15 *5:19 0.00010442
+16 *5:20 0.00022941
+17 *5:22 0.00043749
+18 *5:24 0.00031904
+19 *5:26 0.00010172
+20 *5:27 0.00108498
+21 *5:5 *1:5 0.00054368
+22 *5:6 *6:5 0.0006904
+
+*RES
+1 *5 *5:6 40.3328
+2 *5:10 *5:6 11.0181
+3 *5:10 *5:19 2.31089
+4 *5:19 *5:20 1.3471
+5 *317:A *5:20 9.24915
+6 *5:20 *5:21 1.3471
+7 *5:13 *5:21 0.539107
+8 *5:13 *5:14 0.891619
+9 *5:11 *5:14 0.539107
+10 *5:11 *5:12 3.12693
+11 *5:12 *5:15 0.557028
+12 *5:15 *5:5 1.29838
+13 *5:27 *5:5 8.77436
+14 *5:27 *5:24 5.87631
+15 *323:A *5:24 9.24915
+16 *5:24 *5:25 0.896455
+17 *5:22 *5:25 0.246796
+18 *5:22 *5:23 5.38015
+19 *5:23 *5:26 0.264717
+20 *5:26 *5:9 10.1456
+21 *5:7 *5:9 39.7254
+22 *5:7 *5:8 60.7996
+23 *5:8 *330:A 49.1666
+24 *5:5 *5:16 0.927253
+25 *5:16 *5:17 0.264717
+26 *5:17 *5:18 0.445809
+27 *319:A *5:18 9.24915
+*END
+
+*D_NET *6 0.00759987
+
+*CONN
+*P *6 I *C 74.16 0 *L 0
+*I *325:A I *C 66.3 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *322:A I *C 86.72 43.66 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *321:B I *C 68.64 44.03 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+*I *320:A I *C 88.15 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *6 7.683e-05
+2 *325:A 0.00019339
+3 *322:A 0.00011539
+4 *6:5 0.0006599
+5 *6:6 0.00306792
+6 *6:7 0.00013014
+7 *6:8 0.00089542
+8 *6:9 0.00025027
+9 *6:10 5.587e-05
+10 *6:11 0.00043553
+11 *6:12 7.788e-05
+12 *6:13 3.621e-05
+13 *6:5 *2:5 0.00091472
+14 *6:5 *5:6 0.0006904
+
+*RES
+1 *6 *6:10 0.878534
+2 *6:10 *6:6 0.557028
+3 *6:6 *6:5 39.4267
+4 *6:14 *6:5 9.68405
+5 *6:7 *6:14 0.539107
+6 *6:7 *6:8 10.1456
+7 *6:8 *6:12 1015.1
+8 *6:12 *322:A 112.516
+9 *322:A *320:A 117.045
+10 *6:8 *6:9 253.598
+11 *6:11 *6:9 215.293
+12 *6:11 *6:13 120.948
+13 *325:A *6:13 156.771
+14 *6:13 *321:B 22.4964
+*END
+
+*D_NET *7 0.00904041
+
+*CONN
+*P *7 I *C 68.505 0 *L 0
+*I *331:A I *C 69.38 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *329:A I *C 71.76 50.32 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *328:A I *C 78.95 43.66 *L 0.00422 *D sky130_osu_sc_18T_ms__nand2_l
+*I *318:B I *C 68.91 57.35 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *7 0.0026345
+2 *331:A 0.00014087
+3 *329:A 1.928e-05
+4 *7:5 0.00039731
+5 *7:6 0.00018057
+6 *7:7 1.001e-05
+7 *7:8 0.00014362
+8 *7:9 0.00034113
+9 *7:10 0.00085883
+10 *7:11 0.00033396
+11 *7:12 1.55e-05
+12 *7:13 2.776e-05
+13 *7:14 0.00013612
+14 *7:15 9.86e-05
+15 *7:16 0.00012903
+16 *7:19 3.011e-05
+17 *7:20 7.68e-05
+18 *7:21 4.01e-05
+19 *7:22 0.00066746
+20 *7:23 0.00018406
+21 *7:25 0.00015986
+22 *7:26 0.00017878
+23 *7:27 0.00046994
+24 *7:29 0.00011622
+25 *7:5 *3:5 0.00164999
+
+*RES
+1 *7:18 *7:7 59.233
+2 *331:A *7:7 136.553
+3 *331:A *7:16 9.24915
+4 *7:16 *7:17 0.445809
+5 *7:14 *7:17 0.561864
+6 *318:B *7:14 9.24915
+7 *7:8 *7:18 29.9563
+8 *7:8 *7:21 78.7405
+9 *7:26 *7:21 10.5962
+10 *7:26 *7:28 0.539107
+11 *7:27 *7:28 4.94743
+12 *7:25 *7:27 0.557028
+13 *7:25 *7:19 10.1277
+14 *7:15 *7:19 77.9713
+15 *329:A *7:15 23.4691
+16 *7:13 *7:15 39.7254
+17 *7:22 *7:13 14.6521
+18 *7:22 *7:12 0.269553
+19 *7:20 *7:12 0.872096
+20 *7:9 *7:20 4.02822
+21 *7:9 *7:6 0.539107
+22 *7:24 *7:6 5.77404
+23 *7:23 *7:24 1.08175
+24 *7:23 *7:5 4.77394
+25 *7 *7:5 5.55761
+26 *7:24 *7:10 0.113124
+27 *7:11 *7:10 8.20874
+28 *7:11 *7:29 2.20451
+29 *328:A *7:29 9.24915
+*END
+
+*D_NET *8 0.00903985
+
+*CONN
+*P *8 I *C 72.24 0 *L 0
+*I *327:A I *C 78.84 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *326:A I *C 72.24 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *324:A I *C 72.35 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *316:A I *C 76.27 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *8 0.00031763
+2 *326:A 0.00045165
+3 *316:A 2.457e-05
+4 *8:5 0.00315648
+5 *8:6 0.00102299
+6 *8:7 0.00030752
+7 *8:9 6.816e-05
+8 *8:10 8.873e-05
+9 *8:11 0.00014926
+10 *8:12 5.67e-05
+11 *8:13 0.00047711
+12 *8:14 4.709e-05
+13 *8:15 0.00076847
+14 *8:17 0.00014132
+15 *8:18 0.0007816
+16 *8:19 0.00036109
+17 *8:5 *2:5 0.00081948
+
+*RES
+1 *8:13 *8:14 4.92951
+2 *8:14 *8:17 0.557028
+3 *8:19 *8:17 5.38429
+4 *8:19 *8:11 5.83314
+5 *8:11 *8:12 1.33976
+6 *316:A *8:12 9.24915
+7 *326:A *316:A 312.121
+8 *8:13 *8:16 0.539107
+9 *8:15 *8:16 0.896455
+10 *8:18 *8:15 8.84814
+11 *8:18 *8:10 7.86937
+12 *8:7 *8:10 3.73914
+13 *8:9 *8:7 9.24915
+14 *8:9 *324:A 58.5227
+15 *8:7 *8:6 12.3928
+16 *8:5 *8:6 35.3708
+17 *8:5 *8:8 0.539107
+18 *8 *8:8 4.95227
+19 *327:A *8:15 9.24915
+*END
+
+*D_NET *9 0.0174329
+
+*CONN
+*P *9 I *C 64.56 133.94 *L 0
+*I *226:CK I *C 93.81 89.54 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *225:CK I *C 68.78 89.54 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *224:CK I *C 76.32 71.04 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *223:CK I *C 84.79 76.22 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *222:CK I *C 68.73 62.9 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *221:CK I *C 73.57 89.54 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *220:CK I *C 57.23 89.54 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *219:CK I *C 57.23 76.22 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *9:9 0.00035691
+2 *9:10 3.452e-05
+3 *9:11 0.00056973
+4 *9:12 0.00105643
+5 *9:13 0.00033982
+6 *9:14 2.725e-05
+7 *9:15 0.00179441
+8 *9:16 6.083e-05
+9 *9:17 4.715e-05
+10 *9:18 0.00010063
+11 *9:19 0.00021158
+12 *9:20 0.00071554
+13 *9:21 0.00013867
+14 *9:22 0.0026629
+15 *9:23 6.828e-05
+16 *9:24 7.402e-05
+17 *9:25 1.408e-05
+18 *9:26 4.503e-05
+19 *9:27 5.756e-05
+20 *9:28 0.00014729
+21 *9:29 7.094e-05
+22 *9:30 0.00025455
+23 *9:31 3.297e-05
+24 *9:32 8.509e-05
+25 *9:33 6.867e-05
+26 *9:34 3.403e-05
+27 *9:35 2.599e-05
+28 *9:36 6.635e-05
+29 *9:37 0.00057656
+30 *9:38 6.131e-05
+31 *9:39 0.00010575
+32 *9:40 2.568e-05
+33 *9:41 3.52e-05
+34 *9:42 4.963e-05
+35 *9:43 6.721e-05
+36 *9:44 0.00069783
+37 *9:45 8.326e-05
+38 *9:46 0.00056751
+39 *9:47 0.00123696
+40 *9:48 0.00108428
+41 *9:49 0.00067808
+42 *9:50 0.00031182
+43 *9:13 *11:16 0.00064427
+44 *9:9 *50:5 0.00040065
+45 *9:9 *119:13 0.0005611
+46 *9:13 *132:5 0.00040608
+47 *9:16 *159:17 0.00067854
+
+*RES
+1 *9:20 *9:19 3.46267
+2 *9:18 *9:19 3.36879
+3 *9:18 *9:17 4.80796
+4 *9:39 *9:17 0.204173
+5 *223:CK *9:39 9.24915
+6 *9:20 *9:12 3.62138
+7 *9:50 *9:12 1.02468
+8 *9:45 *9:50 3.36879
+9 *9:45 *9:32 4.56103
+10 *9:10 *9:32 0.0500962
+11 *224:CK *9:10 9.24915
+12 *9:50 *9:9 0.698796
+13 *9:11 *9:9 0.735752
+14 *9:11 *9:37 3.36879
+15 *9:37 *9:30 3.47708
+16 *9:30 *9:26 3.57382
+17 *9:23 *9:26 4.47566
+18 *9:23 *9:24 0.158234
+19 *222:CK *9:24 9.24915
+20 *9:12 *9:14 5.41814
+21 *9:14 *9:13 2.28369
+22 *9:46 *9:13 2.3756
+23 *9:35 *9:46 4.47566
+24 *9:35 *9:38 0.0561475
+25 *225:CK *9:38 9.24915
+26 *9:44 *9:46 4.0371
+27 *9:40 *9:44 0.0389615
+28 *9:31 *9:40 4.47566
+29 *9:31 *9:33 0.0561475
+30 *220:CK *9:33 9.24915
+31 *9:47 *9:44 3.57372
+32 *9:49 *9:47 3.5853
+33 *9:48 *9:49 3.36879
+34 *9:48 *9:22 2.05691
+35 *9:28 *9:22 8.79201
+36 *9:25 *9:28 0.115058
+37 *9:21 *9:25 4.47566
+38 *9:21 *9 1.01091
+39 *9:47 *9:42 5.41814
+40 *9:16 *9:42 0.0389615
+41 *9:27 *9:16 4.47566
+42 *9:27 *9:29 0.107191
+43 *219:CK *9:29 9.24915
+44 *9:14 *9:15 0.318161
+45 *9:34 *9:15 4.47566
+46 *9:34 *9:36 0.0561475
+47 *221:CK *9:36 9.24915
+48 *9:15 *9:41 13.9781
+49 *9:41 *9:43 0.0561475
+50 *226:CK *9:43 9.24915
+*END
+
+*D_NET *10 0.0160204
+
+*CONN
+*P *10 I *C 68.4 133.94 *L 0
+*I *234:A I *C 56.877 83.62 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *233:A I *C 87.787 70.3 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *232:A I *C 88.333 90.28 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *231:A I *C 70.737 83.62 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *230:A I *C 70.953 90.28 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *229:A I *C 54.457 70.3 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *228:A I *C 60.943 70.3 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *227:A I *C 79.427 76.96 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+
+*CAP
+1 *230:A 7.68e-06
+2 *227:A 3.904e-05
+3 *10:9 0.00042384
+4 *10:10 0.00045317
+5 *10:11 0.00026823
+6 *10:12 0.00017333
+7 *10:13 0.00376289
+8 *10:14 0.00016433
+9 *10:15 4.311e-05
+10 *10:16 0.00039186
+11 *10:17 0.00018245
+12 *10:18 0.00029032
+13 *10:20 0.0003467
+14 *10:21 7.837e-05
+15 *10:22 5.413e-05
+16 *10:23 0.00090443
+17 *10:24 0.00031333
+18 *10:25 0.0001996
+19 *10:26 3.662e-05
+20 *10:27 4.365e-05
+21 *10:28 0.00055897
+22 *10:30 0.00048394
+23 *10:31 0.00020595
+24 *10:33 6.211e-05
+25 *10:34 4.752e-05
+26 *10:35 0.00022981
+27 *10:36 0.00078545
+28 *10:37 0.00014741
+29 *10:39 0.00089186
+30 *10:40 0.00023025
+31 *10:41 0.00024462
+32 *10:42 0.00104114
+33 *10:43 0.00074738
+34 *10:44 0.00044746
+35 *10:45 0.00012913
+36 *10:48 0.00099075
+37 *10:9 *159:9 0.00059953
+
+*RES
+1 *10:33 *10:14 20.2179
+2 *10:15 *10:14 97.5378
+3 *10:12 *10:15 10.1456
+4 *10:12 *10:46 0.539107
+5 *10:44 *10:46 4.04614
+6 *10:40 *10:44 0.557028
+7 *10:40 *10:10 11.029
+8 *10:10 *10:19 351.846
+9 *10:18 *10:19 29.9563
+10 *10:18 *10:26 195.786
+11 *10:26 *10:48 9.24915
+12 *10:48 *10:25 17.8114
+13 *10:25 *10:32 156.771
+14 *10:30 *10:32 29.9563
+15 *10:30 *10:34 391.572
+16 *10:34 *10:35 30.7255
+17 *10:35 *233:A 156.002
+18 *10:26 *10:29 39.7254
+19 *227:A *10:29 22.6999
+20 *10:11 *10:33 195.786
+21 *10:28 *10:11 507.138
+22 *10:27 *10:28 30.7255
+23 *10:20 *10:27 312.831
+24 *10:36 *10:20 16.4546
+25 *10:36 *10:39 0.539107
+26 *10:39 *10:22 17.8066
+27 *10:9 *10:22 351.846
+28 *10:9 *229:A 22.4964
+29 *10:22 *10:24 30.7844
+30 *10:24 *228:A 161.691
+31 *10:17 *10:20 117.756
+32 *10:17 *234:A 52.5706
+33 *10:41 *10:11 10.5783
+34 *10:41 *10:43 0.557028
+35 *10:43 *10:45 7.20549
+36 *10:31 *10:45 9.24915
+37 *10:31 *230:A 156.06
+38 *230:A *10:16 19.5076
+39 *10:21 *10:16 488.399
+40 *10:21 *10:23 60.7996
+41 *10:23 *10:38 858.984
+42 *10:37 *10:38 60.0304
+43 *10:37 *232:A 46.9388
+44 *10:45 *10:47 1.3471
+45 *10:42 *10:47 0.539107
+46 *10:42 *10:13 11.036
+47 *10 *10:13 40.3328
+48 *10:33 *231:A 23.2268
+*END
+
+*D_NET *11 0.0184267
+
+*CONN
+*P *11 I *C 70.8 133.94 *L 0
+*I *246:A I *C 85.95 90.28 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *242:B1 I *C 87.3 84.725 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *241:B1 I *C 80.35 75.855 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *240:B1 I *C 88.71 71.405 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *239:B1 I *C 62.77 89.175 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *238:B1 I *C 55.38 71.405 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *237:B1 I *C 54.06 84.725 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *236:B1 I *C 74.3 84.725 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *235:B1 I *C 54.06 62.535 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *241:B1 0.00014531
+2 *239:B1 4.834e-05
+3 *235:B1 5.28e-05
+4 *11:10 0.0001273
+5 *11:11 0.00073758
+6 *11:12 0.00048745
+7 *11:13 5.902e-05
+8 *11:14 0.00030687
+9 *11:15 8.209e-05
+10 *11:16 0.00047672
+11 *11:17 5.144e-05
+12 *11:18 0.00026933
+13 *11:19 0.00376289
+14 *11:20 0.00031002
+15 *11:21 5.385e-05
+16 *11:22 0.00082429
+17 *11:23 0.00033576
+18 *11:24 4.866e-05
+19 *11:25 0.0001945
+20 *11:26 0.00012847
+21 *11:27 9.454e-05
+22 *11:28 0.00018075
+23 *11:29 0.00022094
+24 *11:30 0.00013743
+25 *11:31 3.513e-05
+26 *11:32 0.00019124
+27 *11:33 5.392e-05
+28 *11:34 0.00011372
+29 *11:35 7.667e-05
+30 *11:36 0.00058333
+31 *11:37 0.0005124
+32 *11:38 0.00035271
+33 *11:39 0.00015814
+34 *11:40 0.00024872
+35 *11:41 0.00055555
+36 *11:42 0.00012933
+37 *11:44 6.469e-05
+38 *11:45 0.00061712
+39 *11:46 0.00056027
+40 *11:47 3.067e-05
+41 *11:48 0.00016223
+42 *11:49 5.268e-05
+43 *11:51 0.00112481
+44 *11:52 0.00010097
+45 *11:53 0.00023224
+46 *11:54 9.705e-05
+47 *11:55 4.012e-05
+48 *11:56 0.0003994
+49 *11:16 *9:13 0.00064427
+50 *11:18 *29:2 0.00044774
+51 *11:12 *119:11 0.00043653
+52 *11:13 *159:14 0.00065534
+53 *11:10 *150:10 0.0006134
+
+*RES
+1 *11:40 *11:41 3.14968
+2 *11:41 *11:43 7.20549
+3 *11:36 *11:43 0.539107
+4 *11:36 *11:38 7.20549
+5 *11:13 *11:38 9.24915
+6 *11:13 *237:B1 39.0151
+7 *11:38 *11:22 12.8543
+8 *11:22 *11:28 624.952
+9 *11:28 *11:29 120.948
+10 *11:29 *239:B1 116.986
+11 *239:B1 *11:31 78.7405
+12 *11:31 *11:32 30.7255
+13 *11:32 *11:33 156.712
+14 *11:33 *11:16 30.7255
+15 *11:47 *11:16 399.341
+16 *11:45 *11:47 5.78532
+17 *11:45 *11:20 4.81503
+18 *11:42 *11:20 1.24436
+19 *11:42 *11:30 4.69514
+20 *11:17 *11:30 9.24915
+21 *11:17 *236:B1 39.6239
+22 *11:42 *11:44 0.67054
+23 *11:44 *11:46 0.277693
+24 *11:46 *11:50 2.25265
+25 *11:48 *11:50 0.284267
+26 *11:48 *11:53 0.698821
+27 *11:53 *11:56 3.36879
+28 *11:56 *11:15 4.80333
+29 *11:52 *11:15 0.0326202
+30 *11:52 *11:34 5.40865
+31 *11:12 *11:34 4.98306
+32 *11:11 *11:12 7.86937
+33 *11:11 *11:39 4.65934
+34 *240:B1 *11:39 9.24915
+35 *11:34 *11:24 9.81101
+36 *241:B1 *11:24 117.045
+37 *11:53 *11:54 1.09475
+38 *11:54 *11:55 0.277693
+39 *11:55 *11:37 4.92652
+40 *11:37 *11:14 10.5158
+41 *11:14 *242:B1 195.076
+42 *11:37 *11:10 14.7422
+43 *11:10 *246:A 78.0302
+44 *11:47 *11:49 0.427888
+45 *11:49 *11:51 0.557028
+46 *11:51 *11:19 12.3879
+47 *11 *11:19 40.3328
+48 *11:41 *11:27 87.9897
+49 *11:26 *11:27 120.179
+50 *11:26 *238:B1 39.7254
+51 *11:35 *11:40 0.557028
+52 *11:35 *11:18 4.03305
+53 *11:23 *11:18 2.69904
+54 *11:23 *11:25 0.539107
+55 *11:25 *11:21 11.0469
+56 *235:B1 *11:21 52.833
+*END
+
+*D_NET *12 0.00704176
+
+*CONN
+*P *12 O *C 86.16 133.94 *L 0.006
+*I *226:Q O *C 99.09 90.28 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *190:A I *C 99.78 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *226:Q 1.993e-05
+2 *12:3 0.00197147
+3 *12:4 0.00376289
+4 *12:5 0.00013934
+5 *12:6 9.048e-05
+6 *12:7 9.605e-05
+7 *12:9 0.00044332
+8 *12:10 7.215e-05
+9 *12:11 0.00012436
+10 *12:12 0.00032177
+
+*RES
+1 *12:12 *12:6 11.9482
+2 *12:6 *12:7 78.7405
+3 *226:Q *12:7 23.4691
+4 *12:7 *12:8 90.1046
+5 *12:3 *12:8 1054.12
+6 *12:4 *12:3 19.8393
+7 *12 *12:4 40.3328
+8 *12:10 *12:12 0.557028
+9 *12:9 *12:10 4.92951
+10 *12:9 *12:11 0.539107
+11 *12:11 *12:5 10.1456
+12 *12:5 *190:A 117.045
+*END
+
+*D_NET *13 0.011335
+
+*CONN
+*P *13 O *C 142.08 72.35 *L 0.006
+*I *301:A I *C 91.48 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *223:Q O *C 90.07 76.96 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *209:A I *C 90.32 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *13:4 0.00047295
+2 *13:5 0.00088183
+3 *13:6 5.637e-05
+4 *13:7 0.00234529
+5 *13:8 0.00505929
+6 *13:9 0.00097381
+7 *13:11 7.758e-05
+8 *13:12 0.00041963
+9 *13:4 *23:4 0.00063881
+10 *13:6 *110:3 0.00040939
+
+*RES
+1 *13 *13:8 16.5538
+2 *13:7 *13:8 12.0549
+3 *13:7 *13:4 6.55263
+4 *13:5 *13:4 9.45872
+5 *13:5 *13:10 0.539107
+6 *13:9 *13:10 10.8107
+7 *301:A *13:9 9.24915
+8 *13:7 *13:12 5.59204
+9 *13:6 *13:12 0.561864
+10 *223:Q *13:6 9.24915
+11 *13:12 *13:13 8.10195
+12 *13:11 *13:13 0.561864
+13 *209:A *13:11 9.24915
+*END
+
+*D_NET *14 0.0131051
+
+*CONN
+*P *14 O *C 142.08 63.2 *L 0.006
+*I *280:B I *C 93.95 63.27 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *278:A I *C 90.76 61.79 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *224:Q O *C 81.6 70.3 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *208:A I *C 81.3 43.66 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *280:B 4.661e-05
+2 *14:5 0.00021016
+3 *14:6 6.013e-05
+4 *14:7 0.00022751
+5 *14:8 7.537e-05
+6 *14:9 6.828e-05
+7 *14:10 0.00497642
+8 *14:11 7.675e-05
+9 *14:12 0.00013743
+10 *14:13 0.00013072
+11 *14:14 6.91e-05
+12 *14:16 0.00064036
+13 *14:17 0.00034065
+14 *14:18 0.0001023
+15 *14:19 8.322e-05
+16 *14:20 0.00016788
+17 *14:21 9.864e-05
+18 *14:22 0.00097751
+19 *14:23 0.00011025
+20 *14:24 0.00022241
+21 *14:25 0.00186233
+22 *14:26 0.00186652
+23 *14:5 *119:2 0.00055458
+
+*RES
+1 *14:23 *14:24 0.277693
+2 *14:24 *14:17 5.15277
+3 *14:17 *14:18 2.74041
+4 *278:A *14:18 9.24915
+5 *14:18 *14:19 0.974369
+6 *14:25 *14:19 5.60689
+7 *14:20 *14:25 4.47566
+8 *14:20 *14:13 9.40738
+9 *14:13 *14:15 30.0152
+10 *280:B *14:15 39.7254
+11 *14:25 *14:10 5.76931
+12 *14:9 *14:10 16.3947
+13 *14:9 *14:11 0.277693
+14 *14:11 *14 0.149204
+15 *14:22 *14:23 3.37731
+16 *14:22 *14:7 0.284267
+17 *14:26 *14:7 4.23729
+18 *14:26 *14:5 1.24809
+19 *14:14 *14:5 3.96511
+20 *14:6 *14:14 0.0326202
+21 *14:6 *14:12 4.59811
+22 *224:Q *14:12 9.24915
+23 *14:26 *14:21 5.41814
+24 *14:21 *14:16 4.95643
+25 *14:16 *14:8 13.7312
+26 *14:8 *208:A 58.5227
+*END
+
+*D_NET *15 0.0114395
+
+*CONN
+*P *15 O *C 0 64.42 *L 0.006
+*I *332:A I *C 61.24 50.32 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *283:A1 I *C 62.91 57.72 *L 0.742 *D sky130_osu_sc_18T_ms__mux2_1
+*I *244:Y O *C 62.15 61.79 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *201:A I *C 58.42 70.3 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *15 0.00467696
+2 *15:5 0.00039594
+3 *15:6 0.00123422
+4 *15:7 0.00022999
+5 *15:8 0.00011645
+6 *15:9 9.218e-05
+7 *15:10 4.612e-05
+8 *15:11 0.00087758
+9 *15:12 0.00066675
+10 *15:13 0.00023652
+11 *15:14 0.00014214
+12 *15:15 0.00069077
+13 *15:16 0.0006453
+14 *15:18 0.00058151
+15 *15:19 1.55e-05
+16 *15:6 *16:6 0.00079161
+
+*RES
+1 *15:13 *15:19 4.47566
+2 *15:18 *15:19 1.58373
+3 *15:16 *15:18 2.02803
+4 *15:16 *15:17 0.284267
+5 *15:15 *15:17 2.70514
+6 *15:14 *15:15 0.565216
+7 *15:14 *15:6 5.98736
+8 *15 *15:6 16.5538
+9 *15:18 *15:5 6.8385
+10 *15:8 *15:5 4.05581
+11 *201:A *15:8 9.24915
+12 *15:13 *15:10 11.3928
+13 *15:10 *244:Y 39.0151
+14 *15:9 *244:Y 78.0302
+15 *15:12 *15:9 15.1075
+16 *15:7 *15:12 9.24915
+17 *15:7 *283:A1 156.06
+18 *15:11 *15:12 9.01291
+19 *332:A *15:11 9.24915
+*END
+
+*D_NET *16 0.0101983
+
+*CONN
+*P *16 O *C 0 63.2 *L 0.006
+*I *294:B I *C 53.43 57.35 *L 0.00431 *D sky130_osu_sc_18T_ms__or2_l
+*I *288:A I *C 49.11 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *275:B0 I *C 56.26 57.72 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *243:Y O *C 56.66 61.79 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *202:A I *C 51.6 63.64 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *16 8.103e-05
+2 *288:A 0.00013199
+3 *275:B0 0.00013438
+4 *243:Y 4.536e-05
+5 *16:6 0.00173513
+6 *16:7 0.00469112
+7 *16:8 0.00046201
+8 *16:10 7.799e-05
+9 *16:11 6.693e-05
+10 *16:12 0.00018881
+11 *16:13 0.00013916
+12 *16:14 3.03e-05
+13 *16:15 0.00053552
+14 *16:16 0.00013378
+15 *16:17 0.00020294
+16 *16:18 0.00062777
+17 *16:20 2.662e-05
+18 *16:21 5.053e-05
+19 *16:22 4.528e-05
+20 *16:6 *15:6 0.00079161
+
+*RES
+1 *16:7 *16:9 0.284267
+2 *16 *16:9 0.368877
+3 *16:7 *16:6 16.1685
+4 *16:8 *16:6 7.1268
+5 *16:17 *16:8 4.47566
+6 *16:16 *16:17 0.969533
+7 *16:16 *16:19 0.539107
+8 *16:18 *16:19 5.39808
+9 *16:18 *16:12 10.3956
+10 *16:12 *294:B 117.045
+11 *16:18 *16:11 9.67703
+12 *288:A *16:11 78.0302
+13 *16:17 *16:10 10.528
+14 *16:10 *202:A 78.0302
+15 *16:8 *16:21 6.73813
+16 *16:20 *16:21 0.0333975
+17 *16:13 *16:20 9.24915
+18 *16:13 *243:Y 97.5378
+19 *243:Y *16:14 53.2394
+20 *16:22 *16:14 9.81101
+21 *16:22 *16:15 14.2014
+22 *275:B0 *16:15 122.735
+*END
+
+*D_NET *17 0.00718693
+
+*CONN
+*P *17 O *C 56.4 133.94 *L 0.006
+*I *269:B I *C 46.21 83.99 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *220:Q O *C 51.95 90.28 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *197:A I *C 44.01 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *220:Q 2.946e-05
+2 *197:A 1.993e-05
+3 *17:4 0.00376289
+4 *17:5 0.00015237
+5 *17:6 0.00065803
+6 *17:7 3.661e-05
+7 *17:8 0.00028212
+8 *17:9 2.835e-05
+9 *17:10 0.00027141
+10 *17:11 0.00011459
+11 *17:12 4.489e-05
+12 *17:13 0.00058449
+13 *17:15 0.00029937
+14 *17:16 0.00090242
+
+*RES
+1 *17:13 *17:14 5.39808
+2 *17:10 *17:14 0.539107
+3 *17:10 *17:6 11.4975
+4 *17:5 *17:6 156.002
+5 *197:A *17:5 23.4691
+6 *17:6 *17:8 546.922
+7 *17:7 *17:8 30.7255
+8 *220:Q *17:7 39.7254
+9 *17:8 *17:9 273.047
+10 *17:15 *17:9 11.9303
+11 *17:15 *17:16 0.557028
+12 *17:16 *17:4 9.2334
+13 *17 *17:4 40.3328
+14 *17:12 *17:13 0.264717
+15 *17:11 *17:12 0.446158
+16 *269:B *17:11 9.24915
+*END
+
+*D_NET *18 0.00537576
+
+*CONN
+*P *18 O *C 61.2 133.94 *L 0.006
+*I *225:Q O *C 63.5 90.28 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *217:A I *C 60.18 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *217:A 5.775e-05
+2 *18:3 0.00281065
+3 *18:4 0.00101889
+4 *18:5 5.419e-05
+5 *18:6 0.00011388
+6 *18:8 0.00116563
+7 *18:9 0.00015477
+
+*RES
+1 *18:6 *18:8 77.9713
+2 *18:8 *18:10 39.7254
+3 *18:9 *18:10 29.9563
+4 *18:9 *225:Q 117.756
+5 *18:8 *18:4 21.1913
+6 *18:7 *18:4 9.68405
+7 *18:3 *18:7 0.539107
+8 *18:3 *18 30.6391
+9 *18:5 *18:6 30.7255
+10 *217:A *18:5 39.7254
+*END
+
+*D_NET *19 0.00779923
+
+*CONN
+*P *19 O *C 76.56 133.94 *L 0.006
+*I *333:A I *C 79.35 83.62 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *245:Y O *C 79.87 88.43 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *236:A1 I *C 75.46 83.99 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *19 0.00017482
+2 *333:A 2.067e-05
+3 *19:4 0.0003943
+4 *19:5 0.00378039
+5 *19:6 9.024e-05
+6 *19:8 0.00014386
+7 *19:9 0.00017624
+8 *19:10 0.00014937
+9 *19:12 0.00032152
+10 *19:13 0.00037362
+11 *19:14 0.00061407
+12 *19:15 9.254e-05
+13 *19:16 0.00015992
+14 *19:18 0.00012215
+15 *19:19 0.00118552
+
+*RES
+1 *19:18 *19:19 0.896455
+2 *19:9 *19:19 9.24915
+3 *19:9 *245:Y 117.045
+4 *19:19 *19:5 12.8434
+5 *19:7 *19:5 40.328
+6 *19 *19:7 2.31573
+7 *19:15 *19:18 0.557028
+8 *19:14 *19:15 4.92951
+9 *19:14 *19:17 0.539107
+10 *19:16 *19:17 0.891619
+11 *19:13 *19:16 0.557028
+12 *19:13 *19:8 11.4796
+13 *19:4 *19:8 273.106
+14 *19:12 *19:4 11.0517
+15 *19:6 *19:12 9.24915
+16 *19:6 *236:A1 78.0302
+17 *19:8 *19:10 117.756
+18 *19:10 *19:11 90.1046
+19 *333:A *19:11 39.7254
+*END
+
+*D_NET *20 0.00222321
+
+*CONN
+*I *334:B I *C 93.67 85.1 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *196:Y O *C 100.59 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *179:A I *C 88.45 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *179:A 0.00012669
+2 *20:3 0.00039556
+3 *20:5 2.64e-05
+4 *20:6 0.00014686
+5 *20:7 0.0008447
+6 *20:8 0.00022607
+7 *20:9 0.00045693
+
+*RES
+1 *20:3 *20:4 29.9563
+2 *179:A *20:4 117.756
+3 *20:3 *20:5 273.816
+4 *20:8 *20:5 11.0517
+5 *20:8 *20:9 0.561864
+6 *20:9 *20:7 13.7508
+7 *20:7 *196:Y 585.227
+8 *20:8 *20:6 40.0336
+9 *20:6 *334:B 39.5143
+*END
+
+*D_NET *21 0.00218338
+
+*CONN
+*I *268:A I *C 47.19 88.43 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *260:A1 I *C 47.64 83.99 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *237:A1 I *C 55.22 83.99 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *197:Y O *C 44.49 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *268:A 4.785e-05
+2 *197:Y 0.0001477
+3 *21:4 0.00013322
+4 *21:5 4.405e-05
+5 *21:6 2.564e-05
+6 *21:7 0.0004942
+7 *21:8 0.00023994
+8 *21:9 7.777e-05
+9 *21:10 0.00069659
+10 *21:11 0.00027642
+
+*RES
+1 *21:11 *21:7 11.4975
+2 *21:7 *237:A1 351.136
+3 *21:10 *21:11 3.46221
+4 *21:9 *21:10 0.423052
+5 *21:8 *21:9 0.557028
+6 *21:8 *21:5 10.1277
+7 *21:4 *21:5 60.0894
+8 *21:4 *260:A1 29.9716
+9 *21:10 *21:6 12.3988
+10 *268:A *21:6 78.0302
+11 *197:Y *268:A 117.045
+*END
+
+*D_NET *22 0.00497359
+
+*CONN
+*I *272:A1 I *C 96.81 63.27 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *208:Y O *C 81.78 45.51 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *185:A I *C 76.57 43.66 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *272:A1 8.625e-05
+2 *208:Y 1.999e-05
+3 *22:3 0.00070138
+4 *22:4 7.885e-05
+5 *22:5 0.00053622
+6 *22:6 2.88e-05
+7 *22:7 0.00011778
+8 *22:9 0.00135987
+9 *22:11 0.00154316
+10 *22:3 *1:10 0.00050129
+
+*RES
+1 *208:Y *22:5 23.4691
+2 *22:5 *22:6 351.077
+3 *22:11 *22:6 27.7256
+4 *22:11 *22:9 790.262
+5 *22:9 *22:10 150.253
+6 *22:7 *22:10 40.4357
+7 *22:7 *22:8 29.9563
+8 *272:A1 *22:8 78.7405
+9 *22:4 *208:Y 52.3676
+10 *22:3 *22:4 489.11
+11 *22:3 *185:A 22.4964
+*END
+
+*D_NET *23 0.00482478
+
+*CONN
+*I *335:A0 I *C 91.38 56.98 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *209:Y O *C 90.8 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *198:A I *C 98.02 76.96 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *23:3 0.00016072
+2 *23:4 0.00087161
+3 *23:5 0.0001126
+4 *23:6 0.00059089
+5 *23:7 0.00035388
+6 *23:8 0.00015563
+7 *23:10 0.00064093
+8 *23:11 0.00030942
+9 *23:12 6.608e-05
+10 *23:13 0.0004486
+11 *23:14 4.058e-05
+12 *23:15 0.00023653
+13 *23:16 5.125e-05
+14 *23:18 0.00014725
+15 *23:4 *13:4 0.00063881
+
+*RES
+1 *23:7 *23:11 0.539107
+2 *23:11 *23:3 11.4975
+3 *23:3 *335:A0 117.654
+4 *23:7 *23:9 2.6942
+5 *23:6 *23:9 0.539107
+6 *23:6 *23:4 7.20549
+7 *23:12 *23:4 9.89145
+8 *23:12 *23:15 0.557028
+9 *23:15 *23:16 2.69904
+10 *23:16 *23:10 556.171
+11 *23:8 *23:10 29.9563
+12 *23:8 *198:A 118.364
+13 *23:16 *23:17 0.896455
+14 *23:13 *23:17 0.539107
+15 *23:13 *23:14 6.28145
+16 *23:14 *23:18 0.557028
+17 *23:18 *23:5 10.1456
+18 *23:5 *209:Y 97.5378
+*END
+
+*D_NET *24 0.00379199
+
+*CONN
+*I *293:B I *C 64.9 76.59 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *291:A I *C 64.03 85.47 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *281:A1 I *C 62.04 76.59 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *217:Y O *C 60.66 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *183:A I *C 59.41 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *293:B 4.164e-05
+2 *183:A 0.00014368
+3 *24:5 0.00023665
+4 *24:6 8.956e-05
+5 *24:7 9.888e-05
+6 *24:8 2.528e-05
+7 *24:9 0.00012009
+8 *24:10 8.661e-05
+9 *24:11 6.789e-05
+10 *24:12 0.00015355
+11 *24:13 0.0002921
+12 *24:15 3.531e-05
+13 *24:16 7.546e-05
+14 *24:17 0.00041346
+15 *24:18 0.00041817
+16 *24:19 0.0002412
+17 *24:20 0.00048231
+18 *24:21 0.00036576
+19 *24:5 *117:5 0.00040439
+
+*RES
+1 *24:12 *24:13 120.948
+2 *24:13 *24:14 60.0304
+3 *24:5 *24:14 195.786
+4 *24:18 *24:5 11.953
+5 *24:6 *24:18 9.24915
+6 *24:6 *217:Y 58.9793
+7 *24:13 *291:A 157.481
+8 *24:9 *24:12 117.697
+9 *24:8 *24:9 30.7255
+10 *183:A *24:8 117.756
+11 *24:7 *24:8 30.7255
+12 *24:7 *24:11 78.7405
+13 *24:20 *24:11 14.6569
+14 *24:19 *24:20 2.69904
+15 *24:19 *24:10 9.81101
+16 *24:10 *281:A1 78.0302
+17 *24:20 *24:17 321.37
+18 *24:17 *24:21 9.24915
+19 *24:21 *24:16 11.5024
+20 *24:15 *24:16 30.0152
+21 *293:B *24:15 39.7254
+*END
+
+*D_NET *25 0.001275
+
+*CONN
+*I *247:Y O *C 95.73 85.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *242:B0 I *C 86.62 84.36 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *25:2 0.00069096
+2 *25:3 0.00021098
+3 *25:5 0.00014932
+4 *25:6 7.81e-05
+5 *25:7 0.00014564
+
+*RES
+1 *25:3 *25:4 29.9563
+2 *25:2 *25:4 546.922
+3 *25:7 *25:2 10.1456
+4 *25:6 *25:7 0.557028
+5 *25:5 *25:6 0.878534
+6 *242:B0 *25:5 9.24915
+7 *25:3 *247:Y 157.38
+*END
+
+*D_NET *26 0.00106316
+
+*CONN
+*I *249:Y O *C 92.6 75.11 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *240:B0 I *C 89.39 71.04 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *240:B0 3.212e-05
+2 *26:2 4.94e-05
+3 *26:3 4.548e-05
+4 *26:4 0.00025409
+5 *26:5 0.00068207
+
+*RES
+1 *26:4 *26:5 9.24915
+2 *26:5 *26:3 13.7556
+3 *26:2 *26:3 30.0152
+4 *240:B0 *26:2 39.7254
+5 *26:4 *249:Y 195.076
+*END
+
+*D_NET *27 0.0018627
+
+*CONN
+*I *251:Y O *C 72.96 72.15 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *241:B0 I *C 81.03 76.22 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *251:Y 0.00103535
+2 *241:B0 0.00014143
+3 *27:2 2.784e-05
+4 *27:3 2.634e-05
+5 *27:4 0.00063174
+
+*RES
+1 *27:4 *27:2 14.2062
+2 *251:Y *27:2 741.287
+3 *27:3 *27:4 9.24915
+4 *241:B0 *27:3 107.292
+*END
+
+*D_NET *28 0.00094493
+
+*CONN
+*I *253:Y O *C 63.39 72.15 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *238:B0 I *C 56.06 71.04 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *238:B0 9.792e-05
+2 *28:2 4.109e-05
+3 *28:3 5.824e-05
+4 *28:4 2.301e-05
+5 *28:5 4.521e-05
+6 *28:6 7.136e-05
+7 *28:7 0.0006081
+
+*RES
+1 *28:3 *28:6 9.24915
+2 *28:7 *28:6 4.52575
+3 *28:7 *28:5 7.19063
+4 *28:4 *28:5 0.0500962
+5 *28:2 *28:4 9.24915
+6 *238:B0 *28:2 83.7199
+7 *28:3 *253:Y 36.9831
+*END
+
+*D_NET *29 0.00325173
+
+*CONN
+*I *255:Y O *C 46.475 76.22 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *235:B0 I *C 54.74 62.9 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *29:2 0.00017352
+2 *29:3 0.00017854
+3 *29:5 0.00031692
+4 *29:6 0.00110715
+5 *29:7 0.00014843
+6 *29:8 0.00030968
+7 *29:10 3.72e-05
+8 *29:12 8.908e-05
+9 *29:2 *11:18 0.00044774
+10 *29:2 *159:11 0.00044347
+
+*RES
+1 *29:12 *29:10 10.1456
+2 *29:6 *29:10 781.013
+3 *29:6 *29:7 90.8738
+4 *29:7 *255:Y 84.727
+5 *29:11 *29:12 0.264717
+6 *29:5 *29:11 4.92951
+7 *29:4 *29:5 0.264717
+8 *29:4 *29:2 3.13176
+9 *29:3 *29:2 1.79775
+10 *29:3 *29:9 0.539107
+11 *29:8 *29:9 3.21058
+12 *235:B0 *29:8 9.24915
+*END
+
+*D_NET *30 0.00135465
+
+*CONN
+*I *258:Y O *C 49.42 88.43 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *237:B0 I *C 54.74 84.36 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *258:Y 0.00056315
+2 *237:B0 5.984e-05
+3 *30:2 4.476e-05
+4 *30:3 4.544e-05
+5 *30:4 0.00010862
+6 *30:5 0.00053284
+
+*RES
+1 *30:2 *30:3 30.0152
+2 *30:5 *30:3 13.305
+3 *30:5 *30:4 39.2643
+4 *258:Y *30:4 468.892
+5 *237:B0 *30:2 39.7254
+*END
+
+*D_NET *31 0.00081868
+
+*CONN
+*I *279:Y O *C 61.8 85.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *239:B0 I *C 62.09 89.54 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *31:2 0.00011303
+2 *31:3 0.00011381
+3 *31:4 8.202e-05
+4 *31:5 0.00050982
+
+*RES
+1 *31:5 *31:4 4.03305
+2 *31:4 *31:3 0.557028
+3 *31:3 *31:2 0.896455
+4 *239:B0 *31:2 9.24915
+5 *279:Y *31:5 9.24915
+*END
+
+*D_NET *32 0.00157323
+
+*CONN
+*I *300:Y O *C 75.86 75.11 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *236:B0 I *C 74.98 84.36 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *300:Y 0.00016293
+2 *236:B0 8.724e-05
+3 *32:2 2.539e-05
+4 *32:3 0.00115141
+5 *32:4 0.00014626
+
+*RES
+1 *32:4 *32:3 19.6092
+2 *300:Y *32:3 117.045
+3 *32:4 *32:2 10.3956
+4 *236:B0 *32:2 78.0302
+*END
+
+*D_NET *33 0.00230155
+
+*CONN
+*I *332:Y O *C 61.72 48.47 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *285:A I *C 63.66 50.32 *L 0.00432 *D sky130_osu_sc_18T_ms__and2_l
+*I *283:A0 I *C 63.87 57.35 *L 0.741 *D sky130_osu_sc_18T_ms__mux2_1
+*I *271:B0 I *C 66.18 57.72 *L 0.00578 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *332:Y 3.549e-05
+2 *271:B0 0.00013483
+3 *33:4 0.0001472
+4 *33:5 0.0001617
+5 *33:6 0.00045196
+6 *33:7 2.939e-05
+7 *33:8 0.00020943
+8 *33:10 0.00054575
+9 *33:11 5.286e-05
+10 *33:12 0.00019722
+11 *33:13 0.00014555
+12 *33:15 0.00019017
+
+*RES
+1 *33:6 *33:8 312.831
+2 *33:8 *33:9 90.1046
+3 *271:B0 *33:9 98.2481
+4 *33:15 *33:6 10.1456
+5 *33:11 *33:15 0.557028
+6 *33:10 *33:11 4.92951
+7 *33:10 *33:14 0.539107
+8 *33:13 *33:14 0.896455
+9 *33:12 *33:13 0.901291
+10 *285:A *33:12 9.24915
+11 *33:13 *33:5 126.236
+12 *33:4 *33:5 90.8738
+13 *332:Y *33:4 39.7254
+14 *33:6 *33:7 60.8586
+15 *33:7 *283:A0 19.4486
+*END
+
+*D_NET *34 0.00128851
+
+*CONN
+*I *333:Y O *C 78.87 85.47 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *309:B I *C 77.77 76.59 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *300:A1 I *C 76.34 76.59 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *309:B 5.404e-05
+2 *300:A1 1.651e-05
+3 *34:3 5.155e-05
+4 *34:4 8.03e-05
+5 *34:5 6.388e-05
+6 *34:6 0.00102223
+
+*RES
+1 *300:A1 *309:B 136.553
+2 *309:B *34:3 39.7254
+3 *34:3 *34:4 30.0152
+4 *34:6 *34:4 17.8114
+5 *34:5 *34:6 9.24915
+6 *34:5 *333:Y 39.0151
+*END
+
+*D_NET *35 0.00402982
+
+*CONN
+*I *337:B I *C 48.18 49.95 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *331:Y O *C 69.38 58.83 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *289:B I *C 46.92 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *337:B 1.932e-05
+2 *331:Y 9.41e-05
+3 *289:B 0.00010902
+4 *35:3 6.226e-05
+5 *35:4 6.046e-05
+6 *35:5 4.518e-05
+7 *35:6 0.0001614
+8 *35:7 6.958e-05
+9 *35:8 0.00019519
+10 *35:9 0.0007138
+11 *35:10 0.00249951
+
+*RES
+1 *337:B *35:3 39.7254
+2 *35:3 *35:4 30.0152
+3 *35:8 *35:4 10.5962
+4 *35:6 *35:8 0.539107
+5 *35:6 *35:7 1.70031
+6 *35:10 *35:7 15.1093
+7 *35:9 *35:10 4.47566
+8 *35:9 *35:5 15.205
+9 *331:Y *35:5 78.0302
+10 *289:B *337:B 117.045
+*END
+
+*D_NET *36 0.0014366
+
+*CONN
+*I *335:A1 I *C 91.86 57.35 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *330:Y O *C 88.75 58.83 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *301:B I *C 90.04 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *330:Y 0.00011972
+2 *36:3 6.485e-05
+3 *36:4 0.00031794
+4 *36:6 0.00093409
+
+*RES
+1 *330:Y *36:5 156.771
+2 *36:4 *36:5 30.6867
+3 *36:6 *36:4 87.9897
+4 *36:6 *36:3 18.2621
+5 *36:3 *301:B 43.993
+6 *36:4 *335:A1 117.756
+*END
+
+*D_NET *37 0.00271004
+
+*CONN
+*I *329:Y O *C 70.32 48.47 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *315:A I *C 57.98 43.66 *L 0.00455 *D sky130_osu_sc_18T_ms__or2_l
+*I *302:B I *C 58.69 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *295:B1 I *C 61.01 44.765 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *302:B 8.051e-05
+2 *37:4 0.00014944
+3 *37:5 7.071e-05
+4 *37:7 0.00127792
+5 *37:8 6.926e-05
+6 *37:9 0.00030578
+7 *37:10 0.00016526
+8 *37:11 0.00038506
+9 *37:12 0.0002061
+
+*RES
+1 *315:A *37:9 9.24915
+2 *37:9 *37:10 1.73111
+3 *37:10 *37:11 1.3471
+4 *37:4 *37:11 9.24915
+5 *37:4 *295:B1 117.045
+6 *37:11 *37:12 3.60517
+7 *37:12 *37:7 829.277
+8 *37:7 *37:8 60.7996
+9 *37:8 *329:Y 39.1084
+10 *37:12 *37:5 11.5024
+11 *37:5 *37:6 30.0152
+12 *302:B *37:6 88.4943
+*END
+
+*D_NET *38 0.00226174
+
+*CONN
+*I *328:Y O *C 78.95 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_l
+*I *310:B I *C 85.14 49.95 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *305:A I *C 85.87 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *328:Y 6.532e-05
+2 *38:3 0.00073064
+3 *38:4 5.425e-05
+4 *38:5 0.00131791
+5 *38:6 9.362e-05
+
+*RES
+1 *328:Y *38:3 53.5433
+2 *38:3 *38:4 507.138
+3 *38:5 *38:4 13.7373
+4 *310:B *38:5 9.24915
+5 *38:5 *38:6 8.58054
+6 *305:A *38:6 9.24915
+*END
+
+*D_NET *39 0.00152355
+
+*CONN
+*I *327:Y O *C 78.84 48.47 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *313:B I *C 80.41 57.35 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *307:B I *C 79.15 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *327:Y 6.92e-05
+2 *307:B 2.986e-05
+3 *39:3 8.972e-05
+4 *39:4 9.128e-05
+5 *39:5 2.868e-05
+6 *39:6 0.0001306
+7 *39:7 0.00108421
+
+*RES
+1 *39:7 *39:5 19.1585
+2 *327:Y *39:5 78.0302
+3 *39:6 *39:7 0.539107
+4 *39:6 *39:3 9.69496
+5 *39:3 *39:4 30.7844
+6 *307:B *39:4 39.7254
+7 *39:4 *313:B 78.6308
+*END
+
+*D_NET *40 0.00366937
+
+*CONN
+*I *326:Y O *C 72.24 58.83 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *314:B I *C 62.71 49.95 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *306:A I *C 63.63 43.66 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *314:B 5.192e-05
+2 *40:3 0.0001135
+3 *40:4 0.0001102
+4 *40:5 0.00017079
+5 *40:7 0.00092332
+6 *40:8 0.0003448
+7 *40:9 0.00075511
+8 *40:11 0.00111918
+9 *40:12 8.055e-05
+
+*RES
+1 *314:B *40:6 39.7254
+2 *40:5 *40:6 60.0894
+3 *40:12 *40:5 9.81101
+4 *40:11 *40:12 0.786838
+5 *40:9 *40:11 5.96801
+6 *306:A *40:9 9.24915
+7 *40:11 *40:4 7.98249
+8 *40:8 *40:4 5.04128
+9 *40:8 *40:10 2.58942
+10 *40:7 *40:10 0.539107
+11 *40:7 *40:3 17.8066
+12 *40:3 *326:Y 78.0302
+*END
+
+*D_NET *41 0.0027089
+
+*CONN
+*I *325:Y O *C 66.3 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *312:A I *C 54.017 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *304:A I *C 47.53 45.51 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *41:3 0.00029254
+2 *41:4 4.251e-05
+3 *41:5 0.00023351
+4 *41:6 0.00029361
+5 *41:7 0.00011471
+6 *41:8 8.483e-05
+7 *41:9 0.00084593
+8 *41:10 8.365e-05
+9 *41:11 7.426e-05
+10 *41:12 0.00024038
+11 *41:3 *42:3 0.00040297
+
+*RES
+1 *41:12 *41:8 5.15277
+2 *41:8 *41:5 9.30529
+3 *41:5 *325:Y 185.322
+4 *41:11 *41:12 0.277693
+5 *41:9 *41:11 4.05605
+6 *41:9 *41:10 0.284267
+7 *41:10 *41:7 5.1462
+8 *41:7 *41:4 10.0165
+9 *41:3 *41:4 351.136
+10 *41:6 *41:3 11.5024
+11 *304:A *41:6 9.24915
+12 *41:4 *312:A 78.0302
+*END
+
+*D_NET *42 0.00345441
+
+*CONN
+*I *324:Y O *C 72.35 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *312:B I *C 53.8 44.03 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *304:B I *C 49.45 45.14 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *304:B 0.00011548
+2 *42:3 9.077e-05
+3 *42:4 0.00013399
+4 *42:6 0.00014886
+5 *42:8 5.958e-05
+6 *42:9 5.986e-05
+7 *42:10 0.00038658
+8 *42:11 0.00107617
+9 *42:12 0.0006335
+10 *42:13 0.00034665
+11 *42:3 *41:3 0.00040297
+
+*RES
+1 *304:B *42:5 156.06
+2 *42:3 *42:5 30.0152
+3 *42:3 *42:7 118.466
+4 *42:6 *42:7 60.0304
+5 *42:6 *312:B 79.1971
+6 *42:5 *42:8 9.24915
+7 *42:8 *42:9 0.18886
+8 *42:11 *42:9 9.67115
+9 *42:11 *42:12 0.277693
+10 *42:12 *42:14 2.25265
+11 *42:13 *42:14 0.284267
+12 *42:13 *42:10 5.1462
+13 *42:10 *42:4 223.832
+14 *324:Y *42:4 97.5378
+*END
+
+*D_NET *43 0.00176416
+
+*CONN
+*I *323:Y O *C 87.16 48.47 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *311:B I *C 95.44 44.03 *L 0.0042 *D sky130_osu_sc_18T_ms__nand2_l
+*I *303:A I *C 91.35 43.66 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *296:A0 I *C 93.755 43.66 *L 0.00553 *D sky130_osu_sc_18T_ms__oai21_l
+
+*CAP
+1 *323:Y 0.00030266
+2 *311:B 8.796e-05
+3 *303:A 0.00015738
+4 *296:A0 2.782e-05
+5 *43:4 0.00014799
+6 *43:5 2.618e-05
+7 *43:6 0.0002417
+8 *43:8 0.00012
+9 *43:10 0.00065247
+
+*RES
+1 *43:6 *43:7 29.9563
+2 *296:A0 *43:7 39.7254
+3 *303:A *296:A0 117.045
+4 *43:4 *303:A 117.045
+5 *43:10 *43:4 15.1075
+6 *43:5 *43:10 9.24915
+7 *323:Y *43:5 234.091
+8 *43:6 *43:8 196.496
+9 *43:8 *43:9 60.0304
+10 *311:B *43:9 78.7405
+*END
+
+*D_NET *44 0.00475821
+
+*CONN
+*I *322:Y O *C 85.28 45.51 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *299:A I *C 83.39 70.3 *L 0.00455 *D sky130_osu_sc_18T_ms__or2_l
+*I *297:B I *C 86.3 62.16 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *287:B1 I *C 86.42 71.405 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *322:Y 0.00013958
+2 *297:B 0.00026528
+3 *44:4 0.00065339
+4 *44:5 0.00037615
+5 *44:6 0.00022679
+6 *44:8 0.0001706
+7 *44:9 0.0003237
+8 *44:10 4.479e-05
+9 *44:11 0.00012633
+10 *44:12 3.245e-05
+11 *44:14 0.0008561
+12 *44:15 5.951e-05
+13 *44:16 0.00073308
+14 *44:17 0.00075046
+
+*RES
+1 *44:4 *44:7 195.786
+2 *297:B *44:7 173.071
+3 *297:B *44:12 29.2613
+4 *44:17 *44:12 16.004
+5 *44:15 *44:17 0.557028
+6 *44:14 *44:15 8.08403
+7 *44:14 *44:16 0.539107
+8 *44:16 *44:10 14.6521
+9 *322:Y *44:10 97.5378
+10 *44:5 *44:4 12.4037
+11 *44:11 *44:5 4.05581
+12 *299:A *44:11 9.24915
+13 *44:11 *44:13 0.445809
+14 *44:8 *44:13 0.539107
+15 *44:8 *44:9 0.873698
+16 *44:9 *44:6 10.9982
+17 *44:6 *287:B1 127.408
+*END
+
+*D_NET *45 0.00240802
+
+*CONN
+*I *321:Y O *C 67.68 45.51 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *315:B I *C 57.5 44.03 *L 0.00431 *D sky130_osu_sc_18T_ms__or2_l
+*I *302:A I *C 57.25 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *295:B0 I *C 60.33 44.4 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *315:B 5.533e-05
+2 *45:4 0.00016212
+3 *45:5 0.00010425
+4 *45:6 2.591e-05
+5 *45:7 0.00017295
+6 *45:8 9.467e-05
+7 *45:9 0.00104586
+8 *45:10 0.0003415
+9 *45:11 0.00040543
+
+*RES
+1 *45:8 *321:Y 39.7254
+2 *45:8 *45:9 29.9563
+3 *45:11 *45:9 751.247
+4 *45:10 *45:11 1.80258
+5 *45:10 *45:5 39.2643
+6 *315:B *45:5 59.233
+7 *45:10 *45:7 10.4184
+8 *45:7 *295:B0 78.0302
+9 *45:11 *45:6 13.305
+10 *45:4 *45:6 39.7254
+11 *45:4 *302:A 90.1635
+*END
+
+*D_NET *46 0.00108985
+
+*CONN
+*I *320:Y O *C 88.15 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *311:A I *C 96.4 43.66 *L 0.00422 *D sky130_osu_sc_18T_ms__nand2_l
+*I *303:B I *C 92.79 44.03 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *296:A1 I *C 94.235 44.03 *L 0.0056 *D sky130_osu_sc_18T_ms__oai21_l
+
+*CAP
+1 *320:Y 0.00031487
+2 *303:B 0.0001788
+3 *296:A1 3.387e-05
+4 *46:5 0.00022671
+5 *46:7 0.0003356
+
+*RES
+1 *320:Y *46:6 234.801
+2 *46:7 *46:6 29.9563
+3 *46:7 *303:B 186.032
+4 *303:B *296:A1 126.799
+5 *296:A1 *46:4 39.7254
+6 *46:5 *46:4 29.9563
+7 *46:5 *311:A 117.756
+*END
+
+*D_NET *47 0.00174272
+
+*CONN
+*I *319:Y O *C 78.36 48.47 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *313:A I *C 80.193 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *307:A I *C 77.71 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *313:A 4.676e-05
+2 *47:3 0.00013142
+3 *47:4 0.00040389
+4 *47:5 7.901e-05
+5 *47:7 0.00084799
+6 *47:8 0.00014807
+7 *47:9 8.558e-05
+
+*RES
+1 *47:4 *307:A 25.9511
+2 *307:A *47:9 9.24915
+3 *47:8 *47:9 1.3471
+4 *47:7 *47:8 0.557028
+5 *47:7 *47:3 16.8874
+6 *47:3 *319:Y 78.0302
+7 *47:4 *47:5 235.511
+8 *47:5 *47:6 29.9563
+9 *313:A *47:6 68.9867
+*END
+
+*D_NET *48 0.00355032
+
+*CONN
+*I *318:Y O *C 67.95 58.83 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *314:A I *C 62.927 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *306:B I *C 65.07 44.03 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *48:3 0.00029552
+2 *48:4 6.89e-05
+3 *48:5 0.00015816
+4 *48:6 0.0001538
+5 *48:7 8.967e-05
+6 *48:8 0.00063106
+7 *48:10 0.00011494
+8 *48:11 1.692e-05
+9 *48:12 9.48e-05
+10 *48:13 0.00063762
+11 *48:14 7.653e-05
+12 *48:15 0.00024698
+13 *48:16 0.0002654
+14 *48:17 0.00014864
+15 *48:18 0.00055138
+
+*RES
+1 *48:6 *48:7 1.32434
+2 *48:7 *48:10 0.557028
+3 *48:10 *48:11 0.896455
+4 *314:A *48:11 9.24915
+5 *48:11 *48:12 0.0389637
+6 *48:18 *48:12 6.51188
+7 *48:18 *48:15 5.7375
+8 *48:13 *48:15 0.539107
+9 *48:13 *48:14 5.8308
+10 *48:14 *48:16 0.557028
+11 *48:16 *48:17 1.77499
+12 *48:17 *48:4 9.82893
+13 *48:4 *318:Y 39.0151
+14 *48:6 *48:9 0.246796
+15 *48:8 *48:9 4.49678
+16 *48:5 *48:8 0.264717
+17 *48:5 *48:3 10.1277
+18 *48:3 *306:B 195.076
+*END
+
+*D_NET *49 0.00251994
+
+*CONN
+*I *317:Y O *C 78.47 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *310:A I *C 84.923 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *305:B I *C 84.43 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *49:3 6.829e-05
+2 *49:4 0.00011757
+3 *49:5 7.953e-05
+4 *49:6 0.00015041
+5 *49:7 0.00067325
+6 *49:8 0.00087088
+7 *49:9 0.00056001
+
+*RES
+1 *49:5 *49:8 9.24915
+2 *49:8 *49:4 17.8114
+3 *49:3 *49:4 78.0302
+4 *49:7 *49:3 15.1075
+5 *49:7 *49:9 4.47566
+6 *49:9 *49:6 6.51188
+7 *317:Y *49:6 9.24915
+8 *49:4 *310:A 82.0938
+9 *49:5 *305:B 78.0302
+*END
+
+*D_NET *50 0.00284635
+
+*CONN
+*I *316:Y O *C 76.27 58.83 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *309:A I *C 77.553 76.96 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *300:A0 I *C 76.82 76.96 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *300:A0 0.00010226
+2 *50:3 7.922e-05
+3 *50:4 8.407e-05
+4 *50:5 0.00104032
+5 *50:6 8.42e-05
+6 *50:7 0.00093566
+7 *50:8 0.00011997
+8 *50:5 *9:9 0.00040065
+
+*RES
+1 *50:7 *50:5 9.90937
+2 *50:8 *50:5 12.5953
+3 *50:8 *50:6 9.82893
+4 *50:4 *50:6 30.0152
+5 *50:4 *300:A0 39.7254
+6 *300:A0 *309:A 78.0302
+7 *50:7 *50:3 9.81101
+8 *50:3 *316:Y 58.5227
+*END
+
+*D_NET *51 0.00020693
+
+*CONN
+*I *315:Y O *C 58.94 45.51 *L 0 *D sky130_osu_sc_18T_ms__or2_l
+*I *295:A1 I *C 59.85 44.03 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *51:2 0.00020693
+
+*RES
+1 *51:2 *295:A1 79.2479
+2 *51:2 *315:Y 30.0152
+*END
+
+*D_NET *52 0.00253426
+
+*CONN
+*I *336:B I *C 49.14 49.95 *L 0.00561 *D sky130_osu_sc_18T_ms__or2_1
+*I *314:Y O *C 62.71 48.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *277:B I *C 47.36 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *336:B 0.00011304
+2 *52:3 0.00020381
+3 *52:4 0.00107986
+4 *52:5 3.519e-05
+5 *52:6 0.00074509
+6 *52:7 0.00029334
+7 *52:8 6.393e-05
+
+*RES
+1 *52:7 *52:8 1.79775
+2 *52:8 *52:5 9.81101
+3 *52:4 *52:5 1014.33
+4 *336:B *52:4 90.9327
+5 *52:3 *52:4 156.771
+6 *52:6 *52:3 16.9101
+7 *277:B *52:6 9.24915
+8 *314:Y *52:7 9.24915
+*END
+
+*D_NET *53 0.00289114
+
+*CONN
+*I *313:Y O *C 80.41 58.83 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *299:B I *C 82.91 70.67 *L 0.00431 *D sky130_osu_sc_18T_ms__or2_l
+*I *297:A I *C 84.38 61.79 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *287:B0 I *C 85.74 71.04 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *299:B 7.121e-05
+2 *53:4 0.00041593
+3 *53:5 0.00029011
+4 *53:6 4.674e-05
+5 *53:7 4.743e-05
+6 *53:8 5.916e-05
+7 *53:9 0.0002343
+8 *53:10 0.00042759
+9 *53:11 0.00038085
+10 *53:12 7.301e-05
+11 *53:13 0.00013739
+12 *53:14 0.00070742
+
+*RES
+1 *53:6 *53:8 30.0152
+2 *53:10 *53:8 11.5876
+3 *287:B0 *53:10 9.24915
+4 *53:10 *53:4 4.9571
+5 *53:14 *53:4 6.30904
+6 *297:A *53:14 9.24915
+7 *53:9 *297:A 156.002
+8 *53:7 *53:9 30.7255
+9 *53:5 *53:7 156.771
+10 *53:13 *53:5 9.69496
+11 *53:12 *53:13 0.557028
+12 *53:11 *53:12 2.68112
+13 *313:Y *53:11 9.24915
+14 *299:B *53:6 78.7405
+*END
+
+*D_NET *54 0.00147807
+
+*CONN
+*I *312:Y O *C 53.8 45.51 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *295:A0 I *C 59.37 43.66 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *292:B I *C 52.86 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *312:Y 0.00010134
+2 *54:3 8.466e-05
+3 *54:4 8.043e-05
+4 *54:5 0.00011018
+5 *54:7 0.00044693
+6 *54:9 4.114e-05
+7 *54:10 0.00010889
+8 *54:11 0.0005045
+
+*RES
+1 *54:7 *54:9 313.542
+2 *54:9 *54:10 30.7255
+3 *54:10 *295:A0 77.9713
+4 *54:7 *54:8 90.1046
+5 *312:Y *54:8 98.2481
+6 *54:5 *312:Y 59.233
+7 *54:5 *54:6 29.9563
+8 *54:3 *54:6 78.7405
+9 *54:11 *54:3 14.2062
+10 *54:4 *54:11 9.24915
+11 *54:4 *292:B 78.0302
+*END
+
+*D_NET *55 0.00077215
+
+*CONN
+*I *311:Y O *C 96.4 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_l
+*I *298:B I *C 97.07 49.95 *L 0.0042 *D sky130_osu_sc_18T_ms__nand2_l
+
+*CAP
+1 *311:Y 5.495e-05
+2 *298:B 4.287e-05
+3 *55:2 3.329e-05
+4 *55:3 2.42e-05
+5 *55:4 0.00049254
+6 *55:5 0.0001243
+
+*RES
+1 *55:5 *55:3 10.1456
+2 *298:B *55:3 78.0302
+3 *55:4 *55:5 0.557028
+4 *55:4 *55:2 13.7328
+5 *311:Y *55:2 78.0302
+*END
+
+*D_NET *56 0.00169071
+
+*CONN
+*I *310:Y O *C 85.14 48.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *298:A I *C 96.11 50.32 *L 0.00422 *D sky130_osu_sc_18T_ms__nand2_l
+*I *290:A I *C 94.67 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *290:A 0.00013837
+2 *56:3 9.617e-05
+3 *56:4 0.00013646
+4 *56:5 0.00020564
+5 *56:6 0.00010258
+6 *56:7 0.00101149
+
+*RES
+1 *290:A *298:A 117.045
+2 *56:4 *290:A 78.0302
+3 *56:4 *56:6 9.24915
+4 *56:7 *56:6 4.51462
+5 *56:7 *56:5 8.54811
+6 *56:5 *56:3 10.2357
+7 *56:3 *310:Y 78.0302
+*END
+
+*D_NET *57 0.00148545
+
+*CONN
+*I *309:Y O *C 77.77 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *308:A I *C 71.21 76.96 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *300:B0 I *C 75.86 76.22 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *308:A 7.202e-05
+2 *300:B0 0.00018804
+3 *57:3 3.947e-05
+4 *57:4 8.837e-05
+5 *57:5 0.00017492
+6 *57:6 6.063e-05
+7 *57:7 0.00010762
+8 *57:8 0.00069105
+9 *57:9 6.333e-05
+
+*RES
+1 *300:B0 *309:Y 136.553
+2 *57:4 *309:Y 58.5227
+3 *57:4 *57:6 9.24915
+4 *57:6 *57:7 0.161421
+5 *57:8 *57:7 6.27743
+6 *57:8 *57:9 0.284267
+7 *57:9 *57:5 4.91995
+8 *57:5 *57:3 10.4062
+9 *308:A *57:3 81.2815
+*END
+
+*D_NET *58 0.00214013
+
+*CONN
+*I *308:Y O *C 70.73 75.11 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *286:B I *C 63.48 76.59 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *279:B I *C 62.76 83.99 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *279:B 2.129e-05
+2 *58:3 4.857e-05
+3 *58:4 0.00041436
+4 *58:5 0.00040044
+5 *58:6 0.00014984
+6 *58:8 0.00015312
+7 *58:9 0.00076416
+8 *58:10 0.00018835
+
+*RES
+1 *58:4 *58:7 313.542
+2 *58:6 *58:7 90.1046
+3 *58:6 *308:Y 39.7254
+4 *58:4 *58:5 29.9563
+5 *58:9 *58:5 283.065
+6 *58:8 *58:9 1.32918
+7 *58:8 *58:11 0.0893495
+8 *58:10 *58:11 0.436864
+9 *286:B *58:10 9.24915
+10 *58:9 *58:3 16.4595
+11 *279:B *58:3 39.0151
+*END
+
+*D_NET *59 0.00092144
+
+*CONN
+*I *303:Y O *C 91.83 45.51 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *290:B I *C 93.23 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *303:Y 5.452e-05
+2 *59:2 4.933e-05
+3 *59:3 4.545e-05
+4 *59:4 0.00012266
+5 *59:5 0.00064948
+
+*RES
+1 *59:2 *59:3 30.0152
+2 *59:5 *59:3 15.5582
+3 *59:4 *59:5 9.24915
+4 *59:4 *290:B 78.0302
+5 *303:Y *59:2 78.7405
+*END
+
+*D_NET *60 0.00031012
+
+*CONN
+*I *302:Y O *C 57.73 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *292:A I *C 54.3 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *60:2 0.00031012
+
+*RES
+1 *60:2 *302:Y 235.105
+2 *60:2 *292:A 60.0894
+*END
+
+*D_NET *61 0.00383256
+
+*CONN
+*I *307:Y O *C 78.19 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *294:A I *C 53.91 56.98 *L 0.00455 *D sky130_osu_sc_18T_ms__or2_l
+*I *288:B I *C 50.55 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *275:B1 I *C 56.94 58.085 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *294:A 4.329e-05
+2 *288:B 0.00010227
+3 *61:4 0.00012544
+4 *61:5 0.00066259
+5 *61:6 0.00044166
+6 *61:8 5.564e-05
+7 *61:9 7.644e-05
+8 *61:10 7.539e-05
+9 *61:11 0.00016061
+10 *61:12 0.00012752
+11 *61:13 0.00010128
+12 *61:14 2.032e-05
+13 *61:15 0.00184011
+
+*RES
+1 *61:4 *61:8 9.24915
+2 *61:8 *61:9 0.128024
+3 *61:9 *61:5 7.0775
+4 *61:15 *61:5 11.8287
+5 *61:14 *61:15 0.128024
+6 *61:11 *61:14 9.24915
+7 *61:11 *275:B1 117.045
+8 *61:13 *61:14 0.896455
+9 *61:12 *61:13 0.557028
+10 *61:12 *61:10 9.67703
+11 *294:A *61:10 78.0302
+12 *61:6 *294:A 195.786
+13 *61:6 *61:7 29.9563
+14 *288:B *61:7 88.4943
+15 *61:4 *307:Y 117.045
+*END
+
+*D_NET *62 0.00651601
+
+*CONN
+*I *306:Y O *C 64.11 45.51 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *293:A I *C 64.683 76.96 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+*I *291:B I *C 65.95 85.1 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *281:A0 I *C 62.52 76.96 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *293:A 1.796e-05
+2 *281:A0 9.411e-05
+3 *62:4 0.00018722
+4 *62:5 0.00032358
+5 *62:6 0.00010551
+6 *62:7 9.358e-05
+7 *62:8 0.00016172
+8 *62:9 0.00144456
+9 *62:10 7.78e-05
+10 *62:11 7.851e-05
+11 *62:13 0.0005647
+12 *62:14 0.00036497
+13 *62:16 0.0001636
+14 *62:17 0.00045602
+15 *62:19 3.108e-05
+16 *62:20 9.637e-05
+17 *62:21 7.661e-05
+18 *62:22 0.00071182
+19 *62:23 7.501e-05
+20 *62:24 0.00098137
+21 *62:4 *174:12 0.00040991
+
+*RES
+1 *62:21 *62:5 3.58241
+2 *62:13 *62:5 5.85356
+3 *62:13 *62:18 0.539107
+4 *62:17 *62:18 3.14485
+5 *62:11 *62:17 0.557028
+6 *62:9 *62:11 13.0411
+7 *62:9 *62:15 0.539107
+8 *62:14 *62:15 3.14485
+9 *62:7 *62:14 0.557028
+10 *62:4 *62:7 0.878534
+11 *306:Y *62:4 9.24915
+12 *62:21 *62:22 0.557028
+13 *62:22 *62:23 8.55743
+14 *293:A *62:23 9.24915
+15 *293:A *62:16 23.4691
+16 *62:10 *62:16 40.4357
+17 *62:10 *62:12 29.9563
+18 *62:8 *62:12 78.6816
+19 *62:6 *62:8 60.7996
+20 *281:A0 *62:6 78.7405
+21 *62:16 *62:19 116.986
+22 *62:24 *62:19 17.8114
+23 *62:24 *62:20 70.1077
+24 *291:B *62:20 4.71647
+*END
+
+*D_NET *63 0.00229716
+
+*CONN
+*I *305:Y O *C 85.39 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *287:A0 I *C 84.78 70.3 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *282:A I *C 81.67 63.64 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *282:A 7.63e-06
+2 *63:3 0.00011498
+3 *63:4 0.00031171
+4 *63:5 5.348e-05
+5 *63:6 0.0002384
+6 *63:7 0.00023156
+7 *63:8 8.198e-05
+8 *63:10 0.00058312
+9 *63:11 0.00010048
+10 *63:12 7.073e-05
+11 *63:13 0.00021495
+12 *63:14 0.00028814
+
+*RES
+1 *63:7 *63:9 0.539107
+2 *63:9 *63:4 3.14968
+3 *63:14 *63:4 2.69904
+4 *63:12 *63:14 0.557028
+5 *63:11 *63:12 0.878534
+6 *63:10 *63:11 4.95227
+7 *63:10 *63:13 0.539107
+8 *63:13 *63:8 10.5962
+9 *63:8 *305:Y 58.5227
+10 *63:11 *63:6 126.236
+11 *63:5 *63:6 30.7255
+12 *282:A *63:5 20.2179
+13 *63:7 *63:3 10.1456
+14 *63:3 *287:A0 45.7206
+*END
+
+*D_NET *64 0.00091535
+
+*CONN
+*I *337:A I *C 47.963 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *304:Y O *C 48.235 44.4 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *289:A I *C 45.48 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *289:A 7.99e-05
+2 *64:3 0.00011333
+3 *64:4 0.00010242
+4 *64:5 0.0006197
+
+*RES
+1 *64:3 *304:Y 78.0302
+2 *64:5 *64:3 15.5582
+3 *64:4 *64:5 9.24915
+4 *289:A *64:4 58.5227
+5 *64:4 *337:A 43.0787
+*END
+
+*D_NET *65 0.00145388
+
+*CONN
+*I *301:Y O *C 91 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *284:A I *C 93.73 58.83 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *301:Y 0.00021036
+2 *65:2 2.719e-05
+3 *65:3 0.0009979
+4 *65:4 0.00011458
+5 *65:5 0.00010385
+
+*RES
+1 *301:Y *65:2 164.595
+2 *65:3 *65:2 20.0419
+3 *65:3 *65:4 0.557028
+4 *65:4 *65:5 0.896455
+5 *284:A *65:5 9.24915
+*END
+
+*D_NET *66 0.00019626
+
+*CONN
+*I *299:Y O *C 84.35 72.15 *L 0 *D sky130_osu_sc_18T_ms__or2_l
+*I *287:A1 I *C 85.26 70.67 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *299:Y 0.00012367
+2 *287:A1 7.259e-05
+
+*RES
+1 *299:Y *66:2 78.7405
+2 *287:A1 *66:2 22.6999
+*END
+
+*D_NET *67 0.0010706
+
+*CONN
+*I *298:Y O *C 96.11 48.47 *L 0 *D sky130_osu_sc_18T_ms__nand2_l
+*I *296:B0 I *C 94.54 44.4 *L 0.00468 *D sky130_osu_sc_18T_ms__oai21_l
+
+*CAP
+1 *67:2 8.487e-05
+2 *67:3 0.00018849
+3 *67:4 0.00036632
+4 *67:5 0.00043092
+
+*RES
+1 *67:5 *67:3 11.9482
+2 *67:3 *298:Y 117.045
+3 *67:4 *67:5 1.14165
+4 *67:4 *67:2 11.4796
+5 *67:2 *296:B0 39.3703
+*END
+
+*D_NET *68 0.00028588
+
+*CONN
+*I *297:Y O *C 85.085 62.9 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *282:B I *C 83.11 63.27 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *282:B 8.284e-05
+2 *68:2 0.00015726
+3 *68:3 4.578e-05
+
+*RES
+1 *282:B *68:3 78.7405
+2 *68:3 *68:2 30.7255
+3 *68:2 *297:Y 116.986
+*END
+
+*D_NET *69 0.00213859
+
+*CONN
+*I *335:B0 I *C 92.34 57.72 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *296:Y O *C 95.02 45.51 *L 0 *D sky130_osu_sc_18T_ms__oai21_l
+*I *284:B I *C 95.65 58.46 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *335:B0 0.00015183
+2 *296:Y 2.613e-05
+3 *69:3 3.766e-05
+4 *69:4 0.00024045
+5 *69:5 3.771e-05
+6 *69:6 4.405e-05
+7 *69:7 0.00094835
+8 *69:8 0.00017614
+9 *69:9 0.00047627
+
+*RES
+1 *69:4 *284:B 58.4637
+2 *69:8 *69:4 70.1077
+3 *69:7 *69:8 10.8107
+4 *69:7 *69:9 0.539107
+5 *69:9 *69:6 12.8495
+6 *69:5 *69:6 30.0152
+7 *296:Y *69:5 39.7254
+8 *69:8 *69:3 10.4184
+9 *335:B0 *69:3 117.045
+*END
+
+*D_NET *70 0.00277
+
+*CONN
+*I *295:Y O *C 60.33 45.51 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *285:B I *C 64.14 49.95 *L 0.00442 *D sky130_osu_sc_18T_ms__and2_l
+*I *283:S0 I *C 64.83 56.98 *L 0.0111 *D sky130_osu_sc_18T_ms__mux2_1
+*I *271:B1 I *C 65.43 58.085 *L 0.00566 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *295:Y 0.00016138
+2 *285:B 4.495e-05
+3 *70:4 4.515e-05
+4 *70:5 0.00047456
+5 *70:6 0.00011249
+6 *70:7 8.525e-05
+7 *70:8 5e-05
+8 *70:9 4.613e-05
+9 *70:10 0.00048314
+10 *70:11 0.00025952
+11 *70:12 0.00029543
+12 *70:13 0.000712
+
+*RES
+1 *295:Y *70:4 111.762
+2 *70:10 *70:4 12.4037
+3 *70:10 *70:5 127.005
+4 *70:5 *70:6 151.022
+5 *70:6 *285:B 58.4637
+6 *285:B *70:8 59.233
+7 *70:8 *70:9 30.0152
+8 *70:13 *70:9 15.5533
+9 *70:11 *70:13 0.539107
+10 *70:11 *70:12 1.79775
+11 *283:S0 *70:12 9.24915
+12 *70:12 *70:7 10.6011
+13 *70:7 *271:B1 78.0302
+*END
+
+*D_NET *71 0.00030677
+
+*CONN
+*I *294:Y O *C 54.87 58.83 *L 0 *D sky130_osu_sc_18T_ms__or2_l
+*I *275:A1 I *C 55.78 57.35 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *71:2 4.902e-05
+2 *71:3 0.00025775
+
+*RES
+1 *71:3 *275:A1 156.771
+2 *71:3 *71:2 30.7255
+3 *71:2 *294:Y 58.4637
+*END
+
+*D_NET *72 0.000399
+
+*CONN
+*I *293:Y O *C 64.9 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *286:A I *C 63.697 76.96 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+
+*CAP
+1 *72:2 0.00011477
+2 *72:3 0.00017518
+3 *72:4 0.00010905
+
+*RES
+1 *286:A *72:4 9.24915
+2 *72:3 *72:4 0.957353
+3 *72:3 *72:2 9.81101
+4 *72:2 *293:Y 78.0302
+*END
+
+*D_NET *73 0.00329303
+
+*CONN
+*I *292:Y O *C 53.82 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *270:A I *C 48.843 70.3 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *267:B I *C 47.8 70.67 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *254:A0 I *C 48.48 63.64 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *73:4 0.00032527
+2 *73:5 0.00010363
+3 *73:6 0.00014596
+4 *73:7 4.766e-05
+5 *73:8 9.057e-05
+6 *73:9 0.00040072
+7 *73:11 0.00163917
+8 *73:12 0.00054005
+
+*RES
+1 *73:7 *73:9 0.04453
+2 *73:12 *73:9 6.51188
+3 *73:11 *73:12 4.47566
+4 *73:11 *73:5 27.0314
+5 *73:5 *292:Y 78.1317
+6 *73:9 *73:4 3.84876
+7 *73:8 *73:4 4.05581
+8 *270:A *73:8 9.24915
+9 *73:8 *73:10 0.445809
+10 *73:6 *73:10 1.14649
+11 *267:B *73:6 9.24915
+12 *254:A0 *73:7 9.24915
+*END
+
+*D_NET *74 0.00034372
+
+*CONN
+*I *291:Y O *C 64.735 84.36 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *279:A I *C 61.32 83.62 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *279:A 0.00034372
+
+*RES
+1 *279:A *291:Y 214.583
+*END
+
+*D_NET *75 0.00333274
+
+*CONN
+*I *290:Y O *C 94.19 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *280:A I *C 94.167 63.64 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+*I *278:B I *C 92.68 62.16 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *272:A0 I *C 96.33 63.64 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *290:Y 0.00013712
+2 *280:A 5.89e-05
+3 *272:A0 5.495e-05
+4 *75:4 0.00011057
+5 *75:5 0.00011442
+6 *75:6 0.00012261
+7 *75:7 0.00019221
+8 *75:8 0.00025359
+9 *75:9 3.003e-05
+10 *75:10 0.0001167
+11 *75:12 0.00027241
+12 *75:13 0.00085047
+13 *75:15 0.00016247
+14 *75:16 0.00021288
+15 *75:18 0.00064341
+
+*RES
+1 *75:12 *75:14 1.14649
+2 *75:13 *75:14 7.20066
+3 *75:13 *75:17 0.539107
+4 *75:16 *75:17 1.79291
+5 *75:16 *75:19 0.539107
+6 *75:18 *75:19 7.20066
+7 *75:15 *75:18 0.557028
+8 *75:15 *75:9 10.1277
+9 *290:Y *75:9 117.045
+10 *280:A *75:12 9.24915
+11 *75:7 *280:A 116.986
+12 *75:6 *75:7 90.8738
+13 *75:5 *75:6 78.6816
+14 *75:4 *75:5 30.7255
+15 *75:4 *278:B 39.7254
+16 *75:12 *75:8 10.1504
+17 *75:8 *75:11 234.801
+18 *75:10 *75:11 60.0304
+19 *272:A0 *75:10 39.7254
+*END
+
+*D_NET *76 0.00087981
+
+*CONN
+*I *289:Y O *C 45.96 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *277:A I *C 45.92 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *76:2 8.829e-05
+2 *76:3 0.00079152
+
+*RES
+1 *76:3 *76:2 9.01291
+2 *277:A *76:2 9.24915
+3 *289:Y *76:3 9.24915
+*END
+
+*D_NET *77 0.0010455
+
+*CONN
+*I *288:Y O *C 49.59 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *276:A I *C 46.25 63.64 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *276:A 0.00010631
+2 *77:2 9.872e-05
+3 *77:3 0.0001126
+4 *77:4 0.00072787
+
+*RES
+1 *77:4 *77:3 39.2643
+2 *276:A *77:3 78.7405
+3 *77:4 *77:2 16.0088
+4 *77:2 *288:Y 78.1317
+*END
+
+*D_NET *78 0.00252719
+
+*CONN
+*I *287:Y O *C 85.74 72.15 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *274:A I *C 95.153 63.64 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+*I *266:B I *C 87.4 63.27 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *287:Y 8.73e-05
+2 *274:A 4.201e-05
+3 *78:3 5.774e-05
+4 *78:4 0.00055705
+5 *78:5 6.315e-05
+6 *78:6 0.0001349
+7 *78:7 0.00102807
+8 *78:8 7.236e-05
+9 *78:10 0.00022793
+10 *78:11 0.00025668
+
+*RES
+1 *78:11 *78:4 2.69904
+2 *78:6 *78:4 15.1075
+3 *287:Y *78:6 68.2765
+4 *78:10 *78:11 0.557028
+5 *78:10 *78:3 11.029
+6 *78:3 *78:5 39.7254
+7 *78:5 *78:7 61.5301
+8 *78:7 *78:9 702.923
+9 *78:8 *78:9 29.9563
+10 *274:A *78:8 39.7254
+11 *78:5 *266:B 39.7254
+*END
+
+*D_NET *79 0.00017131
+
+*CONN
+*I *286:Y O *C 63.48 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *281:B0 I *C 61.56 76.22 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *281:B0 0.00017131
+
+*RES
+1 *281:B0 *286:Y 117.045
+*END
+
+*D_NET *80 0.00137359
+
+*CONN
+*I *285:Y O *C 65.1 48.47 *L 0 *D sky130_osu_sc_18T_ms__and2_l
+*I *271:A1 I *C 66.485 57.35 *L 0.00564 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *285:Y 3.134e-05
+2 *80:2 2.923e-05
+3 *80:3 0.0001044
+4 *80:4 0.00021556
+5 *80:5 0.00024839
+6 *80:6 0.00074467
+
+*RES
+1 *80:6 *80:7 7.20066
+2 *80:5 *80:7 0.539107
+3 *80:5 *80:3 10.5962
+4 *80:3 *271:A1 58.6241
+5 *80:4 *80:6 0.557028
+6 *80:4 *80:2 10.1277
+7 *285:Y *80:2 39.0151
+*END
+
+*D_NET *81 0.00309445
+
+*CONN
+*I *284:Y O *C 94.435 57.72 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *263:A I *C 93.43 70.3 *L 0.00432 *D sky130_osu_sc_18T_ms__and2_l
+*I *261:A I *C 94.83 75.11 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *248:B0 I *C 94.87 71.04 *L 0.00578 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *248:B0 3.465e-05
+2 *81:4 0.00038017
+3 *81:5 0.0007114
+4 *81:6 0.00011446
+5 *81:7 0.00055772
+6 *81:9 0.00010141
+7 *81:11 0.00013315
+8 *81:12 0.00091312
+9 *81:13 0.00014837
+
+*RES
+1 *81:6 *261:A 117.045
+2 *81:12 *81:6 15.0828
+3 *81:11 *81:12 0.561864
+4 *263:A *81:11 9.24915
+5 *81:12 *81:4 4.03305
+6 *81:5 *81:4 6.3042
+7 *81:5 *81:8 0.539107
+8 *81:7 *81:8 4.05097
+9 *284:Y *81:7 9.24915
+10 *81:12 *81:13 1.70835
+11 *81:13 *81:9 9.69496
+12 *81:9 *81:10 30.0152
+13 *248:B0 *81:10 39.7254
+*END
+
+*D_NET *82 0.00058014
+
+*CONN
+*I *283:Y O *C 63.39 58.83 *L 0 *D sky130_osu_sc_18T_ms__mux2_1
+*I *273:A I *C 60.33 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *273:A 8.863e-05
+2 *82:2 3.342e-05
+3 *82:3 0.00017253
+4 *82:4 0.00028556
+
+*RES
+1 *82:3 *82:4 9.24915
+2 *82:4 *82:2 10.6011
+3 *273:A *82:2 78.0302
+4 *82:3 *283:Y 97.5378
+*END
+
+*D_NET *83 0.00350515
+
+*CONN
+*I *282:Y O *C 82.15 61.79 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *273:B I *C 61.77 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *271:A0 I *C 66.965 56.98 *L 0.00538 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *83:3 9.562e-05
+2 *83:4 0.00105748
+3 *83:5 0.00022196
+4 *83:6 0.0004629
+5 *83:7 9.868e-05
+6 *83:8 0.00010837
+7 *83:9 6.129e-05
+8 *83:10 0.00066739
+9 *83:11 0.00073146
+
+*RES
+1 *83:11 *83:7 6.96438
+2 *83:7 *83:8 0.127608
+3 *273:B *83:8 9.24915
+4 *83:10 *83:11 4.47566
+5 *83:9 *83:10 0.066795
+6 *271:A0 *83:9 9.24915
+7 *83:10 *83:6 14.0601
+8 *83:6 *83:4 331.628
+9 *83:3 *83:4 761.505
+10 *83:3 *83:5 60.7996
+11 *83:5 *282:Y 117.291
+*END
+
+*D_NET *84 0.00355051
+
+*CONN
+*I *281:Y O *C 61.56 75.11 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *265:B I *C 49.5 83.99 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *258:A I *C 49.9 90.28 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *281:Y 0.00013174
+2 *265:B 4.964e-05
+3 *258:A 0.00010412
+4 *84:3 0.00023952
+5 *84:5 4.291e-05
+6 *84:6 0.00116152
+7 *84:7 4.376e-05
+8 *84:8 0.00049561
+9 *84:9 0.00093623
+10 *84:11 0.00034546
+
+*RES
+1 *258:A *84:5 78.0302
+2 *84:8 *84:5 13.7508
+3 *84:8 *84:10 0.539107
+4 *84:9 *84:10 3.60033
+5 *84:9 *84:3 127.005
+6 *84:3 *84:4 29.9563
+7 *265:B *84:4 39.7254
+8 *84:9 *84:6 16.4595
+9 *84:11 *84:6 906.597
+10 *84:11 *84:7 11.5024
+11 *281:Y *84:7 117.045
+*END
+
+*D_NET *85 0.00033873
+
+*CONN
+*I *280:Y O *C 93.95 61.79 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *274:B I *C 95.37 63.27 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+
+*CAP
+1 *280:Y 9.261e-05
+2 *85:2 0.00010476
+3 *85:3 0.00014136
+
+*RES
+1 *280:Y *85:3 78.7405
+2 *85:3 *85:2 90.8738
+3 *85:2 *274:B 58.4637
+*END
+
+*D_NET *86 0.00032305
+
+*CONN
+*I *278:Y O *C 91.465 62.9 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *266:A I *C 88.84 63.64 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *266:A 0.00032305
+
+*RES
+1 *266:A *278:Y 195.076
+*END
+
+*D_NET *87 0.0041439
+
+*CONN
+*I *277:Y O *C 46.4 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *269:A I *C 46.427 83.62 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+*I *268:B I *C 45.27 88.8 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *260:A0 I *C 47.16 83.62 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *269:A 6.542e-05
+2 *87:4 0.0006684
+3 *87:5 0.00103069
+4 *87:6 8.574e-05
+5 *87:7 5.497e-05
+6 *87:8 0.0005513
+7 *87:9 6.538e-05
+8 *87:10 0.00050122
+9 *87:11 0.0001222
+10 *87:13 9.573e-05
+11 *87:14 9.798e-05
+12 *87:15 0.00037713
+13 *87:16 5.802e-05
+14 *87:18 0.00036972
+
+*RES
+1 *268:B *87:14 9.24915
+2 *87:13 *87:14 0.896455
+3 *87:9 *87:13 0.557028
+4 *87:8 *87:9 4.92951
+5 *87:8 *87:12 0.539107
+6 *87:11 *87:12 0.896455
+7 *87:10 *87:11 4.95227
+8 *87:10 *87:19 1.12373
+9 *87:18 *87:19 3.59549
+10 *87:16 *87:18 0.557028
+11 *87:15 *87:16 3.57757
+12 *87:15 *87:17 0.539107
+13 *87:17 *87:4 7.65614
+14 *87:5 *87:4 9.91421
+15 *277:Y *87:5 9.24915
+16 *87:11 *87:6 48.9746
+17 *87:6 *87:7 30.7255
+18 *87:7 *269:A 38.9562
+19 *269:A *260:A0 58.5227
+*END
+
+*D_NET *88 0.00192479
+
+*CONN
+*I *276:Y O *C 46.73 61.79 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *270:B I *C 49.06 70.67 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *267:A I *C 46.36 70.3 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *254:A1 I *C 48.96 63.27 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *276:Y 6.389e-05
+2 *267:A 0.00014163
+3 *254:A1 6.3e-05
+4 *88:4 0.00034558
+5 *88:5 3.628e-05
+6 *88:6 6.47e-05
+7 *88:7 9.877e-05
+8 *88:8 0.00018467
+9 *88:9 5.882e-05
+10 *88:10 0.00024798
+11 *88:11 0.00061947
+
+*RES
+1 *254:A1 *88:8 39.7254
+2 *88:8 *88:10 90.1046
+3 *88:11 *88:10 205.035
+4 *88:11 *88:5 11.5024
+5 *276:Y *88:5 58.5227
+6 *88:11 *88:4 3.15452
+7 *88:9 *88:4 4.05581
+8 *267:A *88:9 9.24915
+9 *267:A *88:6 78.7405
+10 *88:6 *88:7 30.7255
+11 *88:7 *270:B 77.9713
+*END
+
+*D_NET *89 0.00249099
+
+*CONN
+*I *275:Y O *C 56.26 58.83 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *264:B I *C 63.59 63.27 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+*I *262:B I *C 59.24 62.16 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *252:B1 I *C 66.69 62.535 *L 0.00566 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *275:Y 0.00024535
+2 *252:B1 1.72e-06
+3 *89:4 2.522e-05
+4 *89:5 7.765e-05
+5 *89:6 0.00017201
+6 *89:7 0.00013897
+7 *89:8 0.00041321
+8 *89:9 7.189e-05
+9 *89:10 0.00026091
+10 *89:11 5.141e-05
+11 *89:12 9.302e-05
+12 *89:13 0.00093963
+
+*RES
+1 *275:Y *89:4 209.3
+2 *89:8 *89:4 13.0857
+3 *89:13 *89:8 6.05939
+4 *89:10 *89:13 4.47566
+5 *89:10 *89:5 10.3697
+6 *89:5 *89:6 30.7844
+7 *89:6 *264:B 75.9392
+8 *89:13 *89:12 6.51188
+9 *89:11 *89:12 0.105759
+10 *89:11 *89:7 69.5246
+11 *252:B1 *89:7 9.24485
+12 *89:8 *89:9 0.0918777
+13 *262:B *89:9 9.24915
+*END
+
+*D_NET *90 0.00012007
+
+*CONN
+*I *274:Y O *C 95.37 61.79 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *272:B0 I *C 97.29 62.9 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *274:Y 0.00012007
+
+*RES
+1 *274:Y *272:B0 117.045
+*END
+
+*D_NET *91 0.0017299
+
+*CONN
+*I *273:Y O *C 60.81 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *264:A I *C 63.11 63.64 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *262:A I *C 61.16 61.79 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *252:B0 I *C 65.94 62.9 *L 0.00578 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *273:Y 4.308e-05
+2 *264:A 0.00016361
+3 *91:4 5.401e-05
+4 *91:5 0.00067824
+5 *91:7 0.00010719
+6 *91:9 0.00015826
+7 *91:11 0.00016458
+8 *91:12 0.00036093
+
+*RES
+1 *264:A *91:8 117.756
+2 *91:7 *91:8 29.9563
+3 *91:7 *91:10 40.4357
+4 *91:9 *91:10 29.9563
+5 *91:9 *252:B0 55.5753
+6 *91:11 *252:B0 112.516
+7 *91:5 *91:11 468.892
+8 *91:5 *91:12 9.24915
+9 *91:12 *91:4 11.953
+10 *91:4 *91:6 39.7254
+11 *273:Y *91:6 22.6999
+12 *91:5 *262:A 24.9938
+*END
+
+*D_NET *92 0.00258572
+
+*CONN
+*I *272:Y O *C 97.29 61.79 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *263:B I *C 92.95 70.67 *L 0.00442 *D sky130_osu_sc_18T_ms__and2_l
+*I *261:B I *C 96.75 75.48 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *248:B1 I *C 95.62 71.405 *L 0.00566 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *263:B 0.00011342
+2 *92:4 0.00031457
+3 *92:5 8.456e-05
+4 *92:6 0.00051331
+5 *92:7 0.00023957
+6 *92:8 6.313e-05
+7 *92:9 0.00014379
+8 *92:10 0.0001843
+9 *92:11 6.032e-05
+10 *92:12 7.147e-05
+11 *92:13 5.056e-05
+12 *92:15 0.00037439
+13 *92:16 0.00037233
+
+*RES
+1 *92:15 *92:14 2.69904
+2 *92:16 *92:14 1.70835
+3 *92:16 *92:4 2.69904
+4 *92:8 *92:4 3.13176
+5 *92:8 *92:7 0.557028
+6 *92:7 *92:6 2.22563
+7 *92:9 *92:6 1.14649
+8 *248:B1 *92:9 9.24915
+9 *92:10 *248:B1 97.4788
+10 *92:11 *92:10 30.7255
+11 *92:12 *92:11 39.6665
+12 *92:13 *92:12 30.7255
+13 *263:B *92:13 78.7405
+14 *92:6 *92:5 4.95227
+15 *261:B *92:5 9.24915
+16 *272:Y *92:15 9.24915
+*END
+
+*D_NET *93 0.00450724
+
+*CONN
+*I *271:Y O *C 65.7 58.83 *L 0 *D sky130_osu_sc_18T_ms__oai22_l
+*I *259:A I *C 77.01 63.64 *L 0.00582 *D sky130_osu_sc_18T_ms__or2_1
+*I *257:B I *C 68.04 70.67 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *250:B1 I *C 80.04 62.535 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *271:Y 0.00018527
+2 *257:B 0.00018157
+3 *93:4 0.00018237
+4 *93:5 6.186e-05
+5 *93:6 0.00081477
+6 *93:7 9.039e-05
+7 *93:8 0.00018512
+8 *93:9 5.557e-05
+9 *93:10 0.00035139
+10 *93:11 0.00032533
+11 *93:12 3.025e-05
+12 *93:13 0.00017835
+13 *93:14 0.00092609
+14 *93:15 0.00049032
+15 *93:16 2.349e-05
+16 *93:17 0.0001924
+17 *93:19 0.0002327
+
+*RES
+1 *93:19 *93:15 12.8543
+2 *93:15 *93:6 604.734
+3 *93:14 *93:6 58.5227
+4 *93:11 *93:14 234.032
+5 *93:7 *93:11 60.7996
+6 *271:Y *93:7 137.263
+7 *93:14 *93:5 18.2393
+8 *93:16 *93:5 0.287474
+9 *93:16 *93:10 0.269553
+10 *93:18 *93:10 3.59549
+11 *93:13 *93:18 0.539107
+12 *93:13 *93:9 10.1456
+13 *257:B *93:9 156.06
+14 *93:17 *93:19 9.24915
+15 *93:17 *250:B1 113.286
+16 *93:19 *93:12 11.003
+17 *93:4 *93:12 78.7405
+18 *93:4 *93:8 90.8738
+19 *93:8 *259:A 78.4786
+*END
+
+*D_NET *94 0.00086249
+
+*CONN
+*I *270:Y O *C 49.06 72.15 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *256:B I *C 48.95 76.59 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+
+*CAP
+1 *270:Y 3.054e-05
+2 *256:B 0.00010423
+3 *94:2 2.817e-05
+4 *94:3 4.043e-05
+5 *94:4 0.00019967
+6 *94:5 0.00045945
+
+*RES
+1 *270:Y *94:2 39.0151
+2 *94:4 *94:2 10.5783
+3 *94:4 *94:5 0.557028
+4 *94:5 *94:3 13.3001
+5 *256:B *94:3 78.0302
+*END
+
+*D_NET *95 0.00060261
+
+*CONN
+*I *269:Y O *C 46.21 85.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *265:A I *C 49.283 83.62 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+
+*CAP
+1 *269:Y 6.587e-05
+2 *95:2 4.84e-05
+3 *95:3 0.00025811
+4 *95:4 0.00023023
+
+*RES
+1 *95:3 *265:A 78.0302
+2 *95:4 *95:3 10.1456
+3 *95:4 *95:2 10.9803
+4 *269:Y *95:2 58.5227
+*END
+
+*D_NET *96 0.00018186
+
+*CONN
+*I *268:Y O *C 46.485 89.54 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *258:B I *C 48.46 89.91 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *268:Y 0.00018186
+
+*RES
+1 *268:Y *258:B 156.06
+*END
+
+*D_NET *97 0.00063957
+
+*CONN
+*I *267:Y O *C 46.84 72.15 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *255:A I *C 45.77 75.11 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *267:Y 6.715e-05
+2 *255:A 5.517e-05
+3 *97:2 2.362e-05
+4 *97:3 0.0001196
+5 *97:4 0.00037403
+
+*RES
+1 *255:A *97:3 39.7254
+2 *97:4 *97:3 39.2643
+3 *97:4 *97:2 12.4037
+4 *267:Y *97:2 78.0302
+*END
+
+*D_NET *98 0.00375359
+
+*CONN
+*I *266:Y O *C 88.36 61.79 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *259:B I *C 76.53 63.27 *L 0.00561 *D sky130_osu_sc_18T_ms__or2_1
+*I *257:A I *C 69.48 70.3 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *250:B0 I *C 79.36 62.9 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *98:4 9.85e-05
+2 *98:5 4.287e-05
+3 *98:6 0.00073596
+4 *98:7 0.00051552
+5 *98:8 6.314e-05
+6 *98:9 9.508e-05
+7 *98:10 0.00041768
+8 *98:11 7.362e-05
+9 *98:12 0.00012311
+10 *98:13 0.0003101
+11 *98:15 6.881e-05
+12 *98:16 8.013e-05
+13 *98:18 7.732e-05
+14 *98:19 0.00105175
+
+*RES
+1 *98:15 *98:16 0.158234
+2 *250:B0 *98:16 9.24915
+3 *98:16 *98:17 0.445809
+4 *98:10 *98:17 3.48497
+5 *259:B *98:10 9.24915
+6 *98:10 *98:11 0.878534
+7 *98:11 *98:13 0.557028
+8 *98:13 *98:14 3.14485
+9 *98:12 *98:14 0.539107
+10 *98:12 *98:5 0.445809
+11 *98:4 *98:5 0.608981
+12 *98:6 *98:4 7.0775
+13 *98:7 *98:6 5.26752
+14 *98:7 *98:9 3.44683
+15 *257:A *98:9 9.24915
+16 *98:19 *98:15 8.54811
+17 *98:19 *98:18 4.50905
+18 *98:8 *98:18 9.24915
+19 *98:8 *266:Y 39.3195
+*END
+
+*D_NET *99 0.00018731
+
+*CONN
+*I *265:Y O *C 49.5 85.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *260:B0 I *C 48.12 84.36 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *260:B0 0.00018731
+
+*RES
+1 *260:B0 *265:Y 132.489
+*END
+
+*D_NET *100 0.0003431
+
+*CONN
+*I *264:Y O *C 64.55 61.79 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *252:A0 I *C 65.155 63.64 *L 0.00538 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *100:2 0.00010658
+2 *100:3 0.0001186
+3 *100:4 0.00011792
+
+*RES
+1 *100:4 *100:3 0.561864
+2 *100:3 *100:2 0.896455
+3 *252:A0 *100:2 9.24915
+4 *264:Y *100:4 9.24915
+*END
+
+*D_NET *101 0.00056723
+
+*CONN
+*I *263:Y O *C 91.99 72.15 *L 0 *D sky130_osu_sc_18T_ms__and2_l
+*I *248:A0 I *C 94.085 70.3 *L 0.00538 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *248:A0 5.515e-05
+2 *101:3 8.643e-05
+3 *101:4 2.004e-05
+4 *101:5 0.00040561
+
+*RES
+1 *101:4 *263:Y 19.4486
+2 *101:5 *101:4 90.8738
+3 *101:5 *101:3 235.511
+4 *101:3 *101:2 29.9563
+5 *248:A0 *101:2 39.7254
+*END
+
+*D_NET *102 0.00157476
+
+*CONN
+*I *262:Y O *C 60.455 62.9 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *253:B I *C 62.43 70.67 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *102:2 9.227e-05
+2 *102:3 0.0003478
+3 *102:4 0.00028414
+4 *102:5 8.239e-05
+5 *102:6 4.07e-05
+6 *102:7 0.00015977
+7 *102:8 0.00034584
+8 *102:9 0.00022185
+
+*RES
+1 *102:6 *253:B 38.9562
+2 *102:5 *102:6 60.7996
+3 *102:3 *102:5 234.801
+4 *102:9 *102:3 10.1456
+5 *102:9 *102:10 0.539107
+6 *102:10 *102:4 2.69904
+7 *102:8 *102:4 3.14968
+8 *102:7 *102:8 0.557028
+9 *102:7 *102:2 10.1277
+10 *102:2 *262:Y 97.5378
+*END
+
+*D_NET *103 0.00022035
+
+*CONN
+*I *261:Y O *C 95.535 76.22 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *249:B I *C 93.56 76.59 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *249:B 0.00022035
+
+*RES
+1 *249:B *261:Y 175.568
+*END
+
+*D_NET *104 0.001551
+
+*CONN
+*I *260:Y O *C 48.12 85.47 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *256:A I *C 48.733 76.96 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *255:B I *C 47.69 75.48 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *256:A 1.956e-05
+2 *255:B 5.313e-05
+3 *104:3 0.00013632
+4 *104:4 5.015e-05
+5 *104:5 5.108e-05
+6 *104:6 2.883e-05
+7 *104:7 0.00021622
+8 *104:8 0.00013617
+9 *104:9 0.00085954
+
+*RES
+1 *104:3 *104:4 120.948
+2 *104:4 *256:A 38.9562
+3 *256:A *104:5 23.4691
+4 *104:5 *104:6 38.9562
+5 *104:9 *104:6 18.2572
+6 *104:7 *104:9 1.12373
+7 *104:7 *104:8 0.896455
+8 *260:Y *104:8 9.24915
+9 *255:B *104:3 49.4792
+*END
+
+*D_NET *105 0.00018067
+
+*CONN
+*I *259:Y O *C 77.97 61.79 *L 0 *D sky130_osu_sc_18T_ms__or2_1
+*I *250:A0 I *C 78.4 63.64 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *259:Y 6.747e-05
+2 *105:2 0.0001132
+
+*RES
+1 *259:Y *105:2 59.233
+2 *105:2 *250:A0 60.0894
+*END
+
+*D_NET *106 0.00028438
+
+*CONN
+*I *257:Y O *C 69 72.15 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *251:B I *C 72 70.67 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *257:Y 0.00013601
+2 *106:2 1.437e-05
+3 *106:4 0.000134
+
+*RES
+1 *106:4 *251:B 78.7405
+2 *106:4 *106:3 29.9563
+3 *106:3 *106:2 20.2179
+4 *257:Y *106:2 136.553
+*END
+
+*D_NET *107 0.00208039
+
+*CONN
+*I *256:Y O *C 48.95 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *254:B0 I *C 49.44 62.9 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *256:Y 0.00021574
+2 *254:B0 0.00026439
+3 *107:2 0.00092213
+4 *107:3 0.00060133
+5 *107:4 7.68e-05
+
+*RES
+1 *256:Y *107:4 195.076
+2 *107:4 *107:2 20.5153
+3 *107:3 *107:2 14.2062
+4 *254:B0 *107:3 195.076
+*END
+
+*D_NET *108 0.00457768
+
+*CONN
+*I *254:Y O *C 49.44 61.79 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *253:A I *C 63.87 70.3 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *252:A1 I *C 65.635 63.27 *L 0.00564 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *254:Y 4.11e-05
+2 *253:A 0.00013218
+3 *108:3 0.0002101
+4 *108:4 5.702e-05
+5 *108:5 2.344e-05
+6 *108:6 0.00021304
+7 *108:7 0.00011043
+8 *108:8 0.00027928
+9 *108:9 8.407e-05
+10 *108:10 8.148e-05
+11 *108:12 0.00012933
+12 *108:13 0.000298
+13 *108:14 0.00035226
+14 *108:15 0.0005039
+15 *108:16 0.00125018
+16 *108:17 0.00081187
+
+*RES
+1 *108:15 *108:6 4.52473
+2 *108:12 *108:6 2.83785
+3 *108:16 *108:12 8.76616
+4 *108:16 *108:17 0.284267
+5 *108:17 *108:9 7.63492
+6 *108:7 *108:9 1.32274
+7 *108:7 *108:11 0.539107
+8 *108:11 *108:3 2.24839
+9 *108:14 *108:3 3.14968
+10 *108:10 *108:14 0.557028
+11 *108:8 *108:10 1.77499
+12 *108:8 *108:13 0.539107
+13 *108:13 *108:4 10.5962
+14 *254:Y *108:4 39.0151
+15 *108:12 *108:5 10.4671
+16 *253:A *108:5 117.045
+17 *252:A1 *108:15 9.24915
+*END
+
+*D_NET *109 0.00290376
+
+*CONN
+*I *252:Y O *C 66.42 61.79 *L 0 *D sky130_osu_sc_18T_ms__oai22_l
+*I *251:A I *C 73.44 70.3 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *250:A1 I *C 78.88 63.27 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *250:A1 4.901e-05
+2 *109:3 0.00028935
+3 *109:4 0.00026019
+4 *109:5 0.00081205
+5 *109:6 0.00016109
+6 *109:7 0.00012233
+7 *109:8 5.023e-05
+8 *109:9 0.00021762
+9 *109:11 0.00011297
+10 *109:12 0.00011236
+11 *109:13 9.802e-05
+12 *109:14 0.00061854
+
+*RES
+1 *109:11 *109:6 58.4637
+2 *251:A *109:6 136.553
+3 *109:8 *109:11 30.7255
+4 *109:3 *109:8 234.801
+5 *109:4 *109:3 12.8543
+6 *109:14 *109:4 3.60517
+7 *109:13 *109:14 1.3471
+8 *109:12 *109:13 1.14165
+9 *109:9 *109:12 1.10386
+10 *252:Y *109:9 9.24915
+11 *109:14 *109:5 301.863
+12 *109:10 *109:5 683.475
+13 *109:7 *109:10 60.0304
+14 *250:A1 *109:7 39.7254
+*END
+
+*D_NET *110 0.00520773
+
+*CONN
+*I *250:Y O *C 79.36 61.79 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *249:A I *C 92.12 76.96 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *248:A1 I *C 94.565 70.67 *L 0.00564 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *250:Y 9.922e-05
+2 *110:3 0.00029533
+3 *110:4 0.00014299
+4 *110:5 0.0002623
+5 *110:6 5.024e-05
+6 *110:7 0.00034882
+7 *110:8 0.00037158
+8 *110:9 6.214e-05
+9 *110:11 0.00056441
+10 *110:12 7.439e-05
+11 *110:13 0.00026531
+12 *110:14 9.145e-05
+13 *110:15 6.92e-05
+14 *110:16 6.221e-05
+15 *110:17 0.00026708
+16 *110:18 6.984e-05
+17 *110:19 0.00170183
+18 *110:3 *13:6 0.00040939
+
+*RES
+1 *248:A1 *110:13 9.24915
+2 *110:13 *110:14 1.34745
+3 *110:14 *110:15 0.557028
+4 *110:15 *110:16 0.423052
+5 *110:16 *110:17 0.557028
+6 *110:17 *110:18 2.46763
+7 *110:19 *110:18 6.73813
+8 *110:3 *110:19 4.47566
+9 *110:3 *110:4 12.6351
+10 *110:4 *249:A 78.6391
+11 *110:19 *110:12 9.4531
+12 *110:11 *110:12 5.62214
+13 *110:9 *110:11 0.557028
+14 *110:9 *110:5 3.13176
+15 *110:7 *110:5 3.60033
+16 *110:7 *110:10 0.539107
+17 *110:8 *110:10 2.24356
+18 *110:8 *110:6 9.81101
+19 *250:Y *110:6 82.0943
+*END
+
+*D_NET *111 0.00154737
+
+*CONN
+*I *248:Y O *C 95.35 72.15 *L 0 *D sky130_osu_sc_18T_ms__oai22_l
+*I *247:A I *C 96.21 83.62 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *111:2 7.513e-05
+2 *111:3 8.683e-05
+3 *111:4 0.00138541
+
+*RES
+1 *111:4 *111:3 48.9746
+2 *111:3 *247:A 22.4964
+3 *111:4 *111:2 22.7685
+4 *111:2 *248:Y 39.0151
+*END
+
+*D_NET *112 0.00376792
+
+*CONN
+*I *335:Y O *C 92.34 58.83 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *334:A I *C 91.75 85.47 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *335:Y 3.487e-05
+2 *112:2 0.000293
+3 *112:3 3.528e-05
+4 *112:4 0.00026555
+5 *112:5 7.219e-05
+6 *112:6 8.887e-05
+7 *112:8 0.00082721
+8 *112:9 0.00039868
+9 *112:10 9.119e-05
+10 *112:11 6.668e-05
+11 *112:12 0.00065072
+12 *112:13 0.00047609
+13 *112:15 0.00046759
+
+*RES
+1 *112:11 *112:15 0.557028
+2 *112:15 *112:16 3.59549
+3 *112:4 *112:16 1.12373
+4 *112:4 *112:6 1.32434
+5 *112:6 *112:13 0.557028
+6 *112:13 *112:14 4.49678
+7 *112:8 *112:14 0.539107
+8 *112:8 *112:10 9.90937
+9 *334:A *112:10 9.24915
+10 *112:11 *112:2 3.13176
+11 *112:9 *112:2 4.05097
+12 *112:9 *112:12 0.539107
+13 *112:12 *112:3 14.6521
+14 *112:3 *112:7 39.7254
+15 *112:5 *112:7 29.9563
+16 *335:Y *112:5 49.4792
+*END
+
+*D_NET *113 0.00022045
+
+*CONN
+*I *334:Y O *C 92.455 84.36 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *247:B I *C 94.77 83.99 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *334:Y 0.00022045
+
+*RES
+1 *334:Y *247:B 195.076
+*END
+
+*D_NET *114 0.00039404
+
+*CONN
+*I *337:Y O *C 48.18 48.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *336:A I *C 49.62 50.32 *L 0.00582 *D sky130_osu_sc_18T_ms__or2_1
+
+*CAP
+1 *114:2 9.035e-05
+2 *114:3 0.00011147
+3 *114:4 0.00019222
+
+*RES
+1 *114:4 *114:3 1.73111
+2 *114:3 *114:2 1.3471
+3 *336:A *114:2 9.24915
+4 *337:Y *114:4 9.24915
+*END
+
+*D_NET *115 0.00267832
+
+*CONN
+*I *336:Y O *C 50.58 48.47 *L 0 *D sky130_osu_sc_18T_ms__or2_1
+*I *276:B I *C 47.69 63.27 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *275:A0 I *C 55.3 56.98 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *336:Y 4.115e-05
+2 *276:B 2.64e-06
+3 *115:3 0.00022437
+4 *115:5 3.003e-05
+5 *115:6 0.00090971
+6 *115:7 2.691e-05
+7 *115:8 0.0004304
+8 *115:9 3.782e-05
+9 *115:10 0.00017805
+10 *115:11 0.00079724
+
+*RES
+1 *115:9 *275:A0 22.4964
+2 *115:8 *115:9 351.787
+3 *115:6 *115:8 117.756
+4 *115:10 *115:6 16.4546
+5 *115:10 *115:5 10.3956
+6 *115:3 *115:5 78.7405
+7 *115:3 *115:4 60.0304
+8 *276:B *115:4 10.4641
+9 *115:11 *115:8 40.0336
+10 *115:11 *115:7 17.3608
+11 *336:Y *115:7 48.7689
+*END
+
+*D_NET *116 0.00022161
+
+*CONN
+*I *242:A1 I *C 86.14 83.99 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *179:Y O *C 88.93 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *242:A1 0.00022161
+
+*RES
+1 *242:A1 *179:Y 195.076
+*END
+
+*D_NET *117 0.00200512
+
+*CONN
+*I *239:A1 I *C 61.61 89.91 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *180:Y O *C 60.66 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *117:2 8.64e-05
+2 *117:3 6.499e-05
+3 *117:4 0.00137328
+4 *117:6 7.606e-05
+5 *117:5 *24:5 0.00040439
+
+*RES
+1 *117:2 *117:3 30.7844
+2 *117:3 *239:A1 38.9562
+3 *117:6 *117:2 9.69496
+4 *117:5 *117:6 0.557028
+5 *117:4 *117:5 15.2992
+6 *180:Y *117:4 9.24915
+*END
+
+*D_NET *118 0.0001702
+
+*CONN
+*I *232:B I *C 88.55 89.91 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *181:Y O *C 90.47 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *232:B 0.0001702
+
+*RES
+1 *232:B *181:Y 136.553
+*END
+
+*D_NET *119 0.00616261
+
+*CONN
+*I *245:A I *C 79.39 90.28 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *182:Y O *C 81.23 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *182:Y 4e-05
+2 *119:2 0.00013829
+3 *119:3 2.682e-05
+4 *119:4 0.00077819
+5 *119:5 0.00167187
+6 *119:6 9.071e-05
+7 *119:7 6.444e-05
+8 *119:8 0.00011908
+9 *119:9 0.00013997
+10 *119:10 9.356e-05
+11 *119:11 0.00061904
+12 *119:12 6.49e-06
+13 *119:13 0.00063072
+14 *119:14 0.00019122
+15 *119:13 *9:9 0.0005611
+16 *119:11 *11:12 0.00043653
+17 *119:2 *14:5 0.00055458
+
+*RES
+1 *245:A *119:6 9.24915
+2 *119:4 *119:6 7.72187
+3 *119:10 *119:4 4.82917
+4 *119:14 *119:10 3.67569
+5 *119:12 *119:14 0.101117
+6 *119:11 *119:12 1.12495
+7 *119:11 *119:13 0.0999136
+8 *119:13 *119:9 4.49544
+9 *119:9 *119:7 5.02713
+10 *119:7 *119:2 2.09489
+11 *119:5 *119:2 19.8236
+12 *119:5 *119:8 0.539107
+13 *119:8 *119:3 10.1456
+14 *182:Y *119:3 58.5227
+*END
+
+*D_NET *120 0.00116625
+
+*CONN
+*I *183:Y O *C 59.89 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *180:A I *C 60.18 76.96 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *120:2 7.045e-05
+2 *120:3 0.00090817
+3 *120:4 9.768e-05
+4 *120:5 8.995e-05
+
+*RES
+1 *120:2 *180:A 78.0302
+2 *120:3 *120:2 16.8874
+3 *120:3 *120:4 0.557028
+4 *120:4 *120:5 0.896455
+5 *183:Y *120:5 9.24915
+*END
+
+*D_NET *121 0.00178835
+
+*CONN
+*I *188:A I *C 98.68 63.64 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+*I *184:Y O *C 99.82 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *188:A 0.00030989
+2 *184:Y 6.014e-05
+3 *121:2 2.465e-05
+4 *121:3 2.344e-05
+5 *121:4 0.00137023
+
+*RES
+1 *184:Y *121:2 78.0302
+2 *121:4 *121:2 25.923
+3 *121:3 *121:4 9.24915
+4 *188:A *121:3 234.091
+*END
+
+*D_NET *122 0.00402947
+
+*CONN
+*I *200:A I *C 74.48 76.96 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+*I *185:Y O *C 77.05 45.51 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *122:2 0.00020225
+2 *122:3 0.0011036
+3 *122:4 0.00010017
+4 *122:5 0.00049928
+5 *122:6 0.00212417
+
+*RES
+1 *122:4 *122:3 12.1674
+2 *122:5 *122:3 4.95227
+3 *122:5 *122:6 0.539107
+4 *122:6 *122:2 30.4247
+5 *122:2 *185:Y 195.076
+6 *200:A *122:4 9.24915
+*END
+
+*D_NET *123 0.00208785
+
+*CONN
+*I *222:QN O *C 73.05 63.27 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *186:A I *C 81.85 56.98 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *123:2 0.0001003
+2 *123:3 0.00083954
+3 *123:4 7.698e-05
+4 *123:5 0.00107103
+
+*RES
+1 *123:5 *123:2 48.9746
+2 *123:2 *222:QN 22.4964
+3 *123:5 *123:3 17.3608
+4 *123:3 *123:4 663.967
+5 *123:4 *186:A 52.5706
+*END
+
+*D_NET *124 0.00212576
+
+*CONN
+*I *230:B I *C 71.17 89.91 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *187:Y O *C 87.39 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *230:B 0.0006219
+2 *124:2 0.00016603
+3 *124:3 4.909e-05
+4 *124:5 0.00110246
+5 *124:7 0.00018628
+
+*RES
+1 *124:5 *124:3 625.662
+2 *124:3 *124:2 30.7255
+3 *124:2 *187:Y 87.7251
+4 *124:5 *124:4 120.179
+5 *124:7 *124:4 79.4508
+6 *124:7 *124:6 29.9563
+7 *230:B *124:6 507.907
+*END
+
+*D_NET *125 0.00230991
+
+*CONN
+*I *240:A1 I *C 89.87 70.67 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *188:Y O *C 99.16 61.79 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *240:A1 0.00013213
+2 *125:2 0.00026754
+3 *125:3 0.00019689
+4 *125:4 3.798e-05
+5 *125:5 5.587e-05
+6 *125:6 0.00010734
+7 *125:7 0.00028453
+8 *125:8 0.00016477
+9 *125:10 0.00106286
+
+*RES
+1 *125:6 *125:4 9.32571
+2 *240:A1 *125:4 117.045
+3 *125:10 *125:6 8.54811
+4 *125:10 *125:8 5.64006
+5 *125:8 *125:9 0.539107
+6 *125:9 *125:2 3.14968
+7 *125:7 *125:2 3.14968
+8 *125:5 *125:7 0.557028
+9 *125:3 *125:5 1.32918
+10 *188:Y *125:3 9.24915
+*END
+
+*D_NET *126 0.00193429
+
+*CONN
+*I *205:A I *C 41.26 63.64 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+*I *189:Y O *C 43.17 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *126:2 0.00028107
+2 *126:3 4.858e-05
+3 *126:4 0.00070595
+4 *126:5 5.587e-05
+5 *126:6 0.00012436
+6 *126:7 0.00071846
+
+*RES
+1 *126:3 *205:A 39.0151
+2 *126:7 *126:3 16.4546
+3 *126:5 *126:7 0.557028
+4 *126:4 *126:5 8.53467
+5 *126:4 *126:6 0.539107
+6 *126:6 *126:2 10.1456
+7 *126:2 *189:Y 195.076
+*END
+
+*D_NET *127 0.00081355
+
+*CONN
+*I *196:A I *C 100.11 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+*I *190:Y O *C 100.26 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *127:3 0.00043422
+2 *127:4 8.551e-05
+3 *127:5 0.00010367
+4 *127:6 6.368e-05
+5 *127:7 0.00012647
+
+*RES
+1 *127:7 *127:6 0.878534
+2 *127:6 *127:3 0.557028
+3 *127:3 *127:2 4.04614
+4 *127:5 *127:2 0.539107
+5 *127:5 *127:4 0.896455
+6 *196:A *127:4 9.24915
+7 *190:Y *127:7 9.24915
+*END
+
+*D_NET *128 0.00146116
+
+*CONN
+*I *241:A1 I *C 81.51 76.59 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *191:Y O *C 73.53 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *128:2 0.00016026
+2 *128:3 0.0001011
+3 *128:5 2.714e-05
+4 *128:6 7.803e-05
+5 *128:7 0.00109463
+
+*RES
+1 *128:3 *128:4 0.106008
+2 *128:7 *128:4 7.64312
+3 *128:6 *128:7 4.47566
+4 *128:5 *128:6 0.0166987
+5 *128:2 *128:5 9.24915
+6 *128:2 *241:A1 78.0302
+7 *191:Y *128:3 9.24915
+*END
+
+*D_NET *129 0.0015079
+
+*CONN
+*I *231:B I *C 70.52 83.99 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *192:Y O *C 77.38 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *192:Y 4.162e-05
+2 *129:2 0.00014708
+3 *129:3 5.403e-05
+4 *129:4 0.000553
+5 *129:5 0.00023407
+6 *129:6 0.00015123
+7 *129:7 0.0001441
+8 *129:9 0.00018277
+
+*RES
+1 *129:2 *129:4 97.5378
+2 *129:3 *129:4 410.369
+3 *129:3 *129:5 30.7255
+4 *129:5 *129:7 156.712
+5 *129:7 *129:8 60.0304
+6 *192:Y *129:8 59.233
+7 *129:9 *129:2 10.1504
+8 *129:9 *129:6 40.0336
+9 *129:6 *231:B 38.9562
+*END
+
+*D_NET *130 0.00049049
+
+*CONN
+*I *235:A1 I *C 55.22 63.27 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *193:Y O *C 58.13 61.79 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *235:A1 9.025e-05
+2 *130:2 0.00011199
+3 *130:4 8.476e-05
+4 *130:5 0.00020349
+
+*RES
+1 *130:2 *130:3 30.0152
+2 *235:A1 *130:3 78.7405
+3 *130:5 *130:2 11.003
+4 *130:4 *130:5 9.24915
+5 *130:4 *193:Y 58.5227
+*END
+
+*D_NET *131 0.00107697
+
+*CONN
+*I *194:Y O *C 42.84 58.83 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+*I *189:A I *C 42.69 50.32 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *131:2 0.00012331
+2 *131:3 0.00014255
+3 *131:4 0.00081111
+
+*RES
+1 *131:2 *189:A 78.0302
+2 *131:4 *131:2 17.8114
+3 *131:3 *131:4 9.24915
+4 *131:3 *194:Y 117.045
+*END
+
+*D_NET *132 0.00250866
+
+*CONN
+*I *195:Y O *C 72.43 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *187:A I *C 86.91 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *195:Y 8.176e-05
+2 *132:2 4.283e-05
+3 *132:3 0.00036591
+4 *132:4 0.00039988
+5 *132:5 0.0012122
+6 *132:5 *9:13 0.00040608
+
+*RES
+1 *187:A *132:4 9.24915
+2 *132:5 *132:4 7.73979
+3 *132:5 *132:3 10.8106
+4 *132:3 *132:2 11.8434
+5 *195:Y *132:2 78.0302
+*END
+
+*D_NET *133 0.00333132
+
+*CONN
+*I *198:Y O *C 98.5 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+*I *184:A I *C 99.34 50.32 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *133:2 4.609e-05
+2 *133:3 0.00012829
+3 *133:4 0.00102588
+4 *133:5 0.00022467
+5 *133:6 0.00033726
+6 *133:7 7.609e-05
+7 *133:8 0.00094889
+8 *133:9 0.00054415
+
+*RES
+1 *133:9 *133:10 4.94743
+2 *133:5 *133:10 1.12373
+3 *133:5 *133:4 1.3471
+4 *133:4 *133:3 19.1634
+5 *133:3 *198:Y 78.0302
+6 *133:7 *133:9 0.557028
+7 *133:6 *133:7 3.12693
+8 *133:6 *133:8 0.539107
+9 *133:8 *133:2 20.0598
+10 *133:2 *184:A 39.0151
+*END
+
+*D_NET *134 0.00136804
+
+*CONN
+*I *199:Y O *C 68.25 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+*I *192:A I *C 76.9 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *134:2 0.00071986
+2 *134:3 0.00041882
+3 *134:4 0.00010147
+4 *134:6 0.00012789
+
+*RES
+1 *192:A *134:4 9.24915
+2 *134:4 *134:6 0.17812
+3 *134:6 *134:2 7.0775
+4 *134:3 *134:2 5.49377
+5 *134:3 *134:5 0.00510432
+6 *199:Y *134:5 9.24915
+*END
+
+*D_NET *135 0.00059975
+
+*CONN
+*I *200:Y O *C 74.96 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *191:A I *C 73.05 76.96 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *200:Y 5.251e-05
+2 *191:A 7.964e-05
+3 *135:3 0.00015708
+4 *135:4 0.00026314
+5 *135:5 4.738e-05
+
+*RES
+1 *135:4 *135:2 156.712
+2 *135:3 *135:2 60.0304
+3 *200:Y *135:3 59.233
+4 *135:5 *135:4 30.7255
+5 *191:A *135:5 78.7405
+*END
+
+*D_NET *136 0.00027617
+
+*CONN
+*I *238:A1 I *C 56.54 70.67 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *201:Y O *C 58.9 72.15 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *238:A1 0.00027617
+
+*RES
+1 *238:A1 *201:Y 175.568
+*END
+
+*D_NET *137 0.00076092
+
+*CONN
+*I *202:Y O *C 52.08 61.79 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+*I *193:A I *C 57.65 63.64 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *202:Y 8.102e-05
+2 *137:3 0.00015566
+3 *137:4 0.00038942
+4 *137:5 0.00013482
+
+*RES
+1 *137:5 *137:4 90.8738
+2 *137:4 *137:2 273.757
+3 *137:3 *137:2 60.0304
+4 *137:3 *193:A 39.7254
+5 *202:Y *137:5 78.7405
+*END
+
+*D_NET *138 0.00457108
+
+*CONN
+*I *211:A I *C 66.34 50.32 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+*I *203:Y O *C 97.84 45.51 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *211:A 0.00050062
+2 *203:Y 1.787e-05
+3 *138:2 0.00304813
+4 *138:3 0.00010167
+5 *138:4 5.786e-05
+6 *138:5 3.158e-05
+7 *138:6 3.241e-05
+8 *138:7 0.00047643
+9 *138:8 0.00030451
+
+*RES
+1 *138:6 *138:8 9.24915
+2 *138:8 *138:4 11.5024
+3 *203:Y *138:4 24.7909
+4 *138:6 *138:2 2204.35
+5 *138:3 *138:2 58.5227
+6 *138:7 *138:3 12.4037
+7 *138:5 *138:7 9.24915
+8 *211:A *138:5 351.136
+*END
+
+*D_NET *139 0.00347398
+
+*CONN
+*I *235:Y O *C 54.74 61.79 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *204:A I *C 43.02 43.66 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *139:2 0.00133558
+2 *139:3 4.078e-05
+3 *139:4 0.00134948
+4 *139:5 5.612e-05
+5 *139:6 0.00017024
+6 *139:7 0.00052178
+
+*RES
+1 *139:3 *235:Y 26.3063
+2 *139:2 *139:3 937.073
+3 *139:6 *139:2 10.1456
+4 *139:6 *139:8 0.539107
+5 *139:7 *139:8 4.94743
+6 *139:5 *139:7 0.557028
+7 *139:4 *139:5 15.7498
+8 *204:A *139:4 9.24915
+*END
+
+*D_NET *140 0.00458293
+
+*CONN
+*I *234:B I *C 56.66 83.99 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *205:Y O *C 41.74 61.79 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *234:B 5.836e-05
+2 *205:Y 5.15e-05
+3 *140:2 0.00025606
+4 *140:3 3.796e-05
+5 *140:4 2.478e-05
+6 *140:5 2.603e-05
+7 *140:6 6.769e-05
+8 *140:7 0.00030592
+9 *140:8 0.00085504
+10 *140:9 3.6e-05
+11 *140:10 0.00017333
+12 *140:11 0.00057493
+13 *140:12 8.778e-05
+14 *140:13 0.0001879
+15 *140:14 0.00015748
+16 *140:15 0.0011899
+17 *140:8 *142:2 0.00049227
+
+*RES
+1 *140:10 *140:5 10.1456
+2 *140:3 *140:5 38.9562
+3 *205:Y *140:3 53.5433
+4 *140:7 *140:10 0.539107
+5 *140:7 *140:2 2.69904
+6 *140:6 *140:2 3.13176
+7 *140:6 *140:8 0.557028
+8 *140:8 *140:9 9.33693
+9 *140:15 *140:9 10.8106
+10 *140:15 *140:13 5.49391
+11 *140:11 *140:13 0.539107
+12 *140:11 *140:12 6.28145
+13 *140:12 *140:14 0.557028
+14 *140:14 *140:4 10.1456
+15 *234:B *140:4 53.2394
+*END
+
+*D_NET *141 0.00467858
+
+*CONN
+*I *206:Y O *C 97.4 58.83 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *181:A I *C 89.99 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *206:Y 7.82e-05
+2 *181:A 0.00069887
+3 *141:2 0.00233529
+4 *141:3 0.00011255
+5 *141:4 0.00027135
+6 *141:5 3.631e-05
+7 *141:7 0.00012195
+8 *141:8 8.368e-05
+9 *141:9 0.00046332
+10 *141:11 0.00047706
+
+*RES
+1 *141:11 *141:5 13.3001
+2 *141:3 *141:5 77.9713
+3 *206:Y *141:3 55.5753
+4 *141:9 *141:11 0.246796
+5 *141:9 *141:10 4.04614
+6 *141:7 *141:10 0.246796
+7 *141:7 *141:2 0.896455
+8 *141:8 *141:2 36.7385
+9 *141:4 *141:8 117.756
+10 *141:4 *141:6 60.0304
+11 *181:A *141:6 624.952
+*END
+
+*D_NET *142 0.00422384
+
+*CONN
+*I *207:Y O *C 41.74 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *195:A I *C 71.95 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *207:Y 2.9e-05
+2 *142:2 0.00026109
+3 *142:3 8.324e-05
+4 *142:4 8.62e-06
+5 *142:5 2.652e-05
+6 *142:6 0.00057092
+7 *142:7 1.644e-05
+8 *142:8 0.00254621
+9 *142:9 0.00018953
+10 *142:2 *140:8 0.00049227
+
+*RES
+1 *142:6 *142:7 4.47566
+2 *142:7 *142:4 0.113124
+3 *142:9 *142:4 0.790238
+4 *142:8 *142:9 0.277693
+5 *142:8 *142:2 16.0061
+6 *142:2 *142:5 12.2575
+7 *207:Y *142:5 78.0302
+8 *142:6 *142:3 14.0601
+9 *142:3 *195:A 39.0151
+*END
+
+*D_NET *143 0.00070343
+
+*CONN
+*I *210:Y O *C 73.86 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *182:A I *C 80.75 50.32 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *210:Y 6.356e-05
+2 *143:3 0.00019538
+3 *143:4 0.00025392
+4 *143:5 5.606e-05
+5 *143:6 7.312e-05
+6 *143:7 6.139e-05
+
+*RES
+1 *143:7 *143:6 30.7255
+2 *143:6 *143:5 39.6665
+3 *143:5 *143:4 30.7255
+4 *143:4 *143:2 156.712
+5 *143:3 *143:2 29.9563
+6 *143:3 *182:A 79.2479
+7 *210:Y *143:7 78.7405
+*END
+
+*D_NET *144 0.00209588
+
+*CONN
+*I *222:D I *C 68.25 62.53 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+*I *211:Y O *C 66.82 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *144:3 0.00110016
+2 *144:5 0.00045184
+3 *144:6 8.704e-05
+4 *144:7 0.00045684
+
+*RES
+1 *144:3 *144:2 8.55743
+2 *144:5 *144:2 0.539107
+3 *144:5 *144:4 2.6942
+4 *144:7 *144:4 0.539107
+5 *144:7 *144:6 4.05097
+6 *222:D *144:6 9.24915
+7 *211:Y *144:3 9.24915
+*END
+
+*D_NET *145 0.00552217
+
+*CONN
+*I *212:Y O *C 67.15 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *206:A I *C 96.92 56.98 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *212:Y 5.227e-05
+2 *145:2 7.781e-05
+3 *145:3 0.00076376
+4 *145:4 0.00012716
+5 *145:5 0.000648
+6 *145:6 0.00012013
+7 *145:7 0.00047218
+8 *145:9 7.349e-05
+9 *145:10 0.00220761
+10 *145:11 0.00097976
+
+*RES
+1 *212:Y *145:8 78.7405
+2 *145:6 *145:8 29.9563
+3 *145:6 *145:4 59.233
+4 *145:2 *145:4 136.553
+5 *145:3 *145:2 18.7127
+6 *145:5 *145:3 6.82058
+7 *145:11 *145:5 7.86117
+8 *145:10 *145:11 0.284267
+9 *145:10 *145:9 12.3861
+10 *145:7 *145:9 4.60389
+11 *206:A *145:7 9.24915
+*END
+
+*D_NET *146 0.00134949
+
+*CONN
+*I *227:B I *C 79.21 76.59 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *213:Y O *C 80.79 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *227:B 0.00011724
+2 *146:2 6.44e-05
+3 *146:3 0.00013428
+4 *146:4 4.615e-05
+5 *146:5 0.00098742
+
+*RES
+1 *146:3 *146:4 77.9713
+2 *146:5 *146:4 17.7627
+3 *213:Y *146:5 9.24915
+4 *146:2 *146:3 30.7255
+5 *227:B *146:2 78.7405
+*END
+
+*D_NET *147 0.00225729
+
+*CONN
+*I *233:B I *C 87.57 70.67 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *214:Y O *C 97.18 72.15 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *147:2 0.00022732
+2 *147:3 0.00010324
+3 *147:4 0.00022239
+4 *147:5 0.00013488
+5 *147:6 0.00109357
+6 *147:7 0.00012209
+7 *147:8 8.798e-05
+8 *147:9 0.00026582
+
+*RES
+1 *147:2 *147:3 1.68688
+2 *233:B *147:3 9.24915
+3 *147:7 *147:2 5.1462
+4 *147:6 *147:7 0.284267
+5 *147:6 *147:8 3.60356
+6 *147:8 *147:9 0.277693
+7 *147:9 *147:4 5.15277
+8 *147:4 *147:5 1.65034
+9 *214:Y *147:5 9.24915
+*END
+
+*D_NET *148 0.00297954
+
+*CONN
+*I *215:Y O *C 42.18 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *194:A I *C 42.36 56.98 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *148:2 0.00165945
+2 *148:3 9.322e-05
+3 *148:4 0.00122687
+
+*RES
+1 *215:Y *148:3 9.24915
+2 *148:3 *148:2 20.7297
+3 *148:4 *148:2 12.1674
+4 *194:A *148:4 9.24915
+*END
+
+*D_NET *149 0.00120886
+
+*CONN
+*I *229:B I *C 54.24 70.67 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *216:Y O *C 41.85 72.15 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *149:2 0.00045253
+2 *149:3 8.664e-05
+3 *149:4 0.00066969
+
+*RES
+1 *149:3 *149:2 60.7996
+2 *149:2 *229:B 351.077
+3 *149:4 *149:3 469.602
+4 *149:4 *216:Y 58.209
+*END
+
+*D_NET *150 0.00621413
+
+*CONN
+*I *218:Y O *C 81.34 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *210:A I *C 73.38 50.32 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *218:Y 2.398e-05
+2 *210:A 0.00033475
+3 *150:2 0.000557
+4 *150:3 0.00010361
+5 *150:4 3.308e-05
+6 *150:5 0.0006439
+7 *150:6 5.977e-05
+8 *150:7 0.00196839
+9 *150:8 0.00140303
+10 *150:9 9.383e-05
+11 *150:10 0.00037939
+12 *150:10 *11:10 0.0006134
+
+*RES
+1 *150:6 *150:2 6.28628
+2 *150:7 *150:2 28.1763
+3 *150:5 *150:7 546.153
+4 *150:3 *150:5 90.8738
+5 *210:A *150:3 234.801
+6 *150:6 *150:8 0.557028
+7 *150:8 *150:9 16.1957
+8 *150:9 *150:10 1.14165
+9 *150:10 *150:4 13.3001
+10 *218:Y *150:4 39.0151
+*END
+
+*D_NET *159 0.0127336
+
+*CONN
+*I *246:Y O *C 85.47 88.43 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *242:A0 I *C 85.66 83.62 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *241:A0 I *C 81.99 76.96 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *240:A0 I *C 90.35 70.3 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *239:A0 I *C 61.13 90.28 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *238:A0 I *C 57.02 70.3 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *237:A0 I *C 55.7 83.62 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *236:A0 I *C 75.94 83.62 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *235:A0 I *C 55.7 63.64 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *246:Y 4.1e-05
+2 *242:A0 1.257e-05
+3 *241:A0 0.0005618
+4 *159:9 0.00011705
+5 *159:10 0.0005535
+6 *159:11 0.00026781
+7 *159:12 0.00028802
+8 *159:13 0.00038527
+9 *159:14 0.00075366
+10 *159:15 7.23e-06
+11 *159:16 7.223e-05
+12 *159:17 0.00100885
+13 *159:18 0.00049668
+14 *159:19 1.759e-05
+15 *159:20 0.00012617
+16 *159:22 4.789e-05
+17 *159:23 0.00019196
+18 *159:24 4.583e-05
+19 *159:25 2.344e-05
+20 *159:26 0.00025247
+21 *159:28 0.00048851
+22 *159:29 0.00030651
+23 *159:30 0.00128746
+24 *159:31 0.00052686
+25 *159:32 8.902e-05
+26 *159:33 0.00055582
+27 *159:34 0.00056539
+28 *159:35 3.069e-05
+29 *159:36 0.00041372
+30 *159:37 7.684e-05
+31 *159:38 0.00020283
+32 *159:39 0.00022905
+33 *159:40 7.528e-05
+34 *159:41 0.00023772
+35 *159:17 *9:16 0.00067854
+36 *159:14 *11:13 0.00065534
+37 *159:11 *29:2 0.00044347
+38 *159:9 *10:9 0.00059953
+
+*RES
+1 *159:34 *159:35 6.28628
+2 *159:35 *159:22 9.82893
+3 *246:Y *159:22 58.5227
+4 *242:A0 *159:34 9.24915
+5 *159:18 *242:A0 312.062
+6 *159:33 *159:18 40.0336
+7 *159:33 *159:15 15.5582
+8 *241:A0 *159:15 82.9071
+9 *241:A0 *159:25 507.197
+10 *159:39 *159:25 11.0469
+11 *159:37 *159:39 0.557028
+12 *159:36 *159:37 3.57757
+13 *159:36 *159:38 0.539107
+14 *159:38 *159:24 11.0469
+15 *159:24 *159:27 39.7254
+16 *159:26 *159:27 60.0304
+17 *159:26 *240:A0 118.263
+18 *159:10 *159:15 507.197
+19 *159:31 *159:10 14.9127
+20 *159:41 *159:31 5.15277
+21 *159:40 *159:41 0.277693
+22 *159:40 *159:12 1.46241
+23 *159:29 *159:12 1.46241
+24 *159:29 *159:30 0.284267
+25 *159:30 *159:19 10.3499
+26 *159:17 *159:19 15.1271
+27 *159:9 *159:17 9.24915
+28 *159:9 *238:A0 97.7407
+29 *159:17 *159:11 4.05581
+30 *159:13 *159:11 3.94619
+31 *235:A0 *159:13 9.24915
+32 *159:19 *159:20 1.03527
+33 *237:A0 *159:20 9.24915
+34 *159:20 *159:21 0.957353
+35 *159:14 *159:21 1.12373
+36 *159:14 *159:16 7.65614
+37 *159:28 *159:16 7.64312
+38 *159:28 *159:23 4.66452
+39 *239:A0 *159:23 9.24915
+40 *159:31 *159:32 1.03527
+41 *236:A0 *159:32 9.24915
+*END
+
+*D_NET *160 0.00337667
+
+*CONN
+*I *242:Y O *C 86.62 85.47 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *212:A I *C 66.67 76.96 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *212:A 0.0002071
+2 *160:2 2.482e-05
+3 *160:3 0.00128387
+4 *160:4 4.663e-05
+5 *160:5 0.0003243
+6 *160:6 0.00024939
+7 *160:7 0.00033081
+8 *160:8 0.00016755
+9 *160:9 0.00039455
+10 *160:10 0.00034765
+
+*RES
+1 *160:6 *160:7 9.24915
+2 *160:7 *160:4 11.953
+3 *212:A *160:4 156.06
+4 *160:6 *160:3 214.583
+5 *160:2 *160:3 1072.92
+6 *160:8 *160:2 10.1277
+7 *160:8 *160:10 0.557028
+8 *160:10 *160:11 3.59549
+9 *160:9 *160:11 0.539107
+10 *160:9 *160:5 11.9482
+11 *160:5 *242:Y 234.091
+*END
+
+*D_NET *161 0.00133668
+
+*CONN
+*I *241:Y O *C 81.03 75.11 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *213:A I *C 80.31 83.62 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *161:2 8.247e-05
+2 *161:3 0.00010645
+3 *161:4 0.00114776
+
+*RES
+1 *161:4 *161:2 1.14649
+2 *241:Y *161:2 9.24915
+3 *161:4 *161:3 10.4209
+4 *213:A *161:3 9.24915
+*END
+
+*D_NET *162 0.00121013
+
+*CONN
+*I *240:Y O *C 89.39 72.15 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *214:A I *C 96.7 70.3 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *240:Y 7.073e-05
+2 *162:3 0.00035126
+3 *162:4 0.00078814
+
+*RES
+1 *162:3 *214:A 39.7254
+2 *162:3 *162:2 210.401
+3 *162:4 *162:2 546.863
+4 *240:Y *162:4 53.5433
+*END
+
+*D_NET *163 0.00425985
+
+*CONN
+*I *239:Y O *C 62.09 88.43 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *207:A I *C 41.26 76.96 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *239:Y 5.612e-05
+2 *163:2 2.851e-05
+3 *163:3 0.00068023
+4 *163:4 5.407e-05
+5 *163:5 0.00015739
+6 *163:7 7.632e-05
+7 *163:8 6.088e-05
+8 *163:9 0.00047523
+9 *163:10 0.0026711
+
+*RES
+1 *207:A *163:5 9.24915
+2 *163:5 *163:6 0.896455
+3 *163:3 *163:6 0.539107
+4 *163:3 *163:4 8.08403
+5 *163:4 *163:7 0.557028
+6 *163:7 *163:8 0.969533
+7 *163:10 *163:8 14.883
+8 *163:9 *163:10 4.47566
+9 *163:9 *163:2 13.2319
+10 *239:Y *163:2 78.0302
+*END
+
+*D_NET *164 0.00081545
+
+*CONN
+*I *238:Y O *C 56.06 72.15 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *228:B I *C 61.16 70.67 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+
+*CAP
+1 *238:Y 0.000206
+2 *164:3 0.00026201
+3 *164:4 0.0002974
+4 *164:5 5.004e-05
+
+*RES
+1 *164:4 *164:2 195.727
+2 *164:3 *164:2 150.253
+3 *164:3 *228:B 39.7254
+4 *164:5 *164:4 30.7255
+5 *238:Y *164:5 166.525
+*END
+
+*D_NET *165 0.00182066
+
+*CONN
+*I *237:Y O *C 54.74 85.47 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *215:A I *C 41.7 83.62 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *215:A 0.00043819
+2 *165:3 0.00050012
+3 *165:4 0.0005929
+4 *165:5 0.00028945
+
+*RES
+1 *165:4 *165:2 390.802
+2 *165:3 *165:2 29.9563
+3 *165:3 *237:Y 351.846
+4 *165:5 *165:4 181.096
+5 *215:A *165:5 312.831
+*END
+
+*D_NET *166 0.00121588
+
+*CONN
+*I *236:Y O *C 74.98 85.47 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *199:A I *C 67.77 83.62 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *236:Y 4.558e-05
+2 *166:2 0.00041453
+3 *166:3 0.00042666
+4 *166:5 0.00032911
+
+*RES
+1 *166:5 *166:3 11.953
+2 *166:3 *166:2 292.613
+3 *166:4 *166:2 293.324
+4 *236:Y *166:4 25.9511
+5 *199:A *166:5 9.24915
+*END
+
+*D_NET *167 0.003344
+
+*CONN
+*I *216:A I *C 41.37 70.3 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+*I *204:Y O *C 43.5 45.51 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *216:A 0.00018662
+2 *204:Y 5.886e-05
+3 *167:2 0.00020378
+4 *167:3 0.00010896
+5 *167:4 0.00031161
+6 *167:5 3.623e-05
+7 *167:7 0.00069735
+8 *167:8 7.97e-05
+9 *167:9 5.587e-05
+10 *167:10 0.00037933
+11 *167:11 0.00122569
+
+*RES
+1 *167:11 *167:2 13.5145
+2 *167:8 *167:2 11.953
+3 *167:4 *167:8 156.771
+4 *167:4 *167:6 90.1046
+5 *216:A *167:6 156.771
+6 *167:9 *167:11 0.557028
+7 *167:7 *167:9 8.08403
+8 *167:7 *167:10 0.539107
+9 *167:10 *167:5 12.8495
+10 *167:3 *167:5 77.9713
+11 *204:Y *167:3 56.7945
+*END
+
+*D_NET *168 0.00101682
+
+*CONN
+*I *234:Y O *C 56.66 85.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *220:D I *C 57.71 89.17 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *234:Y 0.00021047
+2 *220:D 0.00013434
+3 *168:2 3.486e-05
+4 *168:3 2.53e-05
+5 *168:4 0.00061185
+
+*RES
+1 *168:4 *168:2 13.7556
+2 *234:Y *168:2 209.3
+3 *168:3 *168:4 9.24915
+4 *220:D *168:3 117.045
+*END
+
+*D_NET *169 0.00097663
+
+*CONN
+*I *233:Y O *C 87.57 72.15 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *223:D I *C 84.31 75.85 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *233:Y 9.818e-05
+2 *169:2 0.00037235
+3 *169:4 0.0005061
+
+*RES
+1 *223:D *169:4 9.24915
+2 *169:4 *169:2 12.836
+3 *169:2 *169:3 273.816
+4 *233:Y *169:3 52.774
+*END
+
+*D_NET *170 0.00058744
+
+*CONN
+*I *232:Y O *C 88.55 88.43 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *226:D I *C 93.33 89.17 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *170:2 0.00023045
+2 *170:3 0.00010974
+3 *170:4 0.00024725
+
+*RES
+1 *170:3 *170:2 90.8738
+2 *170:2 *226:D 195.017
+3 *170:4 *170:3 196.496
+4 *170:4 *232:Y 25.2393
+*END
+
+*D_NET *171 0.00104293
+
+*CONN
+*I *231:Y O *C 70.52 85.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *221:D I *C 73.09 89.17 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *231:Y 5.905e-05
+2 *171:2 3.191e-05
+3 *171:3 8.04e-06
+4 *171:4 7.384e-05
+5 *171:5 0.00016249
+6 *171:6 0.00025992
+7 *171:7 0.00044768
+
+*RES
+1 *171:5 *221:D 81.9334
+2 *171:4 *171:5 30.7844
+3 *171:7 *171:4 13.3001
+4 *171:6 *171:7 0.557028
+5 *171:6 *171:2 10.5783
+6 *171:2 *171:3 19.5076
+7 *231:Y *171:3 58.5227
+*END
+
+*D_NET *172 0.000226
+
+*CONN
+*I *230:Y O *C 71.17 88.43 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *225:D I *C 69.26 89.17 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *225:D 0.00021018
+2 *172:2 1.582e-05
+
+*RES
+1 *225:D *172:2 136.553
+2 *230:Y *172:2 19.5076
+*END
+
+*D_NET *173 0.00162085
+
+*CONN
+*I *229:Y O *C 54.24 72.15 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *219:D I *C 57.71 75.85 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *219:D 9.174e-05
+2 *173:2 0.0001052
+3 *173:3 0.00087894
+4 *173:5 0.00054497
+
+*RES
+1 *173:5 *173:3 517.156
+2 *173:3 *173:4 60.0304
+3 *219:D *173:4 117.756
+4 *173:5 *173:2 14.2062
+5 *173:2 *229:Y 78.0302
+*END
+
+*D_NET *174 0.00769624
+
+*CONN
+*I *228:Y O *C 61.16 72.15 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *203:A I *C 97.36 43.66 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *174:3 0.00146243
+2 *174:4 0.00075464
+3 *174:5 0.00013304
+4 *174:6 0.00044559
+5 *174:7 0.0001172
+6 *174:8 0.00011388
+7 *174:9 0.00031574
+8 *174:10 2.02e-06
+9 *174:11 0.0005435
+10 *174:12 0.00241484
+11 *174:13 0.00056532
+12 *174:2 *1:12 0.00041813
+13 *174:12 *62:4 0.00040991
+
+*RES
+1 *174:8 *174:6 4.9571
+2 *174:5 *174:6 0.876932
+3 *174:9 *174:5 5.95334
+4 *174:12 *174:9 7.05713
+5 *174:12 *174:11 3.67701
+6 *174:11 *174:3 2.06451
+7 *174:2 *174:3 6.2136
+8 *174:2 *174:13 0.277693
+9 *174:13 *174:14 2.47889
+10 *174:4 *174:14 0.284267
+11 *174:4 *174:10 8.08741
+12 *174:7 *174:10 0.767316
+13 *203:A *174:7 9.24915
+14 *228:Y *174:8 9.24915
+*END
+
+*D_NET *175 0.00130171
+
+*CONN
+*I *227:Y O *C 79.21 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *224:D I *C 75.84 71.41 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *227:Y 8.139e-05
+2 *224:D 7.961e-05
+3 *175:2 6.382e-05
+4 *175:3 0.00062697
+5 *175:5 0.00044992
+
+*RES
+1 *175:5 *175:3 283.065
+2 *175:3 *175:4 150.253
+3 *227:Y *175:4 78.7405
+4 *175:5 *175:2 12.8543
+5 *224:D *175:2 58.5227
+*END
+
+*D_NET *176 0.00046136
+
+*CONN
+*I *221:QN O *C 77.89 89.91 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *218:A I *C 80.86 90.28 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *221:QN 6.772e-05
+2 *176:3 6.622e-05
+3 *176:4 0.00032742
+
+*RES
+1 *176:3 *218:A 20.3193
+2 *176:3 *176:2 29.9563
+3 *176:4 *176:2 195.727
+4 *221:QN *176:4 59.6394
+*END
+
+*D_NET *177 0.00245242
+
+*CONN
+*I *243:A I *C 56.18 63.64 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *219:QN O *C 52.91 76.59 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *219:QN 0.00041659
+2 *177:2 0.00034785
+3 *177:3 0.00018446
+4 *177:4 4.159e-05
+5 *177:5 8.412e-05
+6 *177:6 0.00035115
+7 *177:7 0.00030752
+8 *177:8 7.169e-05
+9 *177:9 0.00028659
+10 *177:11 0.00036086
+
+*RES
+1 *177:7 *177:2 2.69904
+2 *177:10 *177:2 3.60033
+3 *177:6 *177:10 0.539107
+4 *177:6 *177:8 2.67628
+5 *177:8 *177:11 0.557028
+6 *177:11 *177:12 3.59549
+7 *177:9 *177:12 0.539107
+8 *177:9 *177:4 11.0469
+9 *219:QN *177:4 273.106
+10 *177:5 *177:7 0.557028
+11 *177:3 *177:5 1.21956
+12 *243:A *177:3 9.24915
+*END
+
+*D_NET *178 0.00320953
+
+*CONN
+*I *244:A I *C 62.63 63.64 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *186:Y O *C 82.33 58.83 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *186:Y 4.445e-05
+2 *178:2 0.00029465
+3 *178:3 0.00101867
+4 *178:4 9.178e-05
+5 *178:5 9.04e-05
+6 *178:7 0.00146334
+7 *178:9 0.00018839
+8 *178:10 1.785e-05
+
+*RES
+1 *178:10 *178:3 3.95933
+2 *178:7 *178:3 8.20874
+3 *178:7 *178:8 3.7952
+4 *178:4 *178:8 0.539107
+5 *178:4 *178:5 0.445809
+6 *244:A *178:5 9.24915
+7 *178:9 *178:10 4.47566
+8 *178:9 *178:2 10.4062
+9 *178:2 *178:6 234.801
+10 *186:Y *178:6 22.6999
+*END
+
diff --git a/sky130_cds/pnr/SPEF/mult_seq_tqrc.spef b/sky130_cds/pnr/SPEF/mult_seq_tqrc.spef
new file mode 100755
index 000000000..d1a4b8b49
--- /dev/null
+++ b/sky130_cds/pnr/SPEF/mult_seq_tqrc.spef
@@ -0,0 +1,3852 @@
+*SPEF "IEEE 1481-1998"
+*DESIGN "mult_seq"
+*DATE "Mon Aug  1 10:17:47 2022"
+*VENDOR "Cadence Design Systems, Inc."
+*PROGRAM "Innovus"
+*VERSION "19.18-s072_1"
+*DESIGN_FLOW "COUPLING C" "PIN_CAP NONE" "NAME_SCOPE LOCAL"
+*DIVIDER /
+*DELIMITER :
+*BUS_DELIMITER []
+*T_UNIT 1 NS
+*C_UNIT 1 PF
+*R_UNIT 1 OHM
+*L_UNIT 1 HENRY
+
+// MMMC spef file for corner 'rc_typ'
+
+*NAME_MAP
+
+*1 a[3]
+*2 a[2]
+*3 a[1]
+*4 a[0]
+*5 b[3]
+*6 b[2]
+*7 b[1]
+*8 b[0]
+*9 clk
+*10 reset
+*11 en
+*12 sum_q[7]
+*13 sum_q[6]
+*14 sum_q[5]
+*15 sum_q[4]
+*16 sum_q[3]
+*17 sum_q[2]
+*18 sum_q[1]
+*19 sum_q[0]
+*20 FE_PHN22_sum_q_7
+*21 FE_PHN21_sum_q_2
+*22 FE_PHN10_sum_q_5
+*23 FE_PHN9_sum_q_6
+*24 FE_PHN1_sum_q_1
+*25 sum[7]
+*26 sum[6]
+*27 sum[5]
+*28 sum[4]
+*29 sum[3]
+*30 sum[2]
+*31 sum[1]
+*32 sum[0]
+*33 csa_tree_add1_add_30_16_groupi_n_0
+*34 csa_tree_add1_add_30_16_groupi_n_1
+*35 csa_tree_add1_add_30_16_groupi_n_4
+*36 csa_tree_add1_add_30_16_groupi_n_5
+*37 csa_tree_add1_add_30_16_groupi_n_6
+*38 csa_tree_add1_add_30_16_groupi_n_7
+*39 csa_tree_add1_add_30_16_groupi_n_8
+*40 csa_tree_add1_add_30_16_groupi_n_9
+*41 csa_tree_add1_add_30_16_groupi_n_10
+*42 csa_tree_add1_add_30_16_groupi_n_11
+*43 csa_tree_add1_add_30_16_groupi_n_12
+*44 csa_tree_add1_add_30_16_groupi_n_13
+*45 csa_tree_add1_add_30_16_groupi_n_14
+*46 csa_tree_add1_add_30_16_groupi_n_15
+*47 csa_tree_add1_add_30_16_groupi_n_16
+*48 csa_tree_add1_add_30_16_groupi_n_17
+*49 csa_tree_add1_add_30_16_groupi_n_18
+*50 csa_tree_add1_add_30_16_groupi_n_19
+*51 csa_tree_add1_add_30_16_groupi_n_20
+*52 csa_tree_add1_add_30_16_groupi_n_21
+*53 csa_tree_add1_add_30_16_groupi_n_23
+*54 csa_tree_add1_add_30_16_groupi_n_24
+*55 csa_tree_add1_add_30_16_groupi_n_25
+*56 csa_tree_add1_add_30_16_groupi_n_26
+*57 csa_tree_add1_add_30_16_groupi_n_27
+*58 csa_tree_add1_add_30_16_groupi_n_28
+*59 csa_tree_add1_add_30_16_groupi_n_30
+*60 csa_tree_add1_add_30_16_groupi_n_31
+*61 csa_tree_add1_add_30_16_groupi_n_32
+*62 csa_tree_add1_add_30_16_groupi_n_33
+*63 csa_tree_add1_add_30_16_groupi_n_34
+*64 csa_tree_add1_add_30_16_groupi_n_35
+*65 csa_tree_add1_add_30_16_groupi_n_36
+*66 csa_tree_add1_add_30_16_groupi_n_39
+*67 csa_tree_add1_add_30_16_groupi_n_40
+*68 csa_tree_add1_add_30_16_groupi_n_41
+*69 csa_tree_add1_add_30_16_groupi_n_42
+*70 csa_tree_add1_add_30_16_groupi_n_43
+*71 csa_tree_add1_add_30_16_groupi_n_44
+*72 csa_tree_add1_add_30_16_groupi_n_45
+*73 csa_tree_add1_add_30_16_groupi_n_46
+*74 csa_tree_add1_add_30_16_groupi_n_47
+*75 csa_tree_add1_add_30_16_groupi_n_48
+*76 csa_tree_add1_add_30_16_groupi_n_49
+*77 csa_tree_add1_add_30_16_groupi_n_50
+*78 csa_tree_add1_add_30_16_groupi_n_52
+*79 csa_tree_add1_add_30_16_groupi_n_53
+*80 csa_tree_add1_add_30_16_groupi_n_54
+*81 csa_tree_add1_add_30_16_groupi_n_55
+*82 csa_tree_add1_add_30_16_groupi_n_56
+*83 csa_tree_add1_add_30_16_groupi_n_57
+*84 csa_tree_add1_add_30_16_groupi_n_59
+*85 csa_tree_add1_add_30_16_groupi_n_60
+*86 csa_tree_add1_add_30_16_groupi_n_62
+*87 csa_tree_add1_add_30_16_groupi_n_63
+*88 csa_tree_add1_add_30_16_groupi_n_64
+*89 csa_tree_add1_add_30_16_groupi_n_65
+*90 csa_tree_add1_add_30_16_groupi_n_66
+*91 csa_tree_add1_add_30_16_groupi_n_68
+*92 csa_tree_add1_add_30_16_groupi_n_69
+*93 csa_tree_add1_add_30_16_groupi_n_70
+*94 csa_tree_add1_add_30_16_groupi_n_71
+*95 csa_tree_add1_add_30_16_groupi_n_72
+*96 csa_tree_add1_add_30_16_groupi_n_73
+*97 csa_tree_add1_add_30_16_groupi_n_74
+*98 csa_tree_add1_add_30_16_groupi_n_75
+*99 csa_tree_add1_add_30_16_groupi_n_76
+*100 csa_tree_add1_add_30_16_groupi_n_77
+*101 csa_tree_add1_add_30_16_groupi_n_78
+*102 csa_tree_add1_add_30_16_groupi_n_79
+*103 csa_tree_add1_add_30_16_groupi_n_80
+*104 csa_tree_add1_add_30_16_groupi_n_81
+*105 csa_tree_add1_add_30_16_groupi_n_82
+*106 csa_tree_add1_add_30_16_groupi_n_84
+*107 csa_tree_add1_add_30_16_groupi_n_85
+*108 csa_tree_add1_add_30_16_groupi_n_87
+*109 csa_tree_add1_add_30_16_groupi_n_89
+*110 csa_tree_add1_add_30_16_groupi_n_91
+*111 csa_tree_add1_add_30_16_groupi_n_93
+*112 n_111
+*113 n_112
+*114 n_113
+*115 n_114
+*116 reg1/FE_PHN39_sum_q_7
+*117 reg1/FE_PHN38_sum_q_1
+*118 reg1/FE_PHN37_n_4
+*119 reg1/FE_PHN36_q_0_58
+*120 reg1/FE_PHN35_sum_q_1
+*121 reg1/FE_PHN34_sum_q_6
+*122 reg1/FE_PHN33_sum_q_5
+*123 reg1/FE_PHN32_q_4_62
+*124 reg1/FE_PHN31_n_7
+*125 reg1/FE_PHN30_sum_q_6
+*126 reg1/FE_PHN29_n_9
+*127 reg1/FE_PHN28_sum_q_7
+*128 reg1/FE_PHN27_sum_q_5
+*129 reg1/FE_PHN26_n_10
+*130 reg1/FE_PHN25_sum_q_3
+*131 reg1/FE_PHN24_n_9
+*132 reg1/FE_PHN23_n_7
+*133 reg1/FE_PHN20_sum_q_6
+*134 reg1/FE_PHN19_n_10
+*135 reg1/FE_PHN18_sum_q_5
+*136 reg1/FE_PHN17_sum_q_4
+*137 reg1/FE_PHN16_sum_q_3
+*138 reg1/FE_PHN15_n_18
+*139 reg1/FE_PHN14_n_11
+*140 reg1/FE_PHN13_n_9
+*141 reg1/FE_PHN12_n_4
+*142 reg1/FE_PHN11_n_7
+*143 reg1/FE_PHN8_q_0_58
+*144 reg1/FE_PHN7_n_18
+*145 reg1/FE_PHN6_n_4
+*146 reg1/FE_PHN5_n_5
+*147 reg1/FE_PHN4_n_6
+*148 reg1/FE_PHN3_n_9
+*149 reg1/FE_PHN2_n_11
+*150 reg1/FE_PHN0_q_0_58
+*151 reg1/UNCONNECTED
+*152 reg1/UNCONNECTED0
+*153 reg1/UNCONNECTED1
+*154 reg1/UNCONNECTED2
+*155 reg1/UNCONNECTED3
+*156 reg1/UNCONNECTED4
+*157 reg1/UNCONNECTED5
+*158 reg1/UNCONNECTED6
+*159 reg1/n_0
+*160 reg1/n_4
+*161 reg1/n_5
+*162 reg1/n_6
+*163 reg1/n_7
+*164 reg1/n_8
+*165 reg1/n_9
+*166 reg1/n_10
+*167 reg1/n_11
+*168 reg1/n_12
+*169 reg1/n_13
+*170 reg1/n_14
+*171 reg1/n_15
+*172 reg1/n_16
+*173 reg1/n_17
+*174 reg1/n_18
+*175 reg1/n_19
+*176 reg1/q\[0\]_58
+*177 reg1/q\[3\]_61
+*178 reg1/q\[4\]_62
+*179 reg1/FE_PHC39_sum_q_7
+*180 reg1/FE_PHC38_sum_q_1
+*181 reg1/FE_PHC37_n_4
+*182 reg1/FE_PHC36_q_0_58
+*183 reg1/FE_PHC35_sum_q_1
+*184 reg1/FE_PHC34_sum_q_6
+*185 reg1/FE_PHC33_sum_q_5
+*186 reg1/FE_PHC32_q_4_62
+*187 reg1/FE_PHC31_n_7
+*188 reg1/FE_PHC30_sum_q_6
+*189 reg1/FE_PHC29_n_9
+*190 reg1/FE_PHC28_sum_q_7
+*191 reg1/FE_PHC27_sum_q_5
+*192 reg1/FE_PHC26_n_10
+*193 reg1/FE_PHC25_sum_q_3
+*194 reg1/FE_PHC24_n_9
+*195 reg1/FE_PHC23_n_7
+*196 reg1/FE_PHC22_sum_q_7
+*197 reg1/FE_PHC21_sum_q_2
+*198 reg1/FE_PHC20_sum_q_6
+*199 reg1/FE_PHC19_n_10
+*200 reg1/FE_PHC18_sum_q_5
+*201 reg1/FE_PHC17_sum_q_4
+*202 reg1/FE_PHC16_sum_q_3
+*203 reg1/FE_PHC15_n_18
+*204 reg1/FE_PHC14_n_11
+*205 reg1/FE_PHC13_n_9
+*206 reg1/FE_PHC12_n_4
+*207 reg1/FE_PHC11_n_7
+*208 reg1/FE_PHC10_sum_q_5
+*209 reg1/FE_PHC9_sum_q_6
+*210 reg1/FE_PHC8_q_0_58
+*211 reg1/FE_PHC7_n_18
+*212 reg1/FE_PHC6_n_4
+*213 reg1/FE_PHC5_n_5
+*214 reg1/FE_PHC4_n_6
+*215 reg1/FE_PHC3_n_9
+*216 reg1/FE_PHC2_n_11
+*217 reg1/FE_PHC1_sum_q_1
+*218 reg1/FE_PHC0_q_0_58
+*219 reg1/q_reg\[3\]
+*220 reg1/q_reg\[2\]
+*221 reg1/q_reg\[0\]
+*222 reg1/q_reg\[4\]
+*223 reg1/q_reg\[6\]
+*224 reg1/q_reg\[5\]
+*225 reg1/q_reg\[1\]
+*226 reg1/q_reg\[7\]
+*227 reg1/g27__2398
+*228 reg1/g28__5107
+*229 reg1/g29__6260
+*230 reg1/g30__4319
+*231 reg1/g31__8428
+*232 reg1/g32__5526
+*233 reg1/g33__6783
+*234 reg1/g34__3680
+*235 reg1/g35__1617
+*236 reg1/g36__2802
+*237 reg1/g37__1705
+*238 reg1/g38__5122
+*239 reg1/g39__8246
+*240 reg1/g40__7098
+*241 reg1/g41__6131
+*242 reg1/g42__1881
+*243 reg1/g43
+*244 reg1/g44
+*245 reg1/g45
+*246 reg1/g46
+*247 csa_tree_add1_add_30_16_groupi_g417__5115
+*248 csa_tree_add1_add_30_16_groupi_g418__7482
+*249 csa_tree_add1_add_30_16_groupi_g419__4733
+*250 csa_tree_add1_add_30_16_groupi_g420__6161
+*251 csa_tree_add1_add_30_16_groupi_g421__9315
+*252 csa_tree_add1_add_30_16_groupi_g422__9945
+*253 csa_tree_add1_add_30_16_groupi_g423__2883
+*254 csa_tree_add1_add_30_16_groupi_g424__2346
+*255 csa_tree_add1_add_30_16_groupi_g425__1666
+*256 csa_tree_add1_add_30_16_groupi_g426__7410
+*257 csa_tree_add1_add_30_16_groupi_g427__6417
+*258 csa_tree_add1_add_30_16_groupi_g428__5477
+*259 csa_tree_add1_add_30_16_groupi_g429__2398
+*260 csa_tree_add1_add_30_16_groupi_g430__5107
+*261 csa_tree_add1_add_30_16_groupi_g431__6260
+*262 csa_tree_add1_add_30_16_groupi_g432__4319
+*263 csa_tree_add1_add_30_16_groupi_g433__8428
+*264 csa_tree_add1_add_30_16_groupi_g434__5526
+*265 csa_tree_add1_add_30_16_groupi_g435__6783
+*266 csa_tree_add1_add_30_16_groupi_g436__3680
+*267 csa_tree_add1_add_30_16_groupi_g437__1617
+*268 csa_tree_add1_add_30_16_groupi_g438__2802
+*269 csa_tree_add1_add_30_16_groupi_g439__1705
+*270 csa_tree_add1_add_30_16_groupi_g440__5122
+*271 csa_tree_add1_add_30_16_groupi_g441__8246
+*272 csa_tree_add1_add_30_16_groupi_g442__7098
+*273 csa_tree_add1_add_30_16_groupi_g443__6131
+*274 csa_tree_add1_add_30_16_groupi_g445__5115
+*275 csa_tree_add1_add_30_16_groupi_g446__7482
+*276 csa_tree_add1_add_30_16_groupi_g447__4733
+*277 csa_tree_add1_add_30_16_groupi_g448__6161
+*278 csa_tree_add1_add_30_16_groupi_g449__9315
+*279 csa_tree_add1_add_30_16_groupi_g450__9945
+*280 csa_tree_add1_add_30_16_groupi_g451__2883
+*281 csa_tree_add1_add_30_16_groupi_g452__2346
+*282 csa_tree_add1_add_30_16_groupi_g454__7410
+*283 csa_tree_add1_add_30_16_groupi_g455__6417
+*284 csa_tree_add1_add_30_16_groupi_g456__5477
+*285 csa_tree_add1_add_30_16_groupi_g457__2398
+*286 csa_tree_add1_add_30_16_groupi_g458__5107
+*287 csa_tree_add1_add_30_16_groupi_g459__6260
+*288 csa_tree_add1_add_30_16_groupi_g461__8428
+*289 csa_tree_add1_add_30_16_groupi_g462__5526
+*290 csa_tree_add1_add_30_16_groupi_g463__6783
+*291 csa_tree_add1_add_30_16_groupi_g464__3680
+*292 csa_tree_add1_add_30_16_groupi_g465__1617
+*293 csa_tree_add1_add_30_16_groupi_g466__2802
+*294 csa_tree_add1_add_30_16_groupi_g467__1705
+*295 csa_tree_add1_add_30_16_groupi_g468__5122
+*296 csa_tree_add1_add_30_16_groupi_g469__8246
+*297 csa_tree_add1_add_30_16_groupi_g470__7098
+*298 csa_tree_add1_add_30_16_groupi_g471__6131
+*299 csa_tree_add1_add_30_16_groupi_g472__1881
+*300 csa_tree_add1_add_30_16_groupi_g474__5115
+*301 csa_tree_add1_add_30_16_groupi_g475__7482
+*302 csa_tree_add1_add_30_16_groupi_g476__4733
+*303 csa_tree_add1_add_30_16_groupi_g477__6161
+*304 csa_tree_add1_add_30_16_groupi_g478__9315
+*305 csa_tree_add1_add_30_16_groupi_g479__9945
+*306 csa_tree_add1_add_30_16_groupi_g480__2883
+*307 csa_tree_add1_add_30_16_groupi_g481__2346
+*308 csa_tree_add1_add_30_16_groupi_g483
+*309 csa_tree_add1_add_30_16_groupi_g484__1666
+*310 csa_tree_add1_add_30_16_groupi_g485__7410
+*311 csa_tree_add1_add_30_16_groupi_g486__6417
+*312 csa_tree_add1_add_30_16_groupi_g487__5477
+*313 csa_tree_add1_add_30_16_groupi_g488__2398
+*314 csa_tree_add1_add_30_16_groupi_g490__5107
+*315 csa_tree_add1_add_30_16_groupi_g491__6260
+*316 csa_tree_add1_add_30_16_groupi_g492__4319
+*317 csa_tree_add1_add_30_16_groupi_g493__8428
+*318 csa_tree_add1_add_30_16_groupi_g494__5526
+*319 csa_tree_add1_add_30_16_groupi_g495__6783
+*320 csa_tree_add1_add_30_16_groupi_g496__3680
+*321 csa_tree_add1_add_30_16_groupi_g497__1617
+*322 csa_tree_add1_add_30_16_groupi_g498__2802
+*323 csa_tree_add1_add_30_16_groupi_g499__1705
+*324 csa_tree_add1_add_30_16_groupi_g500__5122
+*325 csa_tree_add1_add_30_16_groupi_g501__8246
+*326 csa_tree_add1_add_30_16_groupi_g502__7098
+*327 csa_tree_add1_add_30_16_groupi_g503__6131
+*328 csa_tree_add1_add_30_16_groupi_g504__1881
+*329 csa_tree_add1_add_30_16_groupi_g505__5115
+*330 csa_tree_add1_add_30_16_groupi_g506__7482
+*331 csa_tree_add1_add_30_16_groupi_g507__4733
+*332 csa_tree_add1_add_30_16_groupi_g510
+*333 csa_tree_add1_add_30_16_groupi_g513
+*334 g2
+*335 g3
+*336 g515
+*337 g516
+
+
+*PORTS
+
+*1 I *C 78.48 0
+*2 I *C 73.2 0
+*3 I *C 68.88 0
+*4 I *C 71.28 0
+*5 I *C 76.56 0
+*6 I *C 74.16 0
+*7 I *C 68.505 0
+*8 I *C 72.24 0
+*9 I *C 64.56 133.94
+*10 I *C 68.4 133.94
+*11 I *C 70.8 133.94
+*12 O *C 86.16 133.94
+*13 O *C 142.08 72.35
+*14 O *C 142.08 63.2
+*15 O *C 0 64.42
+*16 O *C 0 63.2
+*17 O *C 56.4 133.94
+*18 O *C 61.2 133.94
+*19 O *C 76.56 133.94
+
+
+*D_NET *1 0.0111508
+
+*CONN
+*P *1 I *C 78.48 0 *L 0
+*I *330:B I *C 87.79 57.35 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+*I *328:B I *C 79.91 44.03 *L 0.0042 *D sky130_osu_sc_18T_ms__nand2_l
+*I *327:B I *C 79.8 49.95 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *320:B I *C 87.19 44.03 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *330:B 0.000735641
+2 *320:B 7.89165e-05
+3 *328:B 3.82662e-05
+4 *327:B 0.000602722
+5 *1 5.81741e-05
+6 *1:5 0.0014475
+7 *1:6 0.0007025
+8 *1:7 0.0035972
+9 *1:8 0.00296092
+10 *320:B *272:A1 9.53674e-07
+11 *1:5 *208:Y 0.000208765
+12 *330:B *272:A1 0.000208765
+13 *330:B *330:A 0.000510454
+
+*RES
+1 *1:8 *1 1.67465
+2 *1:7 *1:8 51.8669
+3 *1:6 *1:7 0.913501
+4 *327:B *1:6 126.6
+5 *328:B *1:6 9.60124
+6 *320:B *1:5 93.9392
+7 *330:B *1:5 28.5528
+8 *1:5 *1:7 14.3206
+*END
+
+*D_NET *2 0.00970238
+
+*CONN
+*P *2 I *C 73.2 0 *L 0
+*I *329:B I *C 71.28 49.95 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+*I *324:B I *C 73.31 44.03 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *323:B I *C 86.2 49.95 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *322:B I *C 86.24 44.03 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+
+*CAP
+1 *323:B 0.000524163
+2 *2 0.00236475
+3 *324:B 0.000684202
+4 *329:B 0.000117302
+5 *2:5 0.00117993
+6 *2:6 0.0027737
+7 *2:7 0.000497818
+8 *2:7 *8:5 4.57764e-05
+9 *324:B *8:5 3.8147e-06
+10 *2:6 *8:7 0.000242352
+11 *2:6 *8:8 0.000153184
+12 *2:6 *324:A 3.93391e-06
+13 *2:6 *8:5 5.36442e-07
+14 *2 *8:9 0.000242352
+15 *324:B *6:8 0.000135779
+16 *2:6 *6:7 4.00543e-05
+17 *2:6 *6:8 1.93715e-05
+18 *2:6 *6:6 0.000262737
+19 *2 *6:5 0.000262737
+20 *2:5 *6:9 1.20997e-05
+21 *2:5 *322:A 0.000135779
+
+*RES
+1 *329:B *2:7 161.75
+2 *324:B *2:6 9.40633
+3 *2:6 *2 53.432
+4 *2:7 *2:6 40.9735
+5 *322:B *2:5 0.5
+6 *2:5 *324:B 1255.8
+7 *323:B *2:5 98.4899
+*END
+
+*D_NET *3 0.0102868
+
+*CONN
+*P *3 I *C 68.88 0 *L 0
+*I *331:B I *C 70.34 57.35 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *326:B I *C 73.2 57.35 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *321:A I *C 69.12 43.66 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *317:B I *C 77.51 44.03 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *317:B 0.000605464
+2 *326:B 0.000149786
+3 *321:A 2.5928e-05
+4 *3 0.00284827
+5 *3:5 0.00125569
+6 *3:6 0.00114626
+7 *3:7 0.00346816
+8 *3:7 *4:7 0.000328422
+9 *317:B *328:A 0.000458837
+
+*RES
+1 *3:7 *3 52.2323
+2 *3:6 *3:7 0.298381
+3 *321:A *3:6 9.40633
+4 *331:B *3:5 0.5
+5 *3:5 *3:6 28.163
+6 *326:B *3:5 221.086
+7 *317:B *3:7 23.5007
+*END
+
+*D_NET *4 0.0114311
+
+*CONN
+*P *4 I *C 71.28 0 *L 0
+*I *325:B I *C 67.26 44.03 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *319:B I *C 77.4 49.95 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+*I *318:A I *C 67.95 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *316:B I *C 75.31 57.35 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *319:B 0.000823975
+2 *316:B 0.000685275
+3 *4 0.000179708
+4 *318:A 1.10269e-05
+5 *325:B 2.8789e-05
+6 *4:5 0.00116879
+7 *4:6 0.0017907
+8 *4:7 0.00315303
+9 *4:8 0.00040555
+10 *4:9 0.00285584
+11 *4:7 *3:7 0.000328422
+
+*RES
+1 *4:9 *4:8 343.939
+2 *4:7 *4:9 48.7124
+3 *325:B *4:7 9.40633
+4 *4:6 *4:7 8.1116
+5 *4:5 *4:6 8.34918
+6 *318:A *4:5 9.30786
+7 *4:8 *4 4.31156
+8 *316:B *4:5 125.631
+9 *319:B *4:6 23.2043
+*END
+
+*D_NET *5 0.0102845
+
+*CONN
+*P *5 I *C 76.56 0 *L 0
+*I *330:A I *C 87.31 56.98 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *323:A I *C 87.16 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *319:A I *C 78.36 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *317:A I *C 78.47 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *330:A 0.000414014
+2 *323:A 2.93851e-05
+3 *5 0.00292635
+4 *317:A 3.80874e-05
+5 *319:A 0.000124693
+6 *5:5 0.00120372
+7 *5:6 0.00338924
+8 *5:7 0.00130981
+9 *5:6 *6:6 0.000169367
+10 *5 *6:5 0.000169367
+11 *330:A *330:B 0.000510454
+
+*RES
+1 *5:7 *5:6 8.64148
+2 *319:A *5:7 10.9349
+3 *317:A *5:6 9.40633
+4 *5:6 *5 55.4904
+5 *323:A *5:5 9.40633
+6 *5:5 *5:7 14.5521
+7 *330:A *5:5 163.63
+*END
+
+*D_NET *6 0.00842935
+
+*CONN
+*P *6 I *C 74.16 0 *L 0
+*I *325:A I *C 66.3 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *322:A I *C 86.72 43.66 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *321:B I *C 68.64 44.03 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+*I *320:A I *C 88.15 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *320:A 7.68304e-05
+2 *322:A 0.000615537
+3 *6 3.8743e-05
+4 *321:B 2.06232e-05
+5 *325:A 9.42946e-05
+6 *6:5 0.00235116
+7 *6:6 0.00242656
+8 *6:7 6.31213e-05
+9 *6:8 0.00102937
+10 *6:9 0.000505805
+11 *6:9 *2:5 1.20997e-05
+12 *6:8 *324:B 0.000135779
+13 *6:8 *2:6 1.93715e-05
+14 *6:7 *2:6 4.00543e-05
+15 *6:6 *2:6 0.000262737
+16 *6:5 *2 0.000262737
+17 *322:A *2:5 0.000135779
+18 *6:6 *5:6 0.000169367
+19 *6:5 *5 0.000169367
+
+*RES
+1 *325:A *6:9 150.371
+2 *6:9 *6:8 586.852
+3 *321:B *6:9 28.0421
+4 *6:7 *6 1.43719
+5 *6:8 *6:6 10.868
+6 *6:5 *6:7 0.669837
+7 *6:6 *6:5 49.2909
+8 *322:A *6:8 1125.34
+9 *320:A *322:A 117.045
+*END
+
+*D_NET *7 0.0102671
+
+*CONN
+*P *7 I *C 68.505 0 *L 0
+*I *331:A I *C 69.38 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *329:A I *C 71.76 50.32 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *328:A I *C 78.95 43.66 *L 0.00422 *D sky130_osu_sc_18T_ms__nand2_l
+*I *318:B I *C 68.91 57.35 *L 0.00545 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *328:A 0.0006724
+2 *329:A 1.07288e-05
+3 *7 0.00263608
+4 *318:B 9.95994e-05
+5 *7:5 0.00137466
+6 *7:6 0.0041095
+7 *7:7 0.000684321
+8 *7:8 0.000221014
+9 *328:A *317:B 0.000458837
+
+*RES
+1 *318:B *7:8 19.6654
+2 *7:8 *7:7 187.76
+3 *331:A *7:8 0.5
+4 *7:6 *7 11.4232
+5 *329:A *7:5 17.0691
+6 *7:5 *7:6 58.4316
+7 *7:7 *7:5 198.903
+8 *328:A *7:6 19.5962
+*END
+
+*D_NET *8 0.0101786
+
+*CONN
+*P *8 I *C 72.24 0 *L 0
+*I *327:A I *C 78.84 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *326:A I *C 72.24 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *324:A I *C 72.35 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+*I *316:A I *C 76.27 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nand2_1
+
+*CAP
+1 *327:A 2.95639e-05
+2 *324:A 5.45979e-05
+3 *326:A 0.00023222
+4 *8 0.000169635
+5 *8:5 0.00179303
+6 *8:6 0.000989199
+7 *8:7 0.00352865
+8 *8:8 0.00019592
+9 *8:9 0.00249386
+10 *8:9 *2 0.000242352
+11 *8:8 *2:6 0.000153184
+12 *8:7 *2:6 0.000242352
+13 *324:A *2:6 3.93391e-06
+14 *8:5 *324:B 3.8147e-06
+15 *8:5 *2:6 5.36442e-07
+16 *8:5 *2:7 4.57764e-05
+
+*RES
+1 *8:9 *8:8 0.669837
+2 *8:7 *8:9 47.5736
+3 *8:8 *8 5.49304
+4 *326:A *8:6 299.116
+5 *324:A *8:7 54.924
+6 *8:6 *8:5 29.0729
+7 *316:A *8:6 0.5
+8 *8:5 *8:7 19.9375
+9 *327:A *8:5 9.40633
+*END
+
+*D_NET *9 0.0253191
+
+*CONN
+*P *9 I *C 64.56 133.94 *L 0
+*I *226:CK I *C 93.81 89.54 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *225:CK I *C 68.78 89.54 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *224:CK I *C 76.32 71.04 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *223:CK I *C 84.79 76.22 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *222:CK I *C 68.73 62.9 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *221:CK I *C 73.57 89.54 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *220:CK I *C 57.23 89.54 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+*I *219:CK I *C 57.23 76.22 *L 0.0155 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *226:CK 0.00118142
+2 *223:CK 0.0018397
+3 *224:CK 0.000172436
+4 *221:CK 6.96778e-05
+5 *222:CK 0.00180382
+6 *225:CK 7.55191e-05
+7 *9 5.05447e-05
+8 *220:CK 7.69496e-05
+9 *219:CK 0.000968039
+10 *9:9 0.00144714
+11 *9:10 0.00312227
+12 *9:11 0.00127494
+13 *9:12 0.00240552
+14 *9:13 0.00118607
+15 *9:14 0.00393629
+16 *9:15 0.000736237
+17 *9:16 0.00497252
+
+*RES
+1 *219:CK *9:16 19.647
+2 *220:CK *9:15 14.0498
+3 *9:16 *9:14 22.6848
+4 *9:15 *9:16 3.58427
+5 *9:14 *9 1.2362
+6 *9:13 *9:15 3.8712
+7 *225:CK *9:13 14.0845
+8 *222:CK *9:12 25.89
+9 *221:CK *9:11 14.0845
+10 *9:12 *9:10 0.897884
+11 *9:10 *9:9 5.42879
+12 *9:9 *9:13 4.49371
+13 *9:11 *9:9 0.150919
+14 *224:CK *9:12 17.6971
+15 *223:CK *9:10 25.0633
+16 *226:CK *9:11 23.4349
+*END
+
+*D_NET *10 0.0172585
+
+*CONN
+*P *10 I *C 68.4 133.94 *L 0
+*I *234:A I *C 56.877 83.62 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *233:A I *C 87.787 70.3 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *232:A I *C 88.333 90.28 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *231:A I *C 70.737 83.62 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *230:A I *C 70.953 90.28 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *229:A I *C 54.457 70.3 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *228:A I *C 60.943 70.3 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *227:A I *C 79.427 76.96 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+
+*CAP
+1 *232:A 0.000796914
+2 *233:A 9.91225e-05
+3 *227:A 3.91603e-05
+4 *231:A 9.41753e-06
+5 *10 0.00283939
+6 *228:A 0.000110567
+7 *234:A 0.000105679
+8 *229:A 0.000288606
+9 *10:9 0.00103664
+10 *10:10 0.00198573
+11 *10:11 0.00088948
+12 *10:12 0.00114274
+13 *10:13 0.000113368
+14 *10:14 0.00291061
+15 *10:15 0.000632048
+16 *10:16 0.000129163
+17 *10:17 0.00123155
+18 *10:18 0.00163203
+19 *10:19 0.0012663
+
+*RES
+1 *229:A *10:19 360.483
+2 *234:A *10:18 156.467
+3 *10:18 *10:17 840.451
+4 *10:19 *10:18 34.9507
+5 *10:16 *10:19 25.1973
+6 *228:A *10:16 167.033
+7 *10:17 *10:15 18.5045
+8 *10:14 *10 51.8242
+9 *10:13 *10:15 9.40633
+10 *10:15 *10:14 1.91224
+11 *231:A *10:12 16.6627
+12 *10:12 *10:17 187.76
+13 *10:11 *10:13 143.055
+14 *230:A *10:11 0.5
+15 *10:10 *10:12 709.543
+16 *227:A *10:10 60.1484
+17 *10:9 *10:10 643.099
+18 *233:A *10:9 161.75
+19 *232:A *10:11 1565.89
+*END
+
+*D_NET *11 0.0203467
+
+*CONN
+*P *11 I *C 70.8 133.94 *L 0
+*I *246:A I *C 85.95 90.28 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *242:B1 I *C 87.3 84.725 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *241:B1 I *C 80.35 75.855 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *240:B1 I *C 88.71 71.405 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *239:B1 I *C 62.77 89.175 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *238:B1 I *C 55.38 71.405 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *237:B1 I *C 54.06 84.725 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *236:B1 I *C 74.3 84.725 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *235:B1 I *C 54.06 62.535 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *240:B1 0.000878751
+2 *242:B1 0.00012207
+3 *246:A 0.000348449
+4 *241:B1 0.000119209
+5 *236:B1 0.000108898
+6 *11 0.0028978
+7 *238:B1 0.000177741
+8 *237:B1 4.50015e-05
+9 *235:B1 0.000632823
+10 *11:10 0.000750661
+11 *11:11 0.000199199
+12 *11:12 0.0017432
+13 *11:13 0.00184548
+14 *11:14 0.00125414
+15 *11:15 0.00294811
+16 *11:16 0.0011822
+17 *11:17 0.00149298
+18 *11:18 0.00135326
+19 *11:19 0.00152344
+20 *11:19 *159:15 5.14686e-05
+21 *11:19 *239:A0 7.27177e-05
+22 *11:17 *159:16 5.14686e-05
+23 *11:17 *159:15 5.24521e-06
+24 *11:17 *159:13 6.13928e-06
+25 *11:17 *237:A0 4.29153e-06
+26 *11:17 *239:A0 1.13845e-05
+27 *237:B1 *239:A0 6.73532e-06
+28 *11:11 *159:11 2.75373e-05
+29 *11:10 *159:11 1.17421e-05
+30 *246:A *159:11 6.2108e-05
+31 *246:A *159:10 1.54972e-06
+32 *246:A *159:9 1.2517e-06
+33 *242:B1 *159:12 1.3411e-05
+34 *240:B1 *240:A0 5.37038e-05
+35 *11:17 *29:3 0.000111073
+36 *11:17 *29:2 4.66108e-05
+37 *235:B1 *235:B0 5.82337e-05
+38 *235:B1 *29:2 0.000111073
+39 *238:B1 *29:2 1.55568e-05
+
+*RES
+1 *11:19 *11:18 883.96
+2 *11:17 *11:19 14.8714
+3 *235:B1 *11:17 64.6806
+4 *237:B1 *11:19 35.4165
+5 *238:B1 *11:17 256.502
+6 *11:18 *11:16 720.619
+7 *239:B1 *11:18 0.5
+8 *11:16 *11:15 1.01089
+9 *11:15 *11 53.2614
+10 *11:14 *11:16 11.5073
+11 *236:B1 *11:14 40.2334
+12 *241:B1 *11:13 113.788
+13 *11:13 *11:12 14.0842
+14 *11:12 *11:14 4.48191
+15 *11:11 *11:10 10.2528
+16 *11:10 *11:12 6.60193
+17 *246:A *11:10 79.5044
+18 *242:B1 *11:11 182.071
+19 *240:B1 *11:13 26.9041
+*END
+
+*D_NET *12 0.00803375
+
+*CONN
+*P *12 O *C 86.16 133.94 *L 0.006
+*I *226:Q O *C 99.09 90.28 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *190:A I *C 99.78 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *190:A 0.000504851
+2 *226:Q 1.22786e-05
+3 *12 0.00281578
+4 *12:3 0.00102305
+5 *12:4 0.00332171
+6 *12:4 *181:A 0.000178039
+7 *12:3 *141:3 0.000178039
+
+*RES
+1 *12:4 *12:3 1157.1
+2 *12 *12:4 51.1787
+3 *12:3 *226:Q 28.4486
+4 *190:A *12:3 191.871
+*END
+
+*D_NET *13 0.0129577
+
+*CONN
+*P *13 O *C 142.08 72.35 *L 0.006
+*I *301:A I *C 91.48 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *223:Q O *C 90.07 76.96 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *209:A I *C 90.32 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *13 0.00411665
+2 *301:A 0.000523627
+3 *223:Q 3.21269e-05
+4 *209:A 0.000358999
+5 *13:4 0.00130439
+6 *13:5 0.00418341
+7 *13:6 0.00120157
+8 *13:7 0.000745177
+9 *13:6 *23:4 0.000245869
+10 *13:4 *335:A0 0.000245869
+
+*RES
+1 *209:A *13:7 18.2
+2 *13:6 *13:7 5.47469
+3 *13:5 *13:6 4.71342
+4 *13:7 *223:Q 9.74739
+5 *13:4 *13:6 16.546
+6 *301:A *13:4 20.1123
+7 *13 *13:5 24.2531
+*END
+
+*D_NET *14 0.0150129
+
+*CONN
+*P *14 O *C 142.08 63.2 *L 0.006
+*I *280:B I *C 93.95 63.27 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *278:A I *C 90.76 61.79 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *224:Q O *C 81.6 70.3 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *208:A I *C 81.3 43.66 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *14 7.2062e-05
+2 *280:B 0.000151992
+3 *278:A 2.52128e-05
+4 *224:Q 0.000934482
+5 *208:A 0.00121611
+6 *14:5 0.0038687
+7 *14:6 0.0041728
+8 *14:7 0.00115806
+9 *14:8 0.00305927
+10 *14:7 *145:2 0.000354171
+
+*RES
+1 *208:A *14:8 69.5131
+2 *14:8 *224:Q 19.5236
+3 *278:A *14:7 9.40633
+4 *14:7 *14:8 16.1817
+5 *280:B *14:6 84.0112
+6 *14:6 *14:7 6.24371
+7 *14:5 *14:6 22.103
+8 *14 *14:5 0.768542
+*END
+
+*D_NET *15 0.0130785
+
+*CONN
+*P *15 O *C 0 64.42 *L 0.006
+*I *332:A I *C 61.24 50.32 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *283:A1 I *C 62.91 57.72 *L 0.742 *D sky130_osu_sc_18T_ms__mux2_1
+*I *244:Y O *C 62.15 61.79 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *201:A I *C 58.42 70.3 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *283:A1 0.000112951
+2 *332:A 0.000453114
+3 *244:Y 0.000403941
+4 *201:A 0.000375926
+5 *15 0.00366479
+6 *15:5 0.000873148
+7 *15:6 0.000142694
+8 *15:7 0.000362694
+9 *15:8 0.000436425
+10 *15:9 0.00116616
+11 *15:10 0.00442141
+12 *15 *16:10 0.000332594
+13 *15:10 *16:9 0.000332594
+
+*RES
+1 *15 *15:10 22.8174
+2 *15:10 *15:9 5.8918
+3 *201:A *15:8 15.4048
+4 *15:8 *15:9 4.71342
+5 *15:9 *15:7 17.272
+6 *15:6 *15:5 9.40633
+7 *15:5 *244:Y 79.9003
+8 *332:A *15:5 18.0296
+9 *15:7 *244:Y 26.01
+10 *283:A1 *15:6 143.055
+*END
+
+*D_NET *16 0.0115129
+
+*CONN
+*P *16 O *C 0 63.2 *L 0.006
+*I *294:B I *C 53.43 57.35 *L 0.00431 *D sky130_osu_sc_18T_ms__or2_l
+*I *288:A I *C 49.11 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *275:B0 I *C 56.26 57.72 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *243:Y O *C 56.66 61.79 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *202:A I *C 51.6 63.64 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *275:B0 0.000413775
+2 *243:Y 0.000461042
+3 *294:B 0.000136614
+4 *202:A 0.000136018
+5 *288:A 7.53403e-05
+6 *16 7.17044e-05
+7 *16:6 0.000377476
+8 *16:7 0.000549376
+9 *16:8 0.000558674
+10 *16:9 0.00419641
+11 *16:10 0.00387126
+12 *16:10 *15 0.000332594
+13 *16:9 *15:10 0.000332594
+
+*RES
+1 *16 *16:10 0.994921
+2 *16:10 *16:9 23.2346
+3 *288:A *16:8 74.7726
+4 *16:7 *16:9 4.71342
+5 *16:9 *16:6 16.2082
+6 *16:8 *16:7 7.08246
+7 *202:A *16:7 75.2902
+8 *294:B *16:8 114.372
+9 *16:6 *243:Y 84.5327
+10 *275:B0 *243:Y 174.115
+*END
+
+*D_NET *17 0.00812304
+
+*CONN
+*P *17 O *C 56.4 133.94 *L 0.006
+*I *269:B I *C 46.21 83.99 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *220:Q O *C 51.95 90.28 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *197:A I *C 44.01 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *17 0.00277364
+2 *220:Q 1.83582e-05
+3 *269:B 0.000528455
+4 *197:A 9.39369e-05
+5 *17:4 0.00310713
+6 *17:5 3.31402e-05
+7 *17:6 0.000647128
+8 *17:7 0.000921249
+
+*RES
+1 *197:A *17:7 171.504
+2 *17:7 *17:6 538.896
+3 *269:B *17:7 27.9413
+4 *17:5 *220:Q 44.7048
+5 *17:6 *17:5 30.0741
+6 *17:4 *17:6 278.376
+7 *17 *17:4 50.1069
+*END
+
+*D_NET *18 0.00631869
+
+*CONN
+*P *18 O *C 61.2 133.94 *L 0.006
+*I *225:Q O *C 63.5 90.28 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *217:A I *C 60.18 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *225:Q 6.28233e-05
+2 *18 0.00164652
+3 *217:A 0.000117421
+4 *18:3 9.66787e-05
+5 *18:4 0.00294524
+6 *18:5 0.00145
+
+*RES
+1 *217:A *18:5 148.542
+2 *18:4 *18:5 31.5976
+3 *18 *18:4 31.0946
+4 *18:5 *18:3 73.1534
+5 *18:3 *225:Q 122.735
+*END
+
+*D_NET *19 0.00866377
+
+*CONN
+*P *19 O *C 76.56 133.94 *L 0.006
+*I *333:A I *C 79.35 83.62 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *245:Y O *C 79.87 88.43 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *236:A1 I *C 75.46 83.99 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *333:A 0.000131667
+2 *245:Y 8.25524e-05
+3 *19 0.000103593
+4 *236:A1 0.000405192
+5 *19:4 0.000110269
+6 *19:5 0.00360888
+7 *19:6 0.0030061
+8 *19:7 0.00121552
+
+*RES
+1 *236:A1 *19:7 332.347
+2 *19 *19:6 2.84398
+3 *19:7 *19:5 20.566
+4 *19:4 *245:Y 104.04
+5 *19:5 *19:4 9.40633
+6 *19:6 *19:5 53.0666
+7 *333:A *19:7 250.347
+*END
+
+*D_NET *20 0.00208533
+
+*CONN
+*I *334:B I *C 93.67 85.1 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *196:Y O *C 100.59 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *179:A I *C 88.45 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *334:B 7.4625e-05
+2 *196:Y 0.0003407
+3 *179:A 0.000365019
+4 *20:3 0.00060302
+5 *20:4 0.000701964
+
+*RES
+1 *179:A *20:4 429.419
+2 *20:4 *20:3 14.2295
+3 *20:3 *196:Y 572.222
+4 *334:B *20:4 79.3085
+*END
+
+*D_NET *21 0.00205672
+
+*CONN
+*I *268:A I *C 47.19 88.43 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *260:A1 I *C 47.64 83.99 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *237:A1 I *C 55.22 83.99 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *197:Y O *C 44.49 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *237:A1 0.000212073
+2 *260:A1 0.000216782
+3 *197:Y 7.73668e-05
+4 *268:A 0.00028944
+5 *21:4 0.000522137
+6 *21:5 0.000738919
+
+*RES
+1 *268:A *197:Y 117.045
+2 *260:A1 *21:5 101.797
+3 *21:5 *268:A 77.4765
+4 *21:4 *21:5 15.0577
+5 *237:A1 *21:4 338.131
+*END
+
+*D_NET *22 0.00511676
+
+*CONN
+*I *272:A1 I *C 96.81 63.27 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *208:Y O *C 81.78 45.51 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *185:A I *C 76.57 43.66 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *272:A1 0.00191683
+2 *208:Y 0.00194883
+3 *185:A 0.000400305
+4 *22:3 0.000432313
+5 *208:Y *1:5 0.000208765
+6 *272:A1 *320:B 9.53674e-07
+7 *272:A1 *330:B 0.000208765
+
+*RES
+1 *185:A *22:3 527.111
+2 *22:3 *208:Y 58.1163
+3 *272:A1 *208:Y 1513.78
+*END
+
+*D_NET *23 0.00511539
+
+*CONN
+*I *335:A0 I *C 91.38 56.98 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *209:Y O *C 90.8 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *198:A I *C 98.02 76.96 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *198:A 0.000432253
+2 *335:A0 0.00145513
+3 *209:Y 5.22137e-05
+4 *23:3 0.000424445
+5 *23:4 0.00225961
+6 *23:4 *13:6 0.000245869
+7 *335:A0 *13:4 0.000245869
+
+*RES
+1 *23:4 *23:3 18.6385
+2 *23:3 *209:Y 84.5327
+3 *335:A0 *23:4 140.449
+4 *198:A *23:4 712.491
+*END
+
+*D_NET *24 0.00363922
+
+*CONN
+*I *293:B I *C 64.9 76.59 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *291:A I *C 64.03 85.47 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *281:A1 I *C 62.04 76.59 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *217:Y O *C 60.66 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *183:A I *C 59.41 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *293:B 0.000439167
+2 *291:A 9.87649e-05
+3 *281:A1 0.000237584
+4 *217:Y 2.94447e-05
+5 *183:A 8.0049e-05
+6 *24:5 0.00107801
+7 *24:6 0.000632107
+8 *24:7 0.000391245
+9 *24:8 0.00065285
+
+*RES
+1 *183:A *24:8 111.356
+2 *24:7 *217:Y 45.5177
+3 *24:8 *24:6 301.554
+4 *24:5 *24:8 120.903
+5 *281:A1 *24:5 77.4522
+6 *24:6 *24:7 280.415
+7 *291:A *24:6 150.371
+8 *293:B *24:5 382.641
+*END
+
+*D_NET *25 0.0011822
+
+*CONN
+*I *247:Y O *C 95.73 85.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *242:B0 I *C 86.62 84.36 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *247:Y 8.73208e-05
+2 *242:B0 0.000503778
+3 *25:2 0.000591099
+
+*RES
+1 *242:B0 *25:2 601.416
+2 *25:2 *247:Y 161.75
+*END
+
+*D_NET *26 0.00102091
+
+*CONN
+*I *249:Y O *C 92.6 75.11 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *240:B0 I *C 89.39 71.04 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *249:Y 0.000113368
+2 *240:B0 0.000397086
+3 *26:2 0.000510454
+
+*RES
+1 *240:B0 *26:2 92.8316
+2 *26:2 *249:Y 182.071
+*END
+
+*D_NET *27 0.00177908
+
+*CONN
+*I *251:Y O *C 72.96 72.15 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *241:B0 I *C 81.03 76.22 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *251:Y 0.00088954
+2 *241:B0 0.00088954
+
+*RES
+1 *241:B0 *251:Y 845.949
+*END
+
+*D_NET *28 0.00101316
+
+*CONN
+*I *253:Y O *C 63.39 72.15 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *238:B0 I *C 56.06 71.04 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *253:Y 1.47223e-05
+2 *238:B0 0.000491858
+3 *28:2 0.00050658
+
+*RES
+1 *238:B0 *28:2 101.421
+2 *28:2 *253:Y 23.978
+*END
+
+*D_NET *29 0.00306898
+
+*CONN
+*I *255:Y O *C 46.475 76.22 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *235:B0 I *C 54.74 62.9 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *235:B0 0.000135601
+2 *255:Y 5.21541e-05
+3 *29:2 0.00108647
+4 *29:3 0.00100303
+5 *29:3 *11:17 0.000111073
+6 *235:B0 *235:B1 5.82337e-05
+7 *29:2 *11:17 4.66108e-05
+8 *29:2 *235:B1 0.000111073
+9 *29:2 *238:B1 1.55568e-05
+10 *29:3 *159:15 9.41157e-05
+11 *29:3 *159:16 6.56545e-05
+12 *235:B0 *235:A0 0.000118256
+13 *29:2 *159:16 9.41157e-05
+14 *29:2 *235:A0 6.56545e-05
+15 *29:2 *238:A0 1.13845e-05
+
+*RES
+1 *29:3 *255:Y 89.8161
+2 *235:B0 *29:2 12.5122
+3 *29:2 *29:3 890.778
+*END
+
+*D_NET *30 0.00121963
+
+*CONN
+*I *258:Y O *C 49.42 88.43 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *237:B0 I *C 54.74 84.36 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *258:Y 0.000609815
+2 *237:B0 0.000609815
+
+*RES
+1 *237:B0 *258:Y 591.449
+*END
+
+*D_NET *31 0.000749588
+
+*CONN
+*I *279:Y O *C 61.8 85.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *239:B0 I *C 62.09 89.54 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *279:Y 0.000374794
+2 *239:B0 0.000374794
+
+*RES
+1 *239:B0 *279:Y 24.2205
+*END
+
+*D_NET *32 0.00162733
+
+*CONN
+*I *300:Y O *C 75.86 75.11 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *236:B0 I *C 74.98 84.36 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *300:Y 8.57115e-05
+2 *236:B0 0.000727952
+3 *32:2 0.000813663
+
+*RES
+1 *236:B0 *32:2 95.168
+2 *32:2 *300:Y 104.04
+*END
+
+*D_NET *33 0.00225258
+
+*CONN
+*I *332:Y O *C 61.72 48.47 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *285:A I *C 63.66 50.32 *L 0.00432 *D sky130_osu_sc_18T_ms__and2_l
+*I *283:A0 I *C 63.87 57.35 *L 0.741 *D sky130_osu_sc_18T_ms__mux2_1
+*I *271:B0 I *C 66.18 57.72 *L 0.00578 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *271:B0 0.00037092
+2 *283:A0 5.28693e-05
+3 *285:A 8.15392e-05
+4 *332:Y 0.000188112
+5 *33:4 0.000856638
+6 *33:5 0.0007025
+
+*RES
+1 *33:5 *332:Y 265.443
+2 *33:4 *33:5 17.5424
+3 *285:A *33:5 9.91797
+4 *283:A0 *33:4 80.4687
+5 *271:B0 *33:4 503.945
+*END
+
+*D_NET *34 0.00140929
+
+*CONN
+*I *333:Y O *C 78.87 85.47 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *309:B I *C 77.77 76.59 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *300:A1 I *C 76.34 76.59 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *333:Y 1.91331e-05
+2 *309:B 0.000685513
+3 *300:A1 0.000141621
+4 *34:3 0.000563025
+
+*RES
+1 *300:A1 *309:B 136.553
+2 *309:B *34:3 91.1976
+3 *34:3 *333:Y 28.4486
+*END
+
+*D_NET *35 0.00427616
+
+*CONN
+*I *337:B I *C 48.18 49.95 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *331:Y O *C 69.38 58.83 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *289:B I *C 46.92 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *331:Y 5.52535e-05
+2 *289:B 7.51019e-05
+3 *35:3 0.00206298
+4 *35:4 0.00208282
+
+*RES
+1 *289:B *35:4 117.045
+2 *35:4 *35:3 117.434
+3 *337:B *35:4 0.5
+4 *35:3 *331:Y 65.0252
+*END
+
+*D_NET *36 0.0015043
+
+*CONN
+*I *335:A1 I *C 91.86 57.35 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *330:Y O *C 88.75 58.83 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *301:B I *C 90.04 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *335:A1 8.02875e-05
+2 *330:Y 0.000106215
+3 *301:B 0.000565648
+4 *36:3 0.000752151
+
+*RES
+1 *301:B *36:3 128.631
+2 *36:3 *330:Y 191.824
+3 *335:A1 *36:3 122.735
+*END
+
+*D_NET *37 0.00249445
+
+*CONN
+*I *329:Y O *C 70.32 48.47 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *315:A I *C 57.98 43.66 *L 0.00455 *D sky130_osu_sc_18T_ms__or2_l
+*I *302:B I *C 58.69 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *295:B1 I *C 61.01 44.765 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *329:Y 3.016e-05
+2 *295:B1 9.04799e-05
+3 *302:B 0.000171185
+4 *315:A 0.000221848
+5 *37:4 0.000577509
+6 *37:5 0.000904739
+7 *37:6 0.000498533
+
+*RES
+1 *315:A *37:6 12.2228
+2 *302:B *37:5 129.941
+3 *37:6 *37:5 3.21543
+4 *37:5 *37:4 892.936
+5 *295:B1 *37:6 113.447
+6 *37:4 *329:Y 44.7048
+*END
+
+*D_NET *38 0.00216794
+
+*CONN
+*I *328:Y O *C 78.95 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_l
+*I *310:B I *C 85.14 49.95 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *305:A I *C 85.87 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *305:A 0.000441551
+2 *310:B 3.27826e-05
+3 *328:Y 0.000609636
+4 *38:3 0.00108397
+
+*RES
+1 *38:3 *328:Y 566.219
+2 *310:B *38:3 9.40633
+3 *305:A *38:3 17.5972
+*END
+
+*D_NET *39 0.00141692
+
+*CONN
+*I *327:Y O *C 78.84 48.47 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *313:B I *C 80.41 57.35 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *307:B I *C 79.15 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *313:B 4.44651e-05
+2 *327:Y 0.000641346
+3 *307:B 2.26498e-05
+4 *39:3 0.000708461
+
+*RES
+1 *307:B *39:3 44.7048
+2 *39:3 *327:Y 108.471
+3 *313:B *39:3 83.72
+*END
+
+*D_NET *40 0.0039674
+
+*CONN
+*I *326:Y O *C 72.24 58.83 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *314:B I *C 62.71 49.95 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *306:A I *C 63.63 43.66 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *326:Y 4.70281e-05
+2 *306:A 0.00039953
+3 *314:B 0.000167429
+4 *40:3 0.00141674
+5 *40:4 0.00193667
+
+*RES
+1 *314:B *40:4 110.546
+2 *40:4 *40:3 34.3283
+3 *306:A *40:4 14.9542
+4 *40:3 *326:Y 65.0252
+*END
+
+*D_NET *41 0.00280333
+
+*CONN
+*I *325:Y O *C 66.3 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *312:A I *C 54.017 43.66 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *304:A I *C 47.53 45.51 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *325:Y 0.000111997
+2 *312:A 3.46899e-05
+3 *304:A 0.000252903
+4 *41:3 0.000935435
+5 *41:4 0.00111103
+6 *41:4 *42:4 0.000178635
+7 *41:3 *42:3 0.000178635
+
+*RES
+1 *304:A *41:4 345.802
+2 *41:4 *41:3 34.686
+3 *312:A *41:4 65.0252
+4 *41:3 *325:Y 172.317
+*END
+
+*D_NET *42 0.00373256
+
+*CONN
+*I *324:Y O *C 72.35 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *312:B I *C 53.8 44.03 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *304:B I *C 49.45 45.14 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *324:Y 0.000179052
+2 *312:B 0.000167251
+3 *304:B 6.35982e-05
+4 *42:3 0.0014568
+5 *42:4 0.00150859
+6 *42:4 *41:4 0.000178635
+7 *42:3 *41:3 0.000178635
+
+*RES
+1 *304:B *42:4 143.055
+2 *42:4 *42:3 37.2449
+3 *312:B *42:4 297.49
+4 *42:3 *324:Y 299.116
+*END
+
+*D_NET *43 0.00165653
+
+*CONN
+*I *323:Y O *C 87.16 48.47 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *311:B I *C 95.44 44.03 *L 0.0042 *D sky130_osu_sc_18T_ms__nand2_l
+*I *303:A I *C 91.35 43.66 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *296:A0 I *C 93.755 43.66 *L 0.00553 *D sky130_osu_sc_18T_ms__oai21_l
+
+*CAP
+1 *311:B 0.000239968
+2 *323:Y 0.000532329
+3 *303:A 0.000588298
+4 *43:4 0.000295937
+
+*RES
+1 *303:A *323:Y 349.407
+2 *296:A0 *43:4 0.5
+3 *43:4 *303:A 117.045
+4 *311:B *43:4 430.792
+*END
+
+*D_NET *44 0.00488067
+
+*CONN
+*I *322:Y O *C 85.28 45.51 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *299:A I *C 83.39 70.3 *L 0.00455 *D sky130_osu_sc_18T_ms__or2_l
+*I *297:B I *C 86.3 62.16 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *287:B1 I *C 86.42 71.405 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *322:Y 6.68764e-05
+2 *287:B1 0.000387192
+3 *297:B 0.00194973
+4 *299:A 3.65376e-05
+5 *44:4 0.00140369
+6 *44:5 0.00103664
+
+*RES
+1 *299:A *44:5 9.40633
+2 *44:5 *297:B 382.807
+3 *297:B *44:4 56.7244
+4 *287:B1 *44:5 126.964
+5 *44:4 *322:Y 84.5327
+*END
+
+*D_NET *45 0.00242352
+
+*CONN
+*I *321:Y O *C 67.68 45.51 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *315:B I *C 57.5 44.03 *L 0.00431 *D sky130_osu_sc_18T_ms__or2_l
+*I *302:A I *C 57.25 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *295:B0 I *C 60.33 44.4 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *321:Y 2.98023e-05
+2 *295:B0 0.000137091
+3 *302:A 0.000274658
+4 *315:B 8.80957e-05
+5 *45:4 0.000633955
+6 *45:5 0.000956774
+7 *45:6 0.000303149
+
+*RES
+1 *315:B *45:6 98.7946
+2 *302:A *45:5 134.995
+3 *45:6 *45:5 1.41287
+4 *45:5 *45:4 784.832
+5 *295:B0 *45:6 75.2841
+6 *45:4 *321:Y 44.7048
+*END
+
+*D_NET *46 0.00107872
+
+*CONN
+*I *320:Y O *C 88.15 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *311:A I *C 96.4 43.66 *L 0.00422 *D sky130_osu_sc_18T_ms__nand2_l
+*I *303:B I *C 92.79 44.03 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *296:A1 I *C 94.235 44.03 *L 0.0056 *D sky130_osu_sc_18T_ms__oai21_l
+
+*CAP
+1 *311:A 0.000109315
+2 *320:Y 0.000179946
+3 *46:4 0.000208795
+4 *46:5 0.000250101
+5 *46:6 0.000330567
+
+*RES
+1 *46:6 *320:Y 281.234
+2 *303:B *46:5 0.5
+3 *46:5 *46:6 191.012
+4 *296:A1 *46:4 0.5
+5 *46:4 *46:5 126.799
+6 *311:A *46:4 208.893
+*END
+
+*D_NET *47 0.00175583
+
+*CONN
+*I *319:Y O *C 78.36 48.47 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *313:A I *C 80.193 56.98 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *307:A I *C 77.71 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *313:A 0.000231981
+2 *307:A 0.000821471
+3 *319:Y 5.64456e-05
+4 *47:3 0.000645936
+
+*RES
+1 *47:3 *319:Y 65.0252
+2 *307:A *47:3 28.2763
+3 *313:A *307:A 386.9
+*END
+
+*D_NET *48 0.003672
+
+*CONN
+*I *318:Y O *C 67.95 58.83 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *314:A I *C 62.927 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *306:B I *C 65.07 44.03 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *318:Y 1.84178e-05
+2 *306:B 0.000147343
+3 *314:A 5.84125e-06
+4 *48:3 0.0011065
+5 *48:4 0.00167024
+6 *48:5 0.00072366
+
+*RES
+1 *48:5 *48:4 18.5289
+2 *314:A *48:4 9.32229
+3 *48:4 *48:3 31.6945
+4 *306:B *48:5 182.071
+5 *48:3 *318:Y 26.01
+*END
+
+*D_NET *49 0.00265646
+
+*CONN
+*I *317:Y O *C 78.47 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *310:A I *C 84.923 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *305:B I *C 84.43 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *310:A 4.77433e-05
+2 *305:B 0.000491142
+3 *317:Y 0.000789344
+4 *49:3 0.00132823
+
+*RES
+1 *49:3 *317:Y 87.5622
+2 *305:B *49:3 92.0105
+3 *310:A *49:3 68.6829
+*END
+
+*D_NET *50 0.0031811
+
+*CONN
+*I *316:Y O *C 76.27 58.83 *L 0 *D sky130_osu_sc_18T_ms__nand2_1
+*I *309:A I *C 77.553 76.96 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *300:A0 I *C 76.82 76.96 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *309:A 7.82013e-05
+2 *316:Y 3.18289e-05
+3 *50:3 0.00155872
+4 *50:4 0.00151235
+
+*RES
+1 *50:4 *316:Y 45.5177
+2 *50:3 *50:4 112.27
+3 *300:A0 *50:3 0.5
+4 *309:A *50:3 78.0302
+*END
+
+*D_NET *51 0.000196457
+
+*CONN
+*I *315:Y O *C 58.94 45.51 *L 0 *D sky130_osu_sc_18T_ms__or2_l
+*I *295:A1 I *C 59.85 44.03 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *295:A1 7.27177e-05
+2 *315:Y 2.55108e-05
+3 *51:2 9.82285e-05
+
+*RES
+1 *51:2 *315:Y 35.7639
+2 *295:A1 *51:2 83.72
+*END
+
+*D_NET *52 0.00249028
+
+*CONN
+*I *336:B I *C 49.14 49.95 *L 0.00561 *D sky130_osu_sc_18T_ms__or2_1
+*I *314:Y O *C 62.71 48.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *277:B I *C 47.36 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *314:Y 0.000115156
+2 *336:B 5.11408e-05
+3 *277:B 0.000352621
+4 *52:3 0.000726104
+5 *52:4 0.000777364
+6 *52:5 0.000467896
+
+*RES
+1 *277:B *52:5 16.6776
+2 *52:5 *52:4 158.152
+3 *52:4 *52:3 1017
+4 *336:B *52:4 84.5327
+5 *52:3 *314:Y 11.0993
+*END
+
+*D_NET *53 0.00274765
+
+*CONN
+*I *313:Y O *C 80.41 58.83 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *299:B I *C 82.91 70.67 *L 0.00431 *D sky130_osu_sc_18T_ms__or2_l
+*I *297:A I *C 84.38 61.79 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *287:B0 I *C 85.74 71.04 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *287:B0 2.72989e-05
+2 *297:A 0.000669837
+3 *299:B 0.000246108
+4 *313:Y 0.000430584
+5 *53:4 0.000847697
+6 *53:5 0.00052613
+
+*RES
+1 *53:5 *313:Y 212.617
+2 *299:B *53:4 120.345
+3 *297:A *53:5 161.75
+4 *287:B0 *53:4 9.40633
+5 *53:4 *297:A 20.2827
+*END
+
+*D_NET *54 0.00160909
+
+*CONN
+*I *312:Y O *C 53.8 45.51 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *295:A0 I *C 59.37 43.66 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *292:B I *C 52.86 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *295:A0 0.000404
+2 *312:Y 0.000442863
+3 *292:B 0.000361681
+4 *54:3 0.000400543
+
+*RES
+1 *292:B *54:3 194.884
+2 *54:3 *312:Y 64.2124
+3 *295:A0 *312:Y 636.434
+*END
+
+*D_NET *55 0.00078392
+
+*CONN
+*I *311:Y O *C 96.4 45.51 *L 0 *D sky130_osu_sc_18T_ms__nand2_l
+*I *298:B I *C 97.07 49.95 *L 0.0042 *D sky130_osu_sc_18T_ms__nand2_l
+
+*CAP
+1 *311:Y 0.00039196
+2 *298:B 0.00039196
+
+*RES
+1 *298:B *311:Y 154.636
+*END
+
+*D_NET *56 0.00191033
+
+*CONN
+*I *310:Y O *C 85.14 48.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *298:A I *C 96.11 50.32 *L 0.00422 *D sky130_osu_sc_18T_ms__nand2_l
+*I *290:A I *C 94.67 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *298:A 7.87377e-05
+2 *290:A 0.000909209
+3 *310:Y 4.59552e-05
+4 *56:3 0.000876427
+
+*RES
+1 *56:3 *310:Y 65.0252
+2 *290:A *56:3 97.7211
+3 *298:A *290:A 117.045
+*END
+
+*D_NET *57 0.00155914
+
+*CONN
+*I *309:Y O *C 77.77 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *308:A I *C 71.21 76.96 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *300:B0 I *C 75.86 76.22 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *309:Y 0.000155449
+2 *300:B0 0.00013119
+3 *308:A 0.00062412
+4 *57:3 0.000648379
+
+*RES
+1 *308:A *57:3 99.7571
+2 *300:B0 *309:Y 136.553
+3 *57:3 *309:Y 45.5177
+*END
+
+*D_NET *58 0.00208032
+
+*CONN
+*I *308:Y O *C 70.73 75.11 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *286:B I *C 63.48 76.59 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *279:B I *C 62.76 83.99 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *308:Y 2.15769e-05
+2 *286:B 0.000135362
+3 *279:B 0.000428617
+4 *58:3 0.000476182
+5 *58:4 0.00101858
+
+*RES
+1 *279:B *58:4 42.237
+2 *58:4 *58:3 736.063
+3 *286:B *58:4 11.1632
+4 *58:3 *308:Y 44.7048
+*END
+
+*D_NET *59 0.000946999
+
+*CONN
+*I *303:Y O *C 91.83 45.51 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *290:B I *C 93.23 49.95 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *303:Y 0.000473499
+2 *290:B 0.000473499
+
+*RES
+1 *290:B *303:Y 198.674
+*END
+
+*D_NET *60 0.00030446
+
+*CONN
+*I *302:Y O *C 57.73 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *292:A I *C 54.3 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *302:Y 0.000119925
+2 *292:A 3.23057e-05
+3 *60:2 0.00015223
+
+*RES
+1 *292:A *60:2 65.838
+2 *60:2 *302:Y 234.091
+*END
+
+*D_NET *61 0.00400448
+
+*CONN
+*I *307:Y O *C 78.19 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *294:A I *C 53.91 56.98 *L 0.00455 *D sky130_osu_sc_18T_ms__or2_l
+*I *288:B I *C 50.55 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *275:B1 I *C 56.94 58.085 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *307:Y 5.97835e-05
+2 *275:B1 0.00011009
+3 *288:B 0.000211358
+4 *61:4 0.00152642
+5 *61:5 0.0017311
+6 *61:6 0.000365734
+
+*RES
+1 *288:B *61:6 335.693
+2 *61:6 *61:5 76.2341
+3 *294:A *61:6 0.5
+4 *61:5 *61:4 28.5715
+5 *275:B1 *61:5 113.405
+6 *61:4 *307:Y 104.04
+*END
+
+*D_NET *62 0.00662816
+
+*CONN
+*I *306:Y O *C 64.11 45.51 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *293:A I *C 64.683 76.96 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+*I *291:B I *C 65.95 85.1 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *281:A0 I *C 62.52 76.96 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *291:B 0.000627637
+2 *293:A 0.000419259
+3 *306:Y 9.20892e-05
+4 *281:A0 0.000203133
+5 *62:4 0.00233507
+6 *62:5 0.00197196
+7 *62:6 0.000140905
+8 *62:7 0.000838101
+
+*RES
+1 *281:A0 *62:7 336.505
+2 *62:6 *306:Y 10.198
+3 *62:5 *62:6 0.755191
+4 *62:4 *62:5 32.1176
+5 *62:7 *293:A 13.8179
+6 *293:A *62:4 17.859
+7 *291:B *62:7 202.553
+*END
+
+*D_NET *63 0.00221038
+
+*CONN
+*I *305:Y O *C 85.39 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *287:A0 I *C 84.78 70.3 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *282:A I *C 81.67 63.64 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *287:A0 0.0005036
+2 *305:Y 3.05176e-05
+3 *282:A 0.000132799
+4 *63:3 0.000468791
+5 *63:4 0.00107467
+
+*RES
+1 *282:A *63:4 180.098
+2 *63:4 *63:3 16.1661
+3 *63:3 *305:Y 45.5177
+4 *287:A0 *63:4 50.871
+*END
+
+*D_NET *64 0.000777125
+
+*CONN
+*I *337:A I *C 47.963 50.32 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *304:Y O *C 48.235 44.4 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *289:A I *C 45.48 50.32 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *337:A 1.85966e-05
+2 *304:Y 3.86238e-05
+3 *289:A 2.90275e-05
+4 *64:3 0.000340939
+5 *64:4 0.000349939
+
+*RES
+1 *289:A *64:4 45.5177
+2 *64:3 *304:Y 65.0252
+3 *64:4 *64:3 24.732
+4 *337:A *64:4 29.6677
+*END
+
+*D_NET *65 0.00148737
+
+*CONN
+*I *301:Y O *C 91 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *284:A I *C 93.73 58.83 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *301:Y 0.000743687
+2 *284:A 0.000743687
+
+*RES
+1 *284:A *301:Y 182.57
+*END
+
+*D_NET *66 0.000160217
+
+*CONN
+*I *299:Y O *C 84.35 72.15 *L 0 *D sky130_osu_sc_18T_ms__or2_l
+*I *287:A1 I *C 85.26 70.67 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *299:Y 8.01086e-05
+2 *287:A1 8.01086e-05
+
+*RES
+1 *287:A1 *299:Y 112.168
+*END
+
+*D_NET *67 0.00092411
+
+*CONN
+*I *298:Y O *C 96.11 48.47 *L 0 *D sky130_osu_sc_18T_ms__nand2_l
+*I *296:B0 I *C 94.54 44.4 *L 0.00468 *D sky130_osu_sc_18T_ms__oai21_l
+
+*CAP
+1 *298:Y 6.62208e-05
+2 *296:B0 0.000395834
+3 *67:2 0.000462055
+
+*RES
+1 *296:B0 *67:2 50.8152
+2 *67:2 *298:Y 106.479
+*END
+
+*D_NET *68 0.000333905
+
+*CONN
+*I *297:Y O *C 85.085 62.9 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *282:B I *C 83.11 63.27 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *297:Y 8.28505e-05
+2 *282:B 8.41022e-05
+3 *68:2 0.000166953
+
+*RES
+1 *282:B *68:2 125.174
+2 *68:2 *297:Y 122.735
+*END
+
+*D_NET *69 0.0020833
+
+*CONN
+*I *335:B0 I *C 92.34 57.72 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *296:Y O *C 95.02 45.51 *L 0 *D sky130_osu_sc_18T_ms__oai21_l
+*I *284:B I *C 95.65 58.46 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *284:B 0.000102639
+2 *296:Y 2.41995e-05
+3 *335:B0 0.000137687
+4 *69:3 0.000801325
+5 *69:4 0.00101745
+
+*RES
+1 *335:B0 *69:4 114.299
+2 *69:4 *69:3 49.475
+3 *69:3 *296:Y 44.7048
+4 *284:B *69:4 126.452
+*END
+
+*D_NET *70 0.00269306
+
+*CONN
+*I *295:Y O *C 60.33 45.51 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *285:B I *C 64.14 49.95 *L 0.00442 *D sky130_osu_sc_18T_ms__and2_l
+*I *283:S0 I *C 64.83 56.98 *L 0.0111 *D sky130_osu_sc_18T_ms__mux2_1
+*I *271:B1 I *C 65.43 58.085 *L 0.00566 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *271:B1 0.0001477
+2 *283:S0 3.70741e-05
+3 *295:Y 0.000582099
+4 *70:4 0.00076443
+5 *70:5 0.00116175
+
+*RES
+1 *285:B *70:5 0.5
+2 *70:5 *295:Y 456.027
+3 *70:4 *70:5 107.378
+4 *283:S0 *70:4 9.40633
+5 *271:B1 *70:4 75.3938
+*END
+
+*D_NET *71 0.000290632
+
+*CONN
+*I *294:Y O *C 54.87 58.83 *L 0 *D sky130_osu_sc_18T_ms__or2_l
+*I *275:A1 I *C 55.78 57.35 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *275:A1 9.95994e-05
+2 *294:Y 2.60472e-05
+3 *71:2 4.57168e-05
+4 *71:3 0.000119269
+
+*RES
+1 *71:3 *71:2 35.7639
+2 *71:2 *294:Y 64.2124
+3 *275:A1 *71:3 161.75
+*END
+
+*D_NET *72 0.000362158
+
+*CONN
+*I *293:Y O *C 64.9 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *286:A I *C 63.697 76.96 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+
+*CAP
+1 *293:Y 4.24385e-05
+2 *286:A 0.00013864
+3 *72:2 0.000181079
+
+*RES
+1 *286:A *72:2 20.0917
+2 *72:2 *293:Y 65.0252
+*END
+
+*D_NET *73 0.00364113
+
+*CONN
+*I *292:Y O *C 53.82 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *270:A I *C 48.843 70.3 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *267:B I *C 47.8 70.67 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *254:A0 I *C 48.48 63.64 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *292:Y 3.80874e-05
+2 *270:A 2.44379e-05
+3 *254:A0 5.42402e-06
+4 *267:B 8.37445e-05
+5 *73:4 0.00131994
+6 *73:5 0.00167429
+7 *73:6 0.000495195
+
+*RES
+1 *267:B *73:6 10.8435
+2 *254:A0 *73:5 9.32539
+3 *73:5 *73:4 38.0766
+4 *73:6 *73:5 7.48432
+5 *270:A *73:6 9.40633
+6 *73:4 *292:Y 65.0252
+*END
+
+*D_NET *74 0.000306368
+
+*CONN
+*I *291:Y O *C 64.735 84.36 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *279:A I *C 61.32 83.62 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *291:Y 0.000153184
+2 *279:A 0.000153184
+
+*RES
+1 *279:A *291:Y 214.583
+*END
+
+*D_NET *75 0.00330794
+
+*CONN
+*I *290:Y O *C 94.19 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *280:A I *C 94.167 63.64 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+*I *278:B I *C 92.68 62.16 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *272:A0 I *C 96.33 63.64 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *272:A0 0.00025773
+2 *290:Y 7.12275e-05
+3 *278:B 0.000256181
+4 *75:4 0.00111043
+5 *75:5 0.00132656
+6 *75:6 0.000285804
+
+*RES
+1 *278:B *75:6 386.9
+2 *280:A *75:6 0.5
+3 *75:6 *75:5 9.40633
+4 *75:5 *75:4 30.0386
+5 *75:4 *290:Y 104.04
+6 *272:A0 *75:5 352.926
+*END
+
+*D_NET *76 0.0008564
+
+*CONN
+*I *289:Y O *C 45.96 48.47 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *277:A I *C 45.92 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *277:A 0.000406146
+2 *289:Y 2.20537e-05
+3 *76:2 0.0004282
+
+*RES
+1 *76:2 *289:Y 9.40633
+2 *277:A *76:2 18.0296
+*END
+
+*D_NET *77 0.000969648
+
+*CONN
+*I *288:Y O *C 49.59 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *276:A I *C 46.25 63.64 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *288:Y 3.37958e-05
+2 *276:A 0.000451028
+3 *77:2 0.000484824
+
+*RES
+1 *276:A *77:2 134.1
+2 *77:2 *288:Y 65.0252
+*END
+
+*D_NET *78 0.00237381
+
+*CONN
+*I *287:Y O *C 85.74 72.15 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *274:A I *C 95.153 63.64 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+*I *266:B I *C 87.4 63.27 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *274:A 0.000524819
+2 *266:B 2.3663e-05
+3 *287:Y 0.000638425
+4 *78:3 0.00118691
+
+*RES
+1 *78:3 *287:Y 110.91
+2 *266:B *78:3 39.0152
+3 *274:A *78:3 859.958
+*END
+
+*D_NET *79 0.000159025
+
+*CONN
+*I *286:Y O *C 63.48 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *281:B0 I *C 61.56 76.22 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *286:Y 7.95126e-05
+2 *281:B0 7.95126e-05
+
+*RES
+1 *281:B0 *286:Y 117.045
+*END
+
+*D_NET *80 0.00140178
+
+*CONN
+*I *285:Y O *C 65.1 48.47 *L 0 *D sky130_osu_sc_18T_ms__and2_l
+*I *271:A1 I *C 66.485 57.35 *L 0.00564 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *285:Y 0.000700891
+2 *271:A1 0.000700891
+
+*RES
+1 *271:A1 *285:Y 101.095
+*END
+
+*D_NET *81 0.00315392
+
+*CONN
+*I *284:Y O *C 94.435 57.72 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *263:A I *C 93.43 70.3 *L 0.00432 *D sky130_osu_sc_18T_ms__and2_l
+*I *261:A I *C 94.83 75.11 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *248:B0 I *C 94.87 71.04 *L 0.00578 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *261:A 0.000446677
+2 *248:B0 0.000223696
+3 *284:Y 0.000261426
+4 *263:A 5.25117e-05
+5 *81:4 0.000854075
+6 *81:5 0.00131553
+
+*RES
+1 *263:A *81:5 9.74739
+2 *81:5 *81:4 11.0347
+3 *81:4 *284:Y 13.3525
+4 *248:B0 *81:5 81.3181
+5 *261:A *81:5 119.025
+*END
+
+*D_NET *82 0.000518918
+
+*CONN
+*I *283:Y O *C 63.39 58.83 *L 0 *D sky130_osu_sc_18T_ms__mux2_1
+*I *273:A I *C 60.33 56.98 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *283:Y 6.90222e-05
+2 *273:A 0.000190437
+3 *82:2 0.000259459
+
+*RES
+1 *273:A *82:2 84.8001
+2 *82:2 *283:Y 84.5327
+*END
+
+*D_NET *83 0.00334168
+
+*CONN
+*I *282:Y O *C 82.15 61.79 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *273:B I *C 61.77 57.35 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *271:A0 I *C 66.965 56.98 *L 0.00538 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *282:Y 9.01818e-05
+2 *271:A0 1.20401e-05
+3 *273:B 0.000536561
+4 *83:3 0.00112224
+5 *83:4 0.00158066
+
+*RES
+1 *273:B *83:4 21.1383
+2 *271:A0 *83:4 9.35507
+3 *83:4 *83:3 1170.43
+4 *83:3 *282:Y 122.735
+*END
+
+*D_NET *84 0.00347245
+
+*CONN
+*I *281:Y O *C 61.56 75.11 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *265:B I *C 49.5 83.99 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+*I *258:A I *C 49.9 90.28 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *281:Y 5.47767e-05
+2 *265:B 0.000135779
+3 *258:A 0.000499725
+4 *84:3 0.00110072
+5 *84:4 0.00168145
+
+*RES
+1 *258:A *84:4 82.9086
+2 *265:B *84:4 199.605
+3 *84:4 *84:3 908.241
+4 *84:3 *281:Y 104.04
+*END
+
+*D_NET *85 0.000364184
+
+*CONN
+*I *280:Y O *C 93.95 61.79 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *274:B I *C 95.37 63.27 *L 0.00449 *D sky130_osu_sc_18T_ms__nor2_l
+
+*CAP
+1 *280:Y 0.000182092
+2 *274:B 0.000182092
+
+*RES
+1 *274:B *280:Y 249.534
+*END
+
+*D_NET *86 0.000229597
+
+*CONN
+*I *278:Y O *C 91.465 62.9 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *266:A I *C 88.84 63.64 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *278:Y 0.000114799
+2 *266:A 0.000114799
+
+*RES
+1 *266:A *278:Y 195.076
+*END
+
+*D_NET *87 0.00459349
+
+*CONN
+*I *277:Y O *C 46.4 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *269:A I *C 46.427 83.62 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+*I *268:B I *C 45.27 88.8 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *260:A0 I *C 47.16 83.62 *L 0.00531 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *260:A0 2.83122e-05
+2 *269:A 0.0001266
+3 *277:Y 0.000910759
+4 *268:B 0.000441015
+5 *87:4 0.00172913
+6 *87:5 0.00135767
+
+*RES
+1 *87:5 *87:4 14.9901
+2 *268:B *87:5 17.2865
+3 *87:4 *277:Y 26.8719
+4 *269:A *87:5 121.575
+5 *260:A0 *269:A 58.5227
+*END
+
+*D_NET *88 0.00185287
+
+*CONN
+*I *276:Y O *C 46.73 61.79 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *270:B I *C 49.06 70.67 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *267:A I *C 46.36 70.3 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *254:A1 I *C 48.96 63.27 *L 0.00551 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *270:B 0.000123024
+2 *254:A1 0.000252366
+3 *276:Y 0.000173867
+4 *88:4 0.000803411
+5 *88:5 0.000500202
+
+*RES
+1 *267:A *88:5 0.5
+2 *88:4 *276:Y 56.7875
+3 *88:5 *88:4 16.227
+4 *254:A1 *88:4 343.473
+5 *270:B *88:5 195.888
+*END
+
+*D_NET *89 0.00246072
+
+*CONN
+*I *275:Y O *C 56.26 58.83 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *264:B I *C 63.59 63.27 *L 0.00569 *D sky130_osu_sc_18T_ms__and2_1
+*I *262:B I *C 59.24 62.16 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *252:B1 I *C 66.69 62.535 *L 0.00566 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *252:B1 0.000404894
+2 *264:B 0.000223875
+3 *262:B 1.32322e-05
+4 *275:Y 0.000334442
+5 *89:4 0.000882685
+6 *89:5 0.00060159
+
+*RES
+1 *89:5 *275:Y 209.118
+2 *262:B *89:5 9.3559
+3 *89:4 *89:5 6.14214
+4 *264:B *89:4 121.705
+5 *252:B1 *89:4 85.4495
+*END
+
+*D_NET *90 0.000156164
+
+*CONN
+*I *274:Y O *C 95.37 61.79 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *272:B0 I *C 97.29 62.9 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *274:Y 7.80821e-05
+2 *272:B0 7.80821e-05
+
+*RES
+1 *272:B0 *274:Y 117.045
+*END
+
+*D_NET *91 0.00167775
+
+*CONN
+*I *273:Y O *C 60.81 58.83 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *264:A I *C 63.11 63.64 *L 0.00558 *D sky130_osu_sc_18T_ms__and2_1
+*I *262:A I *C 61.16 61.79 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *252:B0 I *C 65.94 62.9 *L 0.00578 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *252:B0 0.000606477
+2 *264:A 0.000220537
+3 *262:A 8.88109e-06
+4 *273:Y 0.000223517
+5 *91:4 0.000618339
+
+*RES
+1 *91:4 *273:Y 81.2752
+2 *262:A *91:4 14.2243
+3 *264:A *252:B0 316.591
+4 *252:B0 *91:4 579.131
+*END
+
+*D_NET *92 0.00259256
+
+*CONN
+*I *272:Y O *C 97.29 61.79 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *263:B I *C 92.95 70.67 *L 0.00442 *D sky130_osu_sc_18T_ms__and2_l
+*I *261:B I *C 96.75 75.48 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *248:B1 I *C 95.62 71.405 *L 0.00566 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *272:Y 0.0001809
+2 *261:B 0.00027895
+3 *248:B1 0.00028795
+4 *263:B 0.000223398
+5 *92:4 0.000729382
+6 *92:5 0.000891984
+
+*RES
+1 *263:B *248:B1 314.559
+2 *248:B1 *92:5 10.332
+3 *261:B *92:5 14.2539
+4 *92:5 *92:4 10.7912
+5 *92:4 *272:Y 12.0007
+*END
+
+*D_NET *93 0.0043515
+
+*CONN
+*I *271:Y O *C 65.7 58.83 *L 0 *D sky130_osu_sc_18T_ms__oai22_l
+*I *259:A I *C 77.01 63.64 *L 0.00582 *D sky130_osu_sc_18T_ms__or2_1
+*I *257:B I *C 68.04 70.67 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *250:B1 I *C 80.04 62.535 *L 0.00545 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *250:B1 9.69171e-05
+2 *259:A 0.000272214
+3 *271:Y 0.000264585
+4 *257:B 8.18968e-05
+5 *93:4 0.000967145
+6 *93:5 0.00172472
+7 *93:6 0.000944018
+
+*RES
+1 *257:B *93:6 143.055
+2 *93:5 *271:Y 434.856
+3 *93:6 *93:5 33.5379
+4 *259:A *93:4 255.501
+5 *93:4 *93:5 649.869
+6 *250:B1 *93:4 109.383
+*END
+
+*D_NET *94 0.000813842
+
+*CONN
+*I *270:Y O *C 49.06 72.15 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *256:B I *C 48.95 76.59 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+
+*CAP
+1 *270:Y 1.49608e-05
+2 *256:B 0.00039196
+3 *94:2 0.000406921
+
+*RES
+1 *256:B *94:2 89.6964
+2 *94:2 *270:Y 26.01
+*END
+
+*D_NET *95 0.000548005
+
+*CONN
+*I *269:Y O *C 46.21 85.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *265:A I *C 49.283 83.62 *L 0.00415 *D sky130_osu_sc_18T_ms__nor2_l
+
+*CAP
+1 *269:Y 0.000274003
+2 *265:A 0.000274003
+
+*RES
+1 *265:A *269:Y 131.828
+*END
+
+*D_NET *96 0.000181675
+
+*CONN
+*I *268:Y O *C 46.485 89.54 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *258:B I *C 48.46 89.91 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *258:B 9.08375e-05
+2 *268:Y 9.08375e-05
+
+*RES
+1 *258:B *268:Y 156.06
+*END
+
+*D_NET *97 0.000551343
+
+*CONN
+*I *267:Y O *C 46.84 72.15 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *255:A I *C 45.77 75.11 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *267:Y 3.79682e-05
+2 *255:A 0.000237703
+3 *97:2 0.000275671
+
+*RES
+1 *255:A *97:2 91.4797
+2 *97:2 *267:Y 65.0252
+*END
+
+*D_NET *98 0.0041275
+
+*CONN
+*I *266:Y O *C 88.36 61.79 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *259:B I *C 76.53 63.27 *L 0.00561 *D sky130_osu_sc_18T_ms__or2_1
+*I *257:A I *C 69.48 70.3 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *250:B0 I *C 79.36 62.9 *L 0.00568 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *266:Y 1.69873e-05
+2 *250:B0 2.58684e-05
+3 *259:B 2.60472e-05
+4 *257:A 0.000172257
+5 *98:4 0.000700414
+6 *98:5 0.000905097
+7 *98:6 0.00116521
+8 *98:7 0.00111562
+
+*RES
+1 *257:A *98:7 12.4331
+2 *98:7 *98:6 19.1276
+3 *98:6 *98:5 3.77572
+4 *259:B *98:6 9.40633
+5 *250:B0 *98:5 9.39572
+6 *98:5 *98:4 22.7323
+7 *98:4 *266:Y 26.01
+*END
+
+*D_NET *99 0.000184894
+
+*CONN
+*I *265:Y O *C 49.5 85.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_l
+*I *260:B0 I *C 48.12 84.36 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *265:Y 9.24468e-05
+2 *260:B0 9.24468e-05
+
+*RES
+1 *260:B0 *265:Y 132.489
+*END
+
+*D_NET *100 0.000275612
+
+*CONN
+*I *264:Y O *C 64.55 61.79 *L 0 *D sky130_osu_sc_18T_ms__and2_1
+*I *252:A0 I *C 65.155 63.64 *L 0.00538 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *264:Y 0.000137806
+2 *252:A0 0.000137806
+
+*RES
+1 *252:A0 *264:Y 20.0307
+*END
+
+*D_NET *101 0.000575066
+
+*CONN
+*I *263:Y O *C 91.99 72.15 *L 0 *D sky130_osu_sc_18T_ms__and2_l
+*I *248:A0 I *C 94.085 70.3 *L 0.00538 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *263:Y 0.000287533
+2 *248:A0 0.000287533
+
+*RES
+1 *248:A0 *263:Y 441.359
+*END
+
+*D_NET *102 0.001616
+
+*CONN
+*I *262:Y O *C 60.455 62.9 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *253:B I *C 62.43 70.67 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *253:B 0.000757396
+2 *262:Y 5.06043e-05
+3 *102:2 0.000808001
+
+*RES
+1 *102:2 *262:Y 84.5327
+2 *253:B *102:2 364.998
+*END
+
+*D_NET *103 0.000219703
+
+*CONN
+*I *261:Y O *C 95.535 76.22 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *249:B I *C 93.56 76.59 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *261:Y 0.000109851
+2 *249:B 0.000109851
+
+*RES
+1 *249:B *261:Y 175.568
+*END
+
+*D_NET *104 0.00162411
+
+*CONN
+*I *260:Y O *C 48.12 85.47 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *256:A I *C 48.733 76.96 *L 0.00548 *D sky130_osu_sc_18T_ms__nor2_1
+*I *255:B I *C 47.69 75.48 *L 0.0105 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *260:Y 8.61883e-05
+2 *256:A 0.000725865
+3 *255:B 0.000127256
+4 *104:3 0.000684798
+
+*RES
+1 *255:B *256:A 230.839
+2 *104:3 *260:Y 10.198
+3 *256:A *104:3 74.108
+*END
+
+*D_NET *105 0.000159383
+
+*CONN
+*I *259:Y O *C 77.97 61.79 *L 0 *D sky130_osu_sc_18T_ms__or2_1
+*I *250:A0 I *C 78.4 63.64 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *259:Y 7.96914e-05
+2 *250:A0 7.96914e-05
+
+*RES
+1 *250:A0 *259:Y 130.05
+*END
+
+*D_NET *106 0.000313401
+
+*CONN
+*I *257:Y O *C 69 72.15 *L 0 *D sky130_osu_sc_18T_ms__xor2_l
+*I *251:B I *C 72 70.67 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *257:Y 0.000156701
+2 *251:B 0.000156701
+
+*RES
+1 *251:B *257:Y 286.924
+*END
+
+*D_NET *107 0.00217986
+
+*CONN
+*I *256:Y O *C 48.95 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *254:B0 I *C 49.44 62.9 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi21_l
+
+*CAP
+1 *256:Y 0.000956774
+2 *254:B0 0.000133157
+3 *107:2 0.00108993
+
+*RES
+1 *254:B0 *107:2 182.071
+2 *107:2 *256:Y 216.717
+*END
+
+*D_NET *108 0.0046736
+
+*CONN
+*I *254:Y O *C 49.44 61.79 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *253:A I *C 63.87 70.3 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *252:A1 I *C 65.635 63.27 *L 0.00564 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *252:A1 0.000344694
+2 *254:Y 0.00186777
+3 *253:A 0.000124335
+4 *108:3 0.0023368
+
+*RES
+1 *253:A *108:3 114.244
+2 *108:3 *254:Y 67.1856
+3 *252:A1 *108:3 16.3487
+*END
+
+*D_NET *109 0.00293148
+
+*CONN
+*I *252:Y O *C 66.42 61.79 *L 0 *D sky130_osu_sc_18T_ms__oai22_l
+*I *251:A I *C 73.44 70.3 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *250:A1 I *C 78.88 63.27 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *250:A1 0.000674903
+2 *251:A 0.000110805
+3 *252:Y 0.000203907
+4 *109:3 0.000586927
+5 *109:4 0.00135493
+
+*RES
+1 *109:4 *252:Y 12.9201
+2 *109:3 *109:4 278.766
+3 *251:A *109:3 200.765
+4 *250:A1 *109:4 1093.7
+*END
+
+*D_NET *110 0.00548112
+
+*CONN
+*I *250:Y O *C 79.36 61.79 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *249:A I *C 92.12 76.96 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+*I *248:A1 I *C 94.565 70.67 *L 0.00564 *D sky130_osu_sc_18T_ms__oai22_l
+
+*CAP
+1 *248:A1 0.00074923
+2 *249:A 0.000325799
+3 *250:Y 0.00166553
+4 *110:3 0.00274056
+
+*RES
+1 *110:3 *250:Y 104.555
+2 *249:A *110:3 82.1108
+3 *248:A1 *110:3 21.9885
+*END
+
+*D_NET *111 0.00147748
+
+*CONN
+*I *248:Y O *C 95.35 72.15 *L 0 *D sky130_osu_sc_18T_ms__oai22_l
+*I *247:A I *C 96.21 83.62 *L 0.0114 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *247:A 0.000719965
+2 *248:Y 1.87755e-05
+3 *111:2 0.00073874
+
+*RES
+1 *111:2 *248:Y 26.01
+2 *247:A *111:2 85.9946
+*END
+
+*D_NET *112 0.00403094
+
+*CONN
+*I *335:Y O *C 92.34 58.83 *L 0 *D sky130_osu_sc_18T_ms__aoi21_l
+*I *334:A I *C 91.75 85.47 *L 0.0114 *D sky130_osu_sc_18T_ms__xnor2_l
+
+*CAP
+1 *335:Y 2.65241e-05
+2 *334:A 0.000462055
+3 *112:2 0.00155342
+4 *112:3 0.00198895
+
+*RES
+1 *112:3 *112:2 109.233
+2 *334:A *112:3 19.2109
+3 *112:2 *335:Y 54.4586
+*END
+
+*D_NET *113 0.000218749
+
+*CONN
+*I *334:Y O *C 92.455 84.36 *L 0 *D sky130_osu_sc_18T_ms__xnor2_l
+*I *247:B I *C 94.77 83.99 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+
+*CAP
+1 *247:B 0.000109375
+2 *334:Y 0.000109375
+
+*RES
+1 *247:B *334:Y 195.076
+*END
+
+*D_NET *114 0.000327587
+
+*CONN
+*I *337:Y O *C 48.18 48.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *336:A I *C 49.62 50.32 *L 0.00582 *D sky130_osu_sc_18T_ms__or2_1
+
+*CAP
+1 *337:Y 0.000163794
+2 *336:A 0.000163794
+
+*RES
+1 *336:A *337:Y 21.6506
+*END
+
+*D_NET *115 0.00269246
+
+*CONN
+*I *336:Y O *C 50.58 48.47 *L 0 *D sky130_osu_sc_18T_ms__or2_1
+*I *276:B I *C 47.69 63.27 *L 0.0105 *D sky130_osu_sc_18T_ms__xor2_l
+*I *275:A0 I *C 55.3 56.98 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *275:A0 0.000221252
+2 *336:Y 2.13981e-05
+3 *276:B 0.000683308
+4 *115:3 0.00044167
+5 *115:4 0.00132483
+
+*RES
+1 *276:B *115:4 294.426
+2 *115:3 *336:Y 35.7639
+3 *115:4 *115:3 40.3525
+4 *275:A0 *115:4 384.868
+*END
+
+*D_NET *116 0.000208855
+
+*CONN
+*I *242:A1 I *C 86.14 83.99 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *179:Y O *C 88.93 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *179:Y 0.000104427
+2 *242:A1 0.000104427
+
+*RES
+1 *242:A1 *179:Y 195.076
+*END
+
+*D_NET *117 0.002074
+
+*CONN
+*I *239:A1 I *C 61.61 89.91 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *180:Y O *C 60.66 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *180:Y 0.001037
+2 *239:A1 0.001037
+
+*RES
+1 *239:A1 *180:Y 104.938
+*END
+
+*D_NET *118 0.000181079
+
+*CONN
+*I *232:B I *C 88.55 89.91 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *181:Y O *C 90.47 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *181:Y 9.05395e-05
+2 *232:B 9.05395e-05
+
+*RES
+1 *232:B *181:Y 136.553
+*END
+
+*D_NET *119 0.00663209
+
+*CONN
+*I *245:A I *C 79.39 90.28 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *182:Y O *C 81.23 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *182:Y 2.80142e-05
+2 *245:A 0.000451803
+3 *119:2 0.00286424
+4 *119:3 0.00328803
+
+*RES
+1 *119:3 *119:2 52.525
+2 *245:A *119:3 16.708
+3 *119:2 *182:Y 45.5177
+*END
+
+*D_NET *120 0.00121427
+
+*CONN
+*I *183:Y O *C 59.89 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *180:A I *C 60.18 76.96 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *180:A 0.000542343
+2 *183:Y 6.47902e-05
+3 *120:2 0.000607133
+
+*RES
+1 *120:2 *183:Y 10.198
+2 *180:A *120:2 82.6528
+*END
+
+*D_NET *121 0.00183022
+
+*CONN
+*I *188:A I *C 98.68 63.64 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+*I *184:Y O *C 99.82 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *184:Y 3.70145e-05
+2 *188:A 0.000152707
+3 *121:2 0.000762403
+4 *121:3 0.000878096
+
+*RES
+1 *188:A *121:3 221.086
+2 *121:2 *184:Y 65.0252
+3 *121:3 *121:2 35.0969
+*END
+
+*D_NET *122 0.00437474
+
+*CONN
+*I *200:A I *C 74.48 76.96 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+*I *185:Y O *C 77.05 45.51 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *185:Y 9.81092e-05
+2 *200:A 0.000886917
+3 *122:2 0.00130045
+4 *122:3 0.00208926
+
+*RES
+1 *122:3 *122:2 31.147
+2 *200:A *122:3 26.4213
+3 *122:2 *185:Y 182.071
+*END
+
+*D_NET *123 0.00214887
+
+*CONN
+*I *222:QN O *C 73.05 63.27 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *186:A I *C 81.85 56.98 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *222:QN 0.00107443
+2 *186:A 0.00107443
+
+*RES
+1 *186:A *222:QN 794.645
+*END
+
+*D_NET *124 0.00215447
+
+*CONN
+*I *230:B I *C 71.17 89.91 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *187:Y O *C 87.39 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *187:Y 5.88894e-05
+2 *230:B 0.000387907
+3 *124:2 0.000689328
+4 *124:3 0.00101835
+
+*RES
+1 *230:B *124:3 512.886
+2 *124:3 *124:2 933.924
+3 *124:2 *187:Y 93.4737
+*END
+
+*D_NET *125 0.00249231
+
+*CONN
+*I *240:A1 I *C 89.87 70.67 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *188:Y O *C 99.16 61.79 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *188:Y 9.4533e-05
+2 *240:A1 0.00115162
+3 *125:2 0.00124615
+
+*RES
+1 *240:A1 *125:2 135.581
+2 *125:2 *188:Y 10.6487
+*END
+
+*D_NET *126 0.00187743
+
+*CONN
+*I *205:A I *C 41.26 63.64 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+*I *189:Y O *C 43.17 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *205:A 0.00083077
+2 *189:Y 0.000107944
+3 *126:2 0.000938714
+
+*RES
+1 *126:2 *189:Y 182.071
+2 *205:A *126:2 62.7878
+*END
+
+*D_NET *127 0.00072062
+
+*CONN
+*I *196:A I *C 100.11 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+*I *190:Y O *C 100.26 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *190:Y 5.93662e-05
+2 *196:A 0.000300944
+3 *127:2 0.00036031
+
+*RES
+1 *196:A *127:2 15.7641
+2 *127:2 *190:Y 10.198
+*END
+
+*D_NET *128 0.001459
+
+*CONN
+*I *241:A1 I *C 81.51 76.59 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *191:Y O *C 73.53 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *191:Y 0.000729501
+2 *241:A1 0.000729501
+
+*RES
+1 *241:A1 *191:Y 96.3087
+*END
+
+*D_NET *129 0.00141692
+
+*CONN
+*I *231:B I *C 70.52 83.99 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *192:Y O *C 77.38 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *192:Y 3.49283e-05
+2 *231:B 0.000673533
+3 *129:2 0.000708461
+
+*RES
+1 *231:B *129:2 863.839
+2 *129:2 *192:Y 64.2124
+*END
+
+*D_NET *130 0.000426412
+
+*CONN
+*I *235:A1 I *C 55.22 63.27 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *193:Y O *C 58.13 61.79 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *193:Y 2.65241e-05
+2 *235:A1 0.000186682
+3 *130:2 0.000213206
+
+*RES
+1 *235:A1 *130:2 129.167
+2 *130:2 *193:Y 45.5177
+*END
+
+*D_NET *131 0.00105178
+
+*CONN
+*I *194:Y O *C 42.84 58.83 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+*I *189:A I *C 42.69 50.32 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *189:A 0.000463009
+2 *194:Y 6.28829e-05
+3 *131:2 0.000525892
+
+*RES
+1 *131:2 *194:Y 104.04
+2 *189:A *131:2 92.0105
+*END
+
+*D_NET *132 0.0025996
+
+*CONN
+*I *195:Y O *C 72.43 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *187:A I *C 86.91 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *187:A 0.000181794
+2 *195:Y 0.001118
+3 *132:2 0.0012998
+
+*RES
+1 *132:2 *195:Y 92.2142
+2 *187:A *132:2 12.2503
+*END
+
+*D_NET *133 0.00349128
+
+*CONN
+*I *198:Y O *C 98.5 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+*I *184:A I *C 99.34 50.32 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *184:A 0.00170749
+2 *198:Y 3.8147e-05
+3 *133:2 0.00174564
+
+*RES
+1 *133:2 *198:Y 65.0252
+2 *184:A *133:2 77.7322
+*END
+
+*D_NET *134 0.00133443
+
+*CONN
+*I *199:Y O *C 68.25 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+*I *192:A I *C 76.9 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *199:Y 0.000667214
+2 *192:A 0.000667214
+
+*RES
+1 *192:A *199:Y 31.6509
+*END
+
+*D_NET *135 0.000617027
+
+*CONN
+*I *200:Y O *C 74.96 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_l
+*I *191:A I *C 73.05 76.96 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *200:Y 3.65376e-05
+2 *191:A 0.000271976
+3 *135:2 0.000308514
+
+*RES
+1 *191:A *135:2 352.762
+2 *135:2 *200:Y 64.2124
+*END
+
+*D_NET *136 0.000258207
+
+*CONN
+*I *238:A1 I *C 56.54 70.67 *L 0.00552 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *201:Y O *C 58.9 72.15 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *201:Y 0.000129104
+2 *238:A1 0.000129104
+
+*RES
+1 *238:A1 *201:Y 175.568
+*END
+
+*D_NET *137 0.000756383
+
+*CONN
+*I *202:Y O *C 52.08 61.79 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+*I *193:A I *C 57.65 63.64 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *202:Y 0.000378191
+2 *193:A 0.000378191
+
+*RES
+1 *193:A *202:Y 580.35
+*END
+
+*D_NET *138 0.0038681
+
+*CONN
+*I *211:A I *C 66.34 50.32 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+*I *203:Y O *C 97.84 45.51 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *203:Y 0.00015825
+2 *211:A 0.000249743
+3 *138:2 0.00143939
+4 *138:3 0.00152606
+5 *138:4 0.000494659
+
+*RES
+1 *211:A *138:4 338.131
+2 *138:3 *138:2 2236.87
+3 *138:4 *138:3 21.5775
+4 *138:2 *203:Y 34.9005
+*END
+
+*D_NET *139 0.00337386
+
+*CONN
+*I *235:Y O *C 54.74 61.79 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *204:A I *C 43.02 43.66 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *235:Y 0.000985205
+2 *204:A 0.000701725
+3 *139:2 0.00168693
+
+*RES
+1 *204:A *139:2 25.0694
+2 *139:2 *235:Y 977.413
+*END
+
+*D_NET *140 0.00484693
+
+*CONN
+*I *234:B I *C 56.66 83.99 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *205:Y O *C 41.74 61.79 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *205:Y 0.00242347
+2 *234:B 0.00242347
+
+*RES
+1 *234:B *205:Y 186.045
+*END
+
+*D_NET *141 0.00478351
+
+*CONN
+*I *206:Y O *C 97.4 58.83 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *181:A I *C 89.99 90.28 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *206:Y 3.52263e-05
+2 *181:A 0.00024724
+3 *141:2 0.00196648
+4 *141:3 0.00217849
+5 *181:A *12:4 0.000178039
+6 *141:3 *12:3 0.000178039
+
+*RES
+1 *181:A *141:3 629.932
+2 *141:3 *141:2 307.994
+3 *141:2 *206:Y 54.865
+*END
+
+*D_NET *142 0.00461626
+
+*CONN
+*I *207:Y O *C 41.74 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *195:A I *C 71.95 83.62 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *207:Y 0.00230813
+2 *195:A 0.00230813
+
+*RES
+1 *195:A *207:Y 141.414
+*END
+
+*D_NET *143 0.000708342
+
+*CONN
+*I *210:Y O *C 73.86 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *182:A I *C 80.75 50.32 *L 0.00446 *D sky130_osu_sc_18T_ms__buf_l
+
+*CAP
+1 *210:Y 0.000354171
+2 *182:A 0.000354171
+
+*RES
+1 *182:A *210:Y 509.635
+*END
+
+*D_NET *144 0.00209367
+
+*CONN
+*I *222:D I *C 68.25 62.53 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+*I *211:Y O *C 66.82 48.47 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *211:Y 0.000495672
+2 *222:D 0.000262976
+3 *144:2 0.000783861
+4 *144:3 0.000551164
+
+*RES
+1 *144:3 *144:2 4.2994
+2 *222:D *144:3 13.3526
+3 *144:2 *211:Y 17.859
+*END
+
+*D_NET *145 0.0060116
+
+*CONN
+*I *212:Y O *C 67.15 75.11 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *206:A I *C 96.92 56.98 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *206:A 0.000212729
+2 *212:Y 0.00261599
+3 *145:2 0.00282872
+4 *145:2 *14:7 0.000354171
+
+*RES
+1 *145:2 *212:Y 353.531
+2 *206:A *145:2 13.5901
+*END
+
+*D_NET *146 0.00130284
+
+*CONN
+*I *227:B I *C 79.21 76.59 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *213:Y O *C 80.79 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *213:Y 0.000451863
+2 *227:B 0.000199556
+3 *146:2 0.000651419
+
+*RES
+1 *227:B *146:2 205.295
+2 *146:2 *213:Y 17.5302
+*END
+
+*D_NET *147 0.0023098
+
+*CONN
+*I *233:B I *C 87.57 70.67 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *214:Y O *C 97.18 72.15 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *214:Y 0.000128508
+2 *233:B 0.00102639
+3 *147:2 0.0011549
+
+*RES
+1 *233:B *147:2 25.7819
+2 *147:2 *214:Y 10.6366
+*END
+
+*D_NET *148 0.00317323
+
+*CONN
+*I *215:Y O *C 42.18 85.47 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *194:A I *C 42.36 56.98 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *194:A 3.08156e-05
+2 *215:Y 2.36034e-05
+3 *148:2 0.0015558
+4 *148:3 0.00156301
+
+*RES
+1 *148:3 *148:2 32.5074
+2 *148:2 *215:Y 9.40633
+3 *194:A *148:3 9.40633
+*END
+
+*D_NET *149 0.00121713
+
+*CONN
+*I *229:B I *C 54.24 70.67 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+*I *216:Y O *C 41.85 72.15 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *229:B 0.000211954
+2 *216:Y 0.000396609
+3 *149:2 0.000608563
+
+*RES
+1 *149:2 *216:Y 608.798
+2 *229:B *149:2 356.826
+*END
+
+*D_NET *150 0.00634444
+
+*CONN
+*I *218:Y O *C 81.34 88.43 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+*I *210:A I *C 73.38 50.32 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *218:Y 1.74642e-05
+2 *210:A 0.000154316
+3 *150:2 0.0030179
+4 *150:3 0.00315475
+
+*RES
+1 *210:A *150:3 239.78
+2 *150:3 *150:2 701.097
+3 *150:2 *218:Y 26.01
+*END
+
+*D_NET *159 0.0134569
+
+*CONN
+*I *246:Y O *C 85.47 88.43 *L 0 *D sky130_osu_sc_18T_ms__inv_1
+*I *242:A0 I *C 85.66 83.62 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *241:A0 I *C 81.99 76.96 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *240:A0 I *C 90.35 70.3 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *239:A0 I *C 61.13 90.28 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *238:A0 I *C 57.02 70.3 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *237:A0 I *C 55.7 83.62 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *236:A0 I *C 75.94 83.62 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *235:A0 I *C 55.7 63.64 *L 0.00532 *D sky130_osu_sc_18T_ms__aoi22_l
+
+*CAP
+1 *240:A0 0.000932634
+2 *246:Y 2.91467e-05
+3 *241:A0 0.000973284
+4 *236:A0 7.65324e-05
+5 *239:A0 0.00103641
+6 *238:A0 0.000103712
+7 *237:A0 2.08616e-05
+8 *235:A0 0.000340044
+9 *159:9 8.55923e-05
+10 *159:10 0.000379145
+11 *159:11 0.000856519
+12 *159:12 0.00121188
+13 *159:13 0.00108737
+14 *159:14 0.00219148
+15 *159:15 0.00218314
+16 *159:16 0.00111926
+17 *159:16 *29:3 6.56545e-05
+18 *159:16 *29:2 9.41157e-05
+19 *159:15 *29:3 9.41157e-05
+20 *235:A0 *235:B0 0.000118256
+21 *235:A0 *29:2 6.56545e-05
+22 *238:A0 *29:2 1.13845e-05
+23 *159:16 *11:17 5.14686e-05
+24 *159:15 *11:17 5.24521e-06
+25 *159:15 *11:19 5.14686e-05
+26 *159:13 *11:17 6.13928e-06
+27 *237:A0 *11:17 4.29153e-06
+28 *239:A0 *11:19 7.27177e-05
+29 *239:A0 *11:17 1.13845e-05
+30 *239:A0 *237:B1 6.73532e-06
+31 *159:12 *242:B1 1.3411e-05
+32 *159:11 *11:11 2.75373e-05
+33 *159:11 *11:10 1.17421e-05
+34 *159:11 *246:A 6.2108e-05
+35 *159:10 *246:A 1.54972e-06
+36 *159:9 *246:A 1.2517e-06
+37 *240:A0 *240:B1 5.37038e-05
+
+*RES
+1 *159:16 *159:15 14.7069
+2 *159:15 *159:14 19.7062
+3 *159:13 *159:15 0.61512
+4 *235:A0 *159:16 17.0187
+5 *237:A0 *159:13 9.40633
+6 *238:A0 *159:16 93.9392
+7 *239:A0 *159:13 31.5047
+8 *159:14 *159:12 495.836
+9 *236:A0 *159:14 10.0214
+10 *241:A0 *159:12 72.3405
+11 *159:12 *159:11 354.735
+12 *159:11 *159:10 15.6058
+13 *159:10 *159:9 9.91797
+14 *242:A0 *159:11 0.5
+15 *159:9 *246:Y 45.5177
+16 *240:A0 *241:A0 741.693
+*END
+
+*D_NET *160 0.00339329
+
+*CONN
+*I *242:Y O *C 86.62 85.47 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *212:A I *C 66.67 76.96 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *242:Y 0.000164926
+2 *212:A 8.89897e-05
+3 *160:2 0.00160766
+4 *160:3 0.00153172
+
+*RES
+1 *212:A *160:3 143.055
+2 *160:3 *160:2 1309.93
+3 *160:2 *242:Y 221.086
+*END
+
+*D_NET *161 0.00137532
+
+*CONN
+*I *241:Y O *C 81.03 75.11 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *213:A I *C 80.31 83.62 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *213:A 0.000604689
+2 *241:Y 8.29697e-05
+3 *161:2 0.000687659
+
+*RES
+1 *161:2 *241:Y 10.4173
+2 *213:A *161:2 19.7225
+*END
+
+*D_NET *162 0.00115407
+
+*CONN
+*I *240:Y O *C 89.39 72.15 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *214:A I *C 96.7 70.3 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *240:Y 0.000577033
+2 *214:A 0.000577033
+
+*RES
+1 *214:A *240:Y 877.027
+*END
+
+*D_NET *163 0.00449955
+
+*CONN
+*I *239:Y O *C 62.09 88.43 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *207:A I *C 41.26 76.96 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *239:Y 4.03523e-05
+2 *207:A 0.00220943
+3 *163:2 0.00224978
+
+*RES
+1 *207:A *163:2 53.1353
+2 *163:2 *239:Y 65.0252
+*END
+
+*D_NET *164 0.000745416
+
+*CONN
+*I *238:Y O *C 56.06 72.15 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *228:B I *C 61.16 70.67 *L 0.00579 *D sky130_osu_sc_18T_ms__nor2_1
+
+*CAP
+1 *238:Y 0.000372708
+2 *228:B 0.000372708
+
+*RES
+1 *228:B *238:Y 620.178
+*END
+
+*D_NET *165 0.00165951
+
+*CONN
+*I *237:Y O *C 54.74 85.47 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *215:A I *C 41.7 83.62 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *237:Y 0.000232637
+2 *215:A 0.000197053
+3 *165:2 0.000632703
+4 *165:3 0.000597119
+
+*RES
+1 *215:A *165:3 317.811
+2 *165:3 *165:2 629.119
+3 *165:2 *237:Y 356.826
+*END
+
+*D_NET *166 0.0010891
+
+*CONN
+*I *236:Y O *C 74.98 85.47 *L 0 *D sky130_osu_sc_18T_ms__aoi22_l
+*I *199:A I *C 67.77 83.62 *L 0.00569 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *236:Y 0.000544548
+2 *199:A 0.000544548
+
+*RES
+1 *199:A *236:Y 630.738
+*END
+
+*D_NET *167 0.00329959
+
+*CONN
+*I *216:A I *C 41.37 70.3 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+*I *204:Y O *C 43.5 45.51 *L 0 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *204:Y 2.88486e-05
+2 *216:A 9.05991e-05
+3 *167:2 0.0015592
+4 *167:3 0.00162095
+
+*RES
+1 *216:A *167:3 161.75
+2 *167:3 *167:2 357.726
+3 *167:2 *204:Y 56.0843
+*END
+
+*D_NET *168 0.00101781
+
+*CONN
+*I *234:Y O *C 56.66 85.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *220:D I *C 57.71 89.17 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *234:Y 0.000508904
+2 *220:D 0.000508904
+
+*RES
+1 *220:D *234:Y 323.265
+*END
+
+*D_NET *169 0.000822783
+
+*CONN
+*I *233:Y O *C 87.57 72.15 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *223:D I *C 84.31 75.85 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *233:Y 3.9041e-05
+2 *223:D 0.000211895
+3 *169:2 0.000199497
+4 *169:3 0.00037235
+
+*RES
+1 *223:D *169:3 12.6035
+2 *169:3 *169:2 275.197
+3 *169:2 *233:Y 58.5227
+*END
+
+*D_NET *170 0.000612497
+
+*CONN
+*I *232:Y O *C 88.55 88.43 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *226:D I *C 93.33 89.17 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *226:D 0.000127137
+2 *232:Y 0.000179112
+3 *170:2 0.000306249
+
+*RES
+1 *170:2 *232:Y 332.848
+2 *226:D *170:2 200.765
+*END
+
+*D_NET *171 0.00102806
+
+*CONN
+*I *231:Y O *C 70.52 85.47 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *221:D I *C 73.09 89.17 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *231:Y 0.00051403
+2 *221:D 0.00051403
+
+*RES
+1 *221:D *231:Y 199.833
+*END
+
+*D_NET *172 0.000220656
+
+*CONN
+*I *230:Y O *C 71.17 88.43 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *225:D I *C 69.26 89.17 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *230:Y 0.000110328
+2 *225:D 0.000110328
+
+*RES
+1 *225:D *230:Y 156.06
+*END
+
+*D_NET *173 0.00151658
+
+*CONN
+*I *229:Y O *C 54.24 72.15 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *219:D I *C 57.71 75.85 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *219:D 0.000711024
+2 *229:Y 4.72665e-05
+3 *173:2 0.00075829
+
+*RES
+1 *173:2 *229:Y 65.0252
+2 *219:D *173:2 717.524
+*END
+
+*D_NET *174 0.00864339
+
+*CONN
+*I *228:Y O *C 61.16 72.15 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *203:A I *C 97.36 43.66 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *228:Y 0.00432169
+2 *203:A 0.00432169
+
+*RES
+1 *203:A *228:Y 61.4293
+*END
+
+*D_NET *175 0.00124657
+
+*CONN
+*I *227:Y O *C 79.21 75.11 *L 0 *D sky130_osu_sc_18T_ms__nor2_1
+*I *224:D I *C 75.84 71.41 *L 0.0056 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *227:Y 7.37309e-05
+2 *224:D 0.000549555
+3 *175:2 0.000623286
+
+*RES
+1 *224:D *175:2 495.087
+2 *175:2 *227:Y 83.72
+*END
+
+*D_NET *176 0.000400662
+
+*CONN
+*I *221:QN O *C 77.89 89.91 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+*I *218:A I *C 80.86 90.28 *L 0.00571 *D sky130_osu_sc_18T_ms__buf_8
+
+*CAP
+1 *221:QN 0.000200331
+2 *218:A 0.000200331
+
+*RES
+1 *218:A *221:QN 332.035
+*END
+
+*D_NET *177 0.00256479
+
+*CONN
+*I *243:A I *C 56.18 63.64 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *219:QN O *C 52.91 76.59 *L 0 *D sky130_osu_sc_18T_ms__dff_1
+
+*CAP
+1 *219:QN 0.00128239
+2 *243:A 0.00128239
+
+*RES
+1 *243:A *219:QN 297.634
+*END
+
+*D_NET *178 0.00356388
+
+*CONN
+*I *244:A I *C 62.63 63.64 *L 0.00547 *D sky130_osu_sc_18T_ms__inv_1
+*I *186:Y O *C 82.33 58.83 *L 0 *D sky130_osu_sc_18T_ms__buf_4
+
+*CAP
+1 *186:Y 0.00178194
+2 *244:A 0.00178194
+
+*RES
+1 *244:A *186:Y 296.496
+*END
+
diff --git a/sky130_cds/pnr/TEMPLATES/INNOVUS/edi_config.tcl b/sky130_cds/pnr/TEMPLATES/INNOVUS/edi_config.tcl
new file mode 100755
index 000000000..1daea8ef2
--- /dev/null
+++ b/sky130_cds/pnr/TEMPLATES/INNOVUS/edi_config.tcl
@@ -0,0 +1,400 @@
+###############################################################################
+#                       CADENCE COPYRIGHT NOTICE
+#         © 2008-2013 Cadence Design Systems, Inc. All rights reserved.
+#------------------------------------------------------------------------------
+#
+# This Foundation Flow is provided as an example of how to perform specialized
+# tasks.
+#
+# This work may not be copied, re-published, uploaded, or distributed in any way,
+# in any medium, whether in whole or in part, without prior written permission
+# from Cadence. Notwithstanding any restrictions herein, subject to compliance
+# with the terms and conditions of the Cadence software license agreement under
+# which this material was provided, this material may be copied and internally
+# distributed solely for internal purposes for use with Cadence tools.
+#
+# This work is Cadence intellectual property and may under no circumstances be
+# given to third parties, neither in original nor in modified versions, without
+# explicit written permission from Cadence. The information contained herein is
+# the proprietary and confidential information of Cadence or its licensors, and
+# is supplied subject to, and may be used only by Cadence's current customers
+# in accordance with, a previously executed license agreement between Cadence
+# and its customer.
+#
+#------------------------------------------------------------------------------
+# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL
+# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  MATERIAL, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###############################################################################
+
+##########################################################################################
+#                        INNOVUS FOUNDATION FLOW
+#-----------------------------------------------------------------------------------------
+# This is the Innovus foundation flow configuration file.  It contains all the necessary flow
+# options to drive the CDNS flat and/or hier implementation flows. For low power flow,
+# an addition low power configuration file (lp_config.tcl) is also required if power
+# domain specific information needs to be defined.
+##########################################################################################
+# Optionally define the following when applicable
+# --------------------------------------------------------------------
+#set vars(assign_buffer)                  {1 -buffer }"
+#set vars(buffer_tie_assign)              
+#set vars(dont_use_list)                  
+#set vars(delay_cells)                    
+#set vars(tie_cells)                      
+#set vars(tie_cells,max_distance)         
+#set vars(tie_cells,max_fanout)           
+#set vars(skew_buffers)                   
+#set vars(filler_cells)                   
+#set vars(clock_gate_cells)               
+#set vars(jtag_cells)                     
+#set vars(jtag_rows)                      
+#set vars(spare_cells)                    
+#set vars(enable_ocv)                     
+#set vars(enable_cppr)                    
+#set vars(enable_ss)                      
+#set vars(place_io_pins)                   
+#set vars(clock_gate_aware)               
+#set vars(clock_gate_clone)               
+#set vars(clock_eco)                      
+#set vars(high_timing_effort)             
+#set vars(congestion_effort)              
+#set vars(in_place_opt)                   
+#set vars(leakage_power_effort)           
+#set vars(dynamic_power_effort)           
+#set vars(useful_skew)                    
+#set vars(preserve_assertions)            
+#set vars(critical_range)                  
+#set vars(all_end_points)                 
+#set vars(size_only_file)                  
+#set vars(fix_fanout_load)                
+#set vars(run_cts)                        
+#set vars(cts_engine)                      
+#set vars(cts_cell_list)                  
+#set vars(cts_buffer_cells)               
+#set vars(cts_inverter_cells)             
+#set vars(cts_use_inverters)              
+#set vars(cts_effort)                     
+#set vars(cts_io_opt)                     
+#set vars(clk_tree_top_layer)             
+#set vars(clk_leaf_top_layer)             
+#set vars(clk_tree_bottom_layer)          
+#set vars(clk_leaf_bottom_layer)          
+#set vars(clk_tree_ndr)                   
+#set vars(clk_tree_extra_space)           
+#set vars(clk_leaf_ndr)                   
+#set vars(clk_leaf_extra_space)           
+#set vars(route_clock_nets)               
+#set vars(postcts_setup_hold)             
+#set vars(fix_hold)                       
+#set vars(fix_hold_ignore_ios)            
+#set vars(fix_hold_allow_tns_degradation) 
+#set vars(multi_cut_effort)               
+#set vars(litho_driven_routing)           
+#set vars(verify_litho)                   
+#set vars(lpa_tech_file)                  
+#set vars(postroute_spread_wires)         
+#set vars(track_opt)                      
+#set vars(postroute_extraction_effort)    
+#set vars(postroute_setup_hold)           
+#set vars(signoff_extraction_effort)      
+#set vars(si_analysis_type)               
+#set vars(acceptable_wns)                 
+#set vars(report_power)                   
+#set vars(report_run_time)                
+#set vars(save_rc)                        
+#set vars(save_constraints)               
+#set vars(absolute_lib_path)              
+#set vars(relative_path)                  
+#set vars(time_design_options,setup)      "list of valid timeDesign options EXCLUDING -preCTS/postCTS/postRoute -prefix and -outDir"
+#set vars(time_design_options,hold)       "list of valid timeDesign options EXCLUDING -preCTS/postCTS/postRoute -prefix and -outDir"
+# --------------------------------------------------------------------
+#  For hierarchical flows ...
+#set vars(insert_feedthrough)              
+#set vars(placement_based_ptn)             
+#set vars(use_flexmodels)                  
+#set vars(use_proto_net_delay_model)       
+#set vars(budget_mode)                     "trial_ipo proto_net_delay_model giga_opt"
+#set vars(flexmodel_as_ptn)                
+#set vars(flexmodel_art_based)             
+
+###############################################################################
+# Below are the available plug-ins for the flat foundation flow.  Each 
+# should point to a file. If the file doesn't exist, the flow will print
+# a warning an continue.  The place_tcl and cts_tcl are unique in that 
+# they REPLACE the placeDesign and clockDesign calls, respectively.
+# --------------------------------------------------------------------
+#set vars(always_source_tcl)              
+#set vars(final_always_source_tcl)        
+#set vars(pre_init_tcl)                   
+#set vars(post_init_tcl)                  
+#set vars(pre_place_tcl)                  
+#set vars(place_tcl)                      
+#set vars(post_place_tcl)                 
+#set vars(pre_prects_tcl)                 
+#set vars(post_prects_tcl)                
+#set vars(pre_cts_tcl)                    
+#set vars(cts_tcl)                        
+#set vars(post_cts_tcl)                   
+#set vars(pre_postcts_tcl)                
+#set vars(post_postcts_tcl)               
+#set vars(pre_postcts_hold_tcl)           
+#set vars(post_postcts_hold_tcl)          
+#set vars(pre_route_tcl)                  
+#set vars(post_route_tcl)                 
+#set vars(pre_postroute_tcl)              
+#set vars(post_postroute_tcl)             
+#set vars(pre_postroute_hold_tcl)         
+#set vars(post_postroute_hold_tcl)        
+#set vars(pre_postroute_si_tcl)           
+#set vars(post_postroute_si_tcl)          
+#set vars(pre_postroute_si_hold_tcl)      
+#set vars(post_postroute_si_hold_tcl)     
+#set vars(pre_signoff_tcl)                
+#set vars(post_signoff_tcl)               
+# --------------------------------------------------------------------
+# Below are the plug-ins available for the hierarhical flow ... note
+# the additional plug-ins for the partition and assemble steps.  
+# Keep in mind 
+#    - The partitioning step will also load the pre/post init
+#      and pre/post place plug-ins.
+#    - The assemble step will also load the pre/post signoff
+#      plug-ins as well.  
+# --------------------------------------------------------------------
+#set vars(always_source_tcl)              
+#set vars(final_always_source_tcl)        
+#set vars(pre_init_tcl)                   
+#set vars(post_init_tcl)                  
+#set vars(pre_place_tcl)                  
+#set vars(place_tcl)                      
+#set vars(post_place_tcl)                 
+#set vars(pre_pin_assign_tcl)              
+#set vars(post_pin_assign_tcl)             
+#set vars(pre_partition_tcl)               
+#set vars(post_partition_tcl)              
+#set vars(pre_assemble_tcl)                
+#set vars(post_assemble_tcl)               
+#set vars(pre_signoff_tcl)                
+#set vars(post_signoff_tcl)               
+# --------------------------------------------------------------------
+# All other plug-ins are only used during the flat implementation
+# of the partitions. To enable plug-ins for partition implementation
+# define in the vars(,edi_config) file for that partition
+# --------------------------------------------------------------------
+# set vars(,edi_config_tcl)         
+# set vars(,edi_config_tcl)         
+# --------------------------------------------------------------------
+# There are additional variables called command tags that provide more
+# granular customization control.  See tags.tcl for more information
+
+#######################################################################
+# To insert metal fill during the flow define the following two
+# variables:
+# - vars(metalfill) [pre_postroute, pre_postroute_si, pre_signoff]
+# - vars(metalfill_tcl) 
+#######################################################################
+#set vars(metalfill)                  pre_postroute
+#set vars(metalfill_tcl)              
+
+#######################################################################
+# There are some flow control variables that can be set:
+# - vars(abort) controls whether codegen aborts when error is found
+#   in the variable setup.  This default to true.  When disabled,
+#   possible TCL errors can occur during flow execution
+# - vars(catch_errors) controls whether a catch is included around
+#   each set of flow step commands.  The default is true.
+# - vars(save_on_catch) controls whether a database is saved when
+#   an error is caught. This defaults to true and only works
+#   when vars(catch_errors) is true
+# - vars(mail,to) and vars(mail,steps) control whether a mail message
+#   is sent after each step completes.  When enabled a mail message
+#   will be sent (containing the timing summary if available) for 
+#   any step in vars(steps).  If vars(steps) is undefined, a message
+#   will be sent for every step.
+# 
+# --------------------------------------------------------------------
+# set vars(abort)                          "
+# set vars(catch_errors)                   "
+# set vars(save_on_catch)                  "
+# set vars(mail,to)                        [list of email addresses]
+# set vasr(mail,steps)                     [list of steps]
+# set vars(tags,verbose)                   "
+# set vars(tags,verbosity_level)           [high | low]"
+
+#######################################################################
+# Brief description of the above variables
+# --------------------------------------------------------------------
+# - dont_use_list (list of cell names to disable during optimization)
+# - delay_cells (list of delay cells to enable during hold fixing)
+# - cts_cell_list (list of cells for clockDesign)
+# - skew_buffers (list of buffers to use during useful skew)
+# - filler_cells (list of filler cells)
+# - clock_gate_cells (list of clock gating elements)
+# - jtag_cells (list of jtag instances)
+# - jtag_rows (number of rows to use during  jtag placement)
+# - spare_cells (list of spare cells instances)
+# - gds_layer_map (gds layer map file)
+# - gds_files (list of gds files)
+# - oa_ref_lib (OA reference library name)
+# - oa_abstract_view (OA abstract view name)
+# - oa_layout_view (OA layout view name)
+# - buffer_tie_assign (buffer logic 1/0 tie nets)
+# - assign_buffer (buffer assign statements)
+# --------------------------------------------------------------------
+# The flow includes some options to enable some commonly used command options.  
+# These flags provide easy access to certain options/commands within SOCE.  
+# They should be set based on the needs of the design/methodology.  
+# The inclusion of these options does not represent a recommendation. 
+# --------------------------------------------------------------------
+# For early runs, you may want to skip the cts step. To do this, use
+# 'set vars(run_cts) false'
+# --------------------------------------------------------------------
+# To select ccoptDesign for CTS, use 
+# 'set vars(cts_engine) 'ccopt' (default is cts)
+# --------------------------------------------------------------------
+# To select ccoptDesign -cts for CTS, use 
+# 'set vars(cts_engine) 'ccopt_cts' (default is cts)
+# --------------------------------------------------------------------
+# To specify the integration method for CCOPT, use
+# 'set vars(ccopt_integration) 
+# --------------------------------------------------------------------
+# To point to your own ccopt executable for scripted integration, use
+# 'set vars(ccopt_executable) '
+# --------------------------------------------------------------------
+# Some other options that affect ccopt are:
+# - vars(cts_buffer_list)
+# - vars(cts_inverter_list)
+# - vars(cts_use_inverters)
+# - vars(cts_effort)
+# - vars(cts_io_opt)
+# --------------------------------------------------------------------
+# Options for clock routing:
+# -vars(clk_tree_top_layer)    (top layer for non-leaf nets)
+# -vars(clk_leaf_top_layer)    (top layer for leaf nets) 
+# -vars(clk_tree_bottom_layer) (bottom layer for non-leaf nets)
+# -vars(clk_leaf_bottom_layer) (bottom layer for leaf nets)
+# -vars(clk_tree_ndr)          (non-default rule for non-leaf nets)
+# -vars(clk_tree_extra_space)  (extra space for non-leaf nets)
+# -vars(clk_leaf_ndr)          (non-default rule for leaf nets0
+# -vars(clk_leaf_extra_space)  (extra space for non-leaf nets)
+# ====================================================================
+# Common path pessimism removal will be enabled by default after cts
+# To disable 'set vars(enable_cppr) false'
+# --------------------------------------------------------------------
+# Analysis mode 'onChipVariation' will be enabled by default prior
+# to post-route optimization. To disable 'set vars(enable_ocv) false'
+# To enable it elsewhere in the flow, use 'set vars(enable_ocv) '
+# Where  = "pre_place | pre_prects | pre_postcts |
+#                  pre_postroute | pre_postroute_si | pre_signoff"
+# --------------------------------------------------------------------
+# The default leakage power effort is "none". For low power flows,
+# 'set vars(leakage_power_effort) high'
+# --------------------------------------------------------------------
+# The default dynamic power effort is "none". For low power flows,
+# 'set vars(dynamic_power_effort) high'
+# --------------------------------------------------------------------
+# The default recommendation is to NOT place IO pins during
+# cell placement.  To enable pin placement,  
+# set vars(place_io_pins) true 
+# --------------------------------------------------------------------
+# The enable clock gate aware placement, 
+# 'set vars(clock_gate_aware) true'
+# --------------------------------------------------------------------
+# The enable clock gate cloning, use
+# 'set vars(clock_gate_clone) true'
+# --------------------------------------------------------------------
+# The default recommendation is to route all clock nets
+# during CTS.  To disable this 'set vars(route_clock_nets) false'
+# --------------------------------------------------------------------
+# To update IO latency after CTS, use
+# 'set vars(update_io_latency) false'
+# --------------------------------------------------------------------
+# For congested designs, 'set vars(congestion_effort) high'
+# --------------------------------------------------------------------
+# To preserve constraints on IO ports (useful for hierarchical
+# designs), 'set vars(preserve_assertions) true'
+# --------------------------------------------------------------------
+# To enable useful skew optimization, 'set vars(useful_skew) true'
+# --------------------------------------------------------------------
+# To enable TNS optimization, use
+# 'set vars(all_end_points) '
+# ... critical range is no longer support 
+# --------------------------------------------------------------------
+# To use a size only file, 
+# 'set vars(size_only_file) '
+# --------------------------------------------------------------------
+# To enable fanout load fixing,
+# 'set vars(fix_fanout_load) true'
+# --------------------------------------------------------------------
+# For difficult timing designs, 'set vars(high_timing_effort) true'
+# This overrides certain user settings to enable a variety of options
+# throughout the flow for optimal QoR at the expense of runtime
+# --------------------------------------------------------------------
+# To enable -inPlaceOpt, 'set vars(in_place_opt) true
+# --------------------------------------------------------------------
+# To enable useful skew optimization, 'set vars(useful_skew) true'
+# Also, set vars(skew_buffers) to the list of useable clock buffers
+# --------------------------------------------------------------------
+# To disable hold fixing,
+# 'set vars(fix_hold) false'
+# --------------------------------------------------------------------
+# To disable hold fixing for IO, 
+# 'set vars(fix_hold_ignore_ios) true'
+# --------------------------------------------------------------------
+# To disallow hold fixing from degrading setup tns, use
+# 'set vars(fix_hold_allow_tns_degradation) false'
+# --------------------------------------------------------------------
+# The flow default is to disable multi-cut via insertion.  For 90nm
+# and below, it is recommended to insert multi-cut vias using
+# 'set vars(multi_cut_effort) medium. This will come with a runtime and
+# memory penalty and will also affect QoR.
+# For maximum multi-cut via coverage 'set vars(multi_cut_effort) high'
+# This will come with additional runtime/memory overhead.
+# --------------------------------------------------------------------
+# The default is not to do litho driven routing,
+# To enable, use 'set vars(litho_driven_routing) true'
+# To enable litho verify and repair, use 'set vars(verify_litho) true'
+# --------------------------------------------------------------------
+# To enable postroute wire spreading, use
+# 'set vars(spread_wires) true'
+# --------------------------------------------------------------------
+# To enable diode based antenna fixing, use
+# 'set vars(antenna_diode) '
+# --------------------------------------------------------------------
+# The default postroute extraction effort, is detail extraction (low).
+# To enable tQRC (medium), or iQRC (high) for the postroute closure
+# flow, use 
+# 'set vars(postroute_extraction_effort) 
+# --------------------------------------------------------------------
+# To disable AAE (default) delay calculation
+# 'set vars(enable_si_aware) false'
+# --------------------------------------------------------------------
+# To enable third party SI correlation, use
+# 'set vars(si_analysis_type) pessimistic'
+# --------------------------------------------------------------------
+# To enable celtic based analysis/fixing, use 
+# 'set vars(enable_celtic_steps) true'
+# --------------------------------------------------------------------
+# To enable power reporting at each step in the flow, use
+# 'set vars(report_power) true'
+# To provide an activity for power optimization and reporting,
+# 'set vars(activity_file)        '
+# 'set vars(activity_file_format) '
+# --------------------------------------------------------------------
+# There are some options to saveDesign:
+# To save rcdb information for postroute steps, use
+# 'set vars(save_rc) true '
+# To save timing constraints, use:
+# 'set vars(save_constraints) true'
+# The folowing are used to control how the paths are written out:
+# - vars(relative_path)
+# - vars(absolute_lib_path)
+# --------------------------------------------------------------------
+# The default is to abort if there are errors found during the setup 
+# check; to disable this, use
+# set vars(abort) false"
diff --git a/sky130_cds/pnr/TEMPLATES/INNOVUS/edi_tags.tcl b/sky130_cds/pnr/TEMPLATES/INNOVUS/edi_tags.tcl
new file mode 100755
index 000000000..57c1ad749
--- /dev/null
+++ b/sky130_cds/pnr/TEMPLATES/INNOVUS/edi_tags.tcl
@@ -0,0 +1,1199 @@
+###############################################################################
+#                       CADENCE COPYRIGHT NOTICE
+#         © 2008-2013 Cadence Design Systems, Inc. All rights reserved.
+#------------------------------------------------------------------------------
+#
+# This Foundation Flow is provided as an example of how to perform specialized
+# tasks.
+#
+# This work may not be copied, re-published, uploaded, or distributed in any way,
+# in any medium, whether in whole or in part, without prior written permission
+# from Cadence. Notwithstanding any restrictions herein, subject to compliance
+# with the terms and conditions of the Cadence software license agreement under
+# which this material was provided, this material may be copied and internally
+# distributed solely for internal purposes for use with Cadence tools.
+#
+# This work is Cadence intellectual property and may under no circumstances be
+# given to third parties, neither in original nor in modified versions, without
+# explicit written permission from Cadence. The information contained herein is
+# the proprietary and confidential information of Cadence or its licensors, and
+# is supplied subject to, and may be used only by Cadence's current customers
+# in accordance with, a previously executed license agreement between Cadence
+# and its customer.
+#
+#------------------------------------------------------------------------------
+# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL
+# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  MATERIAL, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###############################################################################
+
+##################################################################################
+# Below is a list of commands that can be tagged with the following tags:
+#
+#   - pre_tcl           => Script to be run before the tagged command
+#   - post_tcl          => Script to be run after the tagged command
+#   - replace_tcl       => Script to be run before the tagged command
+#   - skip          => Skip the tagged command
+#
+# These variables are structure ,, 
+# They should be added to your setup.tcl or innovus_config.tcl
+#
+##################################################################################
+
+# set vars(tags,verbose)                   "
+# set vars(tags,verbosity_level)           [high | low]"
+
+# set vars(init,set_distribute_host,pre_tcl)                      
+# set vars(init,set_distribute_host,post_tcl)                     
+# set vars(init,set_distribute_host,replace_tcl)                  
+# set vars(init,set_distribute_host,skip)                         
+# set vars(init,set_multi_cpu_usage,pre_tcl)                      
+# set vars(init,set_multi_cpu_usage,post_tcl)                     
+# set vars(init,set_multi_cpu_usage,replace_tcl)                  
+# set vars(init,set_multi_cpu_usage,skip)                         
+# set vars(init,set_distribute_host,pre_tcl)                      
+# set vars(init,set_distribute_host,post_tcl)                     
+# set vars(init,set_distribute_host,replace_tcl)                  
+# set vars(init,set_distribute_host,skip)                         
+# set vars(init,set_multi_cpu_usage,pre_tcl)                      
+# set vars(init,set_multi_cpu_usage,post_tcl)                     
+# set vars(init,set_multi_cpu_usage,replace_tcl)                  
+# set vars(init,set_multi_cpu_usage,skip)                         
+# set vars(init,set_rc_factor,pre_tcl)                            
+# set vars(init,set_rc_factor,post_tcl)                           
+# set vars(init,set_rc_factor,replace_tcl)                        
+# set vars(init,set_rc_factor,skip)                               
+# set vars(init,derate_timing,pre_tcl)                            
+# set vars(init,derate_timing,post_tcl)                           
+# set vars(init,derate_timing,replace_tcl)                        
+# set vars(init,derate_timing,skip)                               
+# set vars(init,create_rc_corner,pre_tcl)                         
+# set vars(init,create_rc_corner,post_tcl)                        
+# set vars(init,create_rc_corner,replace_tcl)                     
+# set vars(init,create_rc_corner,skip)                            
+# set vars(init,create_library_set,pre_tcl)                       
+# set vars(init,create_library_set,post_tcl)                      
+# set vars(init,create_library_set,replace_tcl)                   
+# set vars(init,create_library_set,skip)                          
+# set vars(init,create_op_cond,pre_tcl)                           
+# set vars(init,create_op_cond,post_tcl)                          
+# set vars(init,create_op_cond,replace_tcl)                       
+# set vars(init,create_op_cond,skip)                              
+# set vars(init,create_delay_corner,pre_tcl)                      
+# set vars(init,create_delay_corner,post_tcl)                     
+# set vars(init,create_delay_corner,replace_tcl)                  
+# set vars(init,create_delay_corner,skip)                         
+# set vars(init,create_constraint_mode,pre_tcl)                   
+# set vars(init,create_constraint_mode,post_tcl)                  
+# set vars(init,create_constraint_mode,replace_tcl)               
+# set vars(init,create_constraint_mode,skip)                      
+# set vars(init,create_analysis_view,pre_tcl)                     
+# set vars(init,create_analysis_view,post_tcl)                    
+# set vars(init,create_analysis_view,replace_tcl)                 
+# set vars(init,create_analysis_view,skip)                        
+# set vars(init,update_delay_corner,pre_tcl)                      
+# set vars(init,update_delay_corner,post_tcl)                     
+# set vars(init,update_delay_corner,replace_tcl)                  
+# set vars(init,update_delay_corner,skip)                         
+# set vars(init,update_library_set,pre_tcl)                       
+# set vars(init,update_library_set,post_tcl)                      
+# set vars(init,update_library_set,replace_tcl)                   
+# set vars(init,update_library_set,skip)                          
+# set vars(init,derate_timing,pre_tcl)                            
+# set vars(init,derate_timing,post_tcl)                           
+# set vars(init,derate_timing,replace_tcl)                        
+# set vars(init,derate_timing,skip)                               
+# set vars(init,set_default_view,pre_tcl)                         
+# set vars(init,set_default_view,post_tcl)                        
+# set vars(init,set_default_view,replace_tcl)                     
+# set vars(init,set_default_view,skip)                            
+# set vars(init,set_power_analysis_mode,pre_tcl)                  
+# set vars(init,set_power_analysis_mode,post_tcl)                 
+# set vars(init,set_power_analysis_mode,replace_tcl)              
+# set vars(init,set_power_analysis_mode,skip)                     
+# set vars(init,load_config,pre_tcl)                              
+# set vars(init,load_config,post_tcl)                             
+# set vars(init,load_config,replace_tcl)                          
+# set vars(init,load_config,skip)                                 
+# set vars(init,init_design,pre_tcl)                              
+# set vars(init,init_design,post_tcl)                             
+# set vars(init,init_design,replace_tcl)                          
+# set vars(init,init_design,skip)                                 
+# set vars(init,load_floorplan,pre_tcl)                           
+# set vars(init,load_floorplan,post_tcl)                          
+# set vars(init,load_floorplan,replace_tcl)                       
+# set vars(init,load_floorplan,skip)                              
+# set vars(init,generate_tracks,pre_tcl)                          
+# set vars(init,generate_tracks,post_tcl)                         
+# set vars(init,generate_tracks,replace_tcl)                      
+# set vars(init,generate_tracks,skip)                             
+# set vars(init,load_cpf,pre_tcl)                                 
+# set vars(init,load_cpf,post_tcl)                                
+# set vars(init,load_cpf,replace_tcl)                             
+# set vars(init,load_cpf,skip)                                    
+# set vars(init,commit_cpf,pre_tcl)                               
+# set vars(init,commit_cpf,post_tcl)                              
+# set vars(init,commit_cpf,replace_tcl)                           
+# set vars(init,commit_cpf,skip)                                  
+# set vars(init,load_ieee1801,pre_tcl)                            
+# set vars(init,load_ieee1801,post_tcl)                           
+# set vars(init,load_ieee1801,replace_tcl)                        
+# set vars(init,load_ieee1801,skip)                               
+# set vars(init,commit_ieee1801,pre_tcl)                          
+# set vars(init,commit_ieee1801,post_tcl)                         
+# set vars(init,commit_ieee1801,replace_tcl)                      
+# set vars(init,commit_ieee1801,skip)                             
+# set vars(init,read_activity_file,pre_tcl)                       
+# set vars(init,read_activity_file,post_tcl)                      
+# set vars(init,read_activity_file,replace_tcl)                   
+# set vars(init,read_activity_file,skip)                          
+# set vars(init,specify_ilm,pre_tcl)                              
+# set vars(init,specify_ilm,post_tcl)                             
+# set vars(init,specify_ilm,replace_tcl)                          
+# set vars(init,specify_ilm,skip)                                 
+# set vars(init,load_ilm_non_sdc_file,pre_tcl)                    
+# set vars(init,load_ilm_non_sdc_file,post_tcl)                   
+# set vars(init,load_ilm_non_sdc_file,replace_tcl)                
+# set vars(init,load_ilm_non_sdc_file,skip)                       
+# set vars(init,initialize_timing,pre_tcl)                        
+# set vars(init,initialize_timing,post_tcl)                       
+# set vars(init,initialize_timing,replace_tcl)                    
+# set vars(init,initialize_timing,skip)                           
+# set vars(init,load_scan,pre_tcl)                                
+# set vars(init,load_scan,post_tcl)                               
+# set vars(init,load_scan,replace_tcl)                            
+# set vars(init,load_scan,skip)                                   
+# set vars(init,specify_spare_gates,pre_tcl)                      
+# set vars(init,specify_spare_gates,post_tcl)                     
+# set vars(init,specify_spare_gates,replace_tcl)                  
+# set vars(init,specify_spare_gates,skip)                         
+# set vars(init,set_dont_use,pre_tcl)                             
+# set vars(init,set_dont_use,post_tcl)                            
+# set vars(init,set_dont_use,replace_tcl)                         
+# set vars(init,set_dont_use,skip)                                
+# set vars(init,set_max_route_layer,pre_tcl)                      
+# set vars(init,set_max_route_layer,post_tcl)                     
+# set vars(init,set_max_route_layer,replace_tcl)                  
+# set vars(init,set_max_route_layer,skip)                         
+# set vars(init,set_design_mode,pre_tcl)                          
+# set vars(init,set_design_mode,post_tcl)                         
+# set vars(init,set_design_mode,replace_tcl)                      
+# set vars(init,set_design_mode,skip)                             
+# set vars(init,insert_welltaps_endcaps,pre_tcl)                  
+# set vars(init,insert_welltaps_endcaps,post_tcl)                 
+# set vars(init,insert_welltaps_endcaps,replace_tcl)              
+# set vars(init,insert_welltaps_endcaps,skip)                     
+# set vars(init,load_config,pre_tcl)                              
+# set vars(init,load_config,post_tcl)                             
+# set vars(init,load_config,replace_tcl)                          
+# set vars(init,load_config,skip)                                 
+# set vars(init,time_design,pre_tcl)                              
+# set vars(init,time_design,post_tcl)                             
+# set vars(init,time_design,replace_tcl)                          
+# set vars(init,time_design,skip)                                 
+# set vars(init,check_design,pre_tcl)                             
+# set vars(init,check_design,post_tcl)                            
+# set vars(init,check_design,replace_tcl)                         
+# set vars(init,check_design,skip)                                
+# set vars(init,check_timing,pre_tcl)                             
+# set vars(init,check_timing,post_tcl)                            
+# set vars(init,check_timing,replace_tcl)                         
+# set vars(init,check_timing,skip)                                
+# set vars(init,report_power_domains,pre_tcl)                     
+# set vars(init,report_power_domains,post_tcl)                    
+# set vars(init,report_power_domains,replace_tcl)                 
+# set vars(init,report_power_domains,skip)                        
+# set vars(place,set_distribute_host,pre_tcl)                     
+# set vars(place,set_distribute_host,post_tcl)                    
+# set vars(place,set_distribute_host,replace_tcl)                 
+# set vars(place,set_distribute_host,skip)                        
+# set vars(place,set_multi_cpu_usage,pre_tcl)                     
+# set vars(place,set_multi_cpu_usage,post_tcl)                    
+# set vars(place,set_multi_cpu_usage,replace_tcl)                 
+# set vars(place,set_multi_cpu_usage,skip)                        
+# set vars(place,restore_design,pre_tcl)                          
+# set vars(place,restore_design,post_tcl)                         
+# set vars(place,restore_design,replace_tcl)                      
+# set vars(place,restore_design,skip)                             
+# set vars(place,initialize_step,pre_tcl)                         
+# set vars(place,initialize_step,post_tcl)                        
+# set vars(place,initialize_step,replace_tcl)                     
+# set vars(place,initialize_step,skip)                            
+# set vars(place,set_design_mode,pre_tcl)                         
+# set vars(place,set_design_mode,post_tcl)                        
+# set vars(place,set_design_mode,replace_tcl)                     
+# set vars(place,set_design_mode,skip)                            
+# set vars(place,set_delay_cal_mode,pre_tcl)                      
+# set vars(place,set_delay_cal_mode,post_tcl)                     
+# set vars(place,set_delay_cal_mode,replace_tcl)                  
+# set vars(place,set_delay_cal_mode,skip)                         
+# set vars(place,set_place_mode,pre_tcl)                          
+# set vars(place,set_place_mode,post_tcl)                         
+# set vars(place,set_place_mode,replace_tcl)                      
+# set vars(place,set_place_mode,skip)                             
+# set vars(place,set_opt_mode,pre_tcl)                            
+# set vars(place,set_opt_mode,post_tcl)                           
+# set vars(place,set_opt_mode,replace_tcl)                        
+# set vars(place,set_opt_mode,skip)                               
+# set vars(place,set_tie_hilo_mode,pre_tcl)                       
+# set vars(place,set_tie_hilo_mode,post_tcl)                      
+# set vars(place,set_tie_hilo_mode,replace_tcl)                   
+# set vars(place,set_tie_hilo_mode,skip)                          
+# set vars(place,cleanup_specify_clock_tree,pre_tcl)              
+# set vars(place,cleanup_specify_clock_tree,post_tcl)             
+# set vars(place,cleanup_specify_clock_tree,replace_tcl)          
+# set vars(place,cleanup_specify_clock_tree,skip)                 
+# set vars(place,specify_clock_tree,pre_tcl)                      
+# set vars(place,specify_clock_tree,post_tcl)                     
+# set vars(place,specify_clock_tree,replace_tcl)                  
+# set vars(place,specify_clock_tree,skip)                         
+# set vars(place,specify_jtag,pre_tcl)                            
+# set vars(place,specify_jtag,post_tcl)                           
+# set vars(place,specify_jtag,replace_tcl)                        
+# set vars(place,specify_jtag,skip)                               
+# set vars(place,place_jtag,pre_tcl)                              
+# set vars(place,place_jtag,post_tcl)                             
+# set vars(place,place_jtag,replace_tcl)                          
+# set vars(place,place_jtag,skip)                                 
+# set vars(place,eco_place,pre_tcl)                               
+# set vars(place,eco_place,post_tcl)                              
+# set vars(place,eco_place,replace_tcl)                           
+# set vars(place,eco_place,skip)                                  
+# set vars(place,place_design,pre_tcl)                            
+# set vars(place,place_design,post_tcl)                           
+# set vars(place,place_design,replace_tcl)                        
+# set vars(place,place_design,skip)                               
+# set vars(place,add_tie_cells,pre_tcl)                           
+# set vars(place,add_tie_cells,post_tcl)                          
+# set vars(place,add_tie_cells,replace_tcl)                       
+# set vars(place,add_tie_cells,skip)                              
+# set vars(place,set_tie_hi_lo_mode,pre_tcl)                       
+# set vars(place,set_tie_hi_lo_mode,post_tcl)                      
+# set vars(place,set_tie_hi_lo_mode,replace_tcl)                   
+# set vars(place,set_tie_hi_lo_mode,skip)                          
+# set vars(place,time_design,pre_tcl)                             
+# set vars(place,time_design,post_tcl)                            
+# set vars(place,time_design,replace_tcl)                         
+# set vars(place,time_design,skip)                                
+# set vars(place,save_design,pre_tcl)                             
+# set vars(place,save_design,post_tcl)                            
+# set vars(place,save_design,replace_tcl)                         
+# set vars(place,save_design,skip)                                
+# set vars(place,report_power,pre_tcl)                            
+# set vars(place,report_power,post_tcl)                           
+# set vars(place,report_power,replace_tcl)                        
+# set vars(place,report_power,skip)                               
+# set vars(place,verify_power_domain,pre_tcl)                     
+# set vars(place,verify_power_domain,post_tcl)                    
+# set vars(place,verify_power_domain,replace_tcl)                 
+# set vars(place,verify_power_domain,skip)                        
+# set vars(place,run_clp,pre_tcl)                                 
+# set vars(place,run_clp,post_tcl)                                
+# set vars(place,run_clp,replace_tcl)                             
+# set vars(place,run_clp,skip)                                    
+# set vars(prects,set_distribute_host,pre_tcl)                    
+# set vars(prects,set_distribute_host,post_tcl)                   
+# set vars(prects,set_distribute_host,replace_tcl)                
+# set vars(prects,set_distribute_host,skip)                       
+# set vars(prects,set_multi_cpu_usage,pre_tcl)                    
+# set vars(prects,set_multi_cpu_usage,post_tcl)                   
+# set vars(prects,set_multi_cpu_usage,replace_tcl)                
+# set vars(prects,set_multi_cpu_usage,skip)                       
+# set vars(prects,initialize_step,pre_tcl)                        
+# set vars(prects,initialize_step,post_tcl)                       
+# set vars(prects,initialize_step,replace_tcl)                    
+# set vars(prects,initialize_step,skip)                           
+# set vars(prects,set_design_mode,pre_tcl)                        
+# set vars(prects,set_design_mode,post_tcl)                       
+# set vars(prects,set_design_mode,replace_tcl)                    
+# set vars(prects,set_design_mode,skip)                           
+# set vars(prects,set_analysis_mode,pre_tcl)                      
+# set vars(prects,set_analysis_mode,post_tcl)                     
+# set vars(prects,set_analysis_mode,replace_tcl)                  
+# set vars(prects,set_analysis_mode,skip)                         
+# set vars(prects,set_ilm_type,pre_tcl)                           
+# set vars(prects,set_ilm_type,post_tcl)                          
+# set vars(prects,set_ilm_type,replace_tcl)                       
+# set vars(prects,set_ilm_type,skip)                              
+# set vars(prects,cleanup_specify_clock_tree,pre_tcl)             
+# set vars(prects,cleanup_specify_clock_tree,post_tcl)            
+# set vars(prects,cleanup_specify_clock_tree,replace_tcl)         
+# set vars(prects,cleanup_specify_clock_tree,skip)                
+# set vars(prects,create_clock_tree_spec,pre_tcl)                 
+# set vars(prects,create_clock_tree_spec,post_tcl)                
+# set vars(prects,create_clock_tree_spec,replace_tcl)             
+# set vars(prects,create_clock_tree_spec,skip)                    
+# set vars(prects,specify_clock_tree,pre_tcl)                     
+# set vars(prects,specify_clock_tree,post_tcl)                    
+# set vars(prects,specify_clock_tree,replace_tcl)                 
+# set vars(prects,specify_clock_tree,skip)                        
+# set vars(prects,set_useful_skew_mode,pre_tcl)                   
+# set vars(prects,set_useful_skew_mode,post_tcl)                  
+# set vars(prects,set_useful_skew_mode,replace_tcl)               
+# set vars(prects,set_useful_skew_mode,skip)                      
+# set vars(prects,set_opt_mode,pre_tcl)                           
+# set vars(prects,set_opt_mode,post_tcl)                          
+# set vars(prects,set_opt_mode,replace_tcl)                       
+# set vars(prects,set_opt_mode,skip)                              
+# set vars(prects,set_design_mode,pre_tcl)                        
+# set vars(prects,set_design_mode,post_tcl)                       
+# set vars(prects,set_design_mode,replace_tcl)                    
+# set vars(prects,set_design_mode,skip)                           
+# set vars(prects,set_delay_cal_mode,pre_tcl)                     
+# set vars(prects,set_delay_cal_mode,post_tcl)                    
+# set vars(prects,set_delay_cal_mode,replace_tcl)                 
+# set vars(prects,set_delay_cal_mode,skip)                        
+# set vars(prects,set_dont_use,pre_tcl)                           
+# set vars(prects,set_dont_use,post_tcl)                          
+# set vars(prects,set_dont_use,replace_tcl)                       
+# set vars(prects,set_dont_use,skip)                              
+# set vars(prects,opt_design,pre_tcl)                             
+# set vars(prects,opt_design,post_tcl)                            
+# set vars(prects,opt_design,replace_tcl)                         
+# set vars(prects,opt_design,skip)                                
+# set vars(prects,ck_clone_gate,pre_tcl)                          
+# set vars(prects,ck_clone_gate,post_tcl)                         
+# set vars(prects,ck_clone_gate,replace_tcl)                      
+# set vars(prects,ck_clone_gate,skip)                             
+# set vars(prects,save_design,pre_tcl)                            
+# set vars(prects,save_design,post_tcl)                           
+# set vars(prects,save_design,replace_tcl)                        
+# set vars(prects,save_design,skip)                               
+# set vars(prects,report_power,pre_tcl)                           
+# set vars(prects,report_power,post_tcl)                          
+# set vars(prects,report_power,replace_tcl)                       
+# set vars(prects,report_power,skip)                              
+# set vars(prects,verify_power_domain,pre_tcl)                    
+# set vars(prects,verify_power_domain,post_tcl)                   
+# set vars(prects,verify_power_domain,replace_tcl)                
+# set vars(prects,verify_power_domain,skip)                       
+# set vars(prects,run_clp,pre_tcl)                                
+# set vars(prects,run_clp,post_tcl)                               
+# set vars(prects,run_clp,replace_tcl)                            
+# set vars(prects,run_clp,skip)                                   
+# set vars(cts,set_distribute_host,pre_tcl)                       
+# set vars(cts,set_distribute_host,post_tcl)                      
+# set vars(cts,set_distribute_host,replace_tcl)                   
+# set vars(cts,set_distribute_host,skip)                          
+# set vars(cts,set_multi_cpu_usage,pre_tcl)                       
+# set vars(cts,set_multi_cpu_usage,post_tcl)                      
+# set vars(cts,set_multi_cpu_usage,replace_tcl)                   
+# set vars(cts,set_multi_cpu_usage,skip)                          
+# set vars(cts,initialize_step,pre_tcl)                           
+# set vars(cts,initialize_step,post_tcl)                          
+# set vars(cts,initialize_step,replace_tcl)                       
+# set vars(cts,initialize_step,skip)                              
+# set vars(cts,set_design_mode,pre_tcl)                           
+# set vars(cts,set_design_mode,post_tcl)                          
+# set vars(cts,set_design_mode,replace_tcl)                       
+# set vars(cts,set_design_mode,skip)                              
+# set vars(cts,set_cts_mode,pre_tcl)                              
+# set vars(cts,set_cts_mode,post_tcl)                             
+# set vars(cts,set_cts_mode,replace_tcl)                          
+# set vars(cts,set_cts_mode,skip)                                 
+# set vars(cts,update_ccopt_rc_corner,pre_tcl)                    
+# set vars(cts,update_ccopt_rc_corner,post_tcl)                   
+# set vars(cts,update_ccopt_rc_corner,replace_tcl)                
+# set vars(cts,update_ccopt_rc_corner,skip)                       
+# set vars(cts,set_ccopt_mode,pre_tcl)                            
+# set vars(cts,set_ccopt_mode,post_tcl)                           
+# set vars(cts,set_ccopt_mode,replace_tcl)                        
+# set vars(cts,set_ccopt_mode,skip)                               
+# set vars(cts,set_nanoroute_mode,pre_tcl)                        
+# set vars(cts,set_nanoroute_mode,post_tcl)                       
+# set vars(cts,set_nanoroute_mode,replace_tcl)                    
+# set vars(cts,set_nanoroute_mode,skip)                           
+# set vars(cts,enable_clock_gate_cells,pre_tcl)                   
+# set vars(cts,enable_clock_gate_cells,post_tcl)                  
+# set vars(cts,enable_clock_gate_cells,replace_tcl)               
+# set vars(cts,enable_clock_gate_cells,skip)                      
+# set vars(cts,create_clock_tree_spec,pre_tcl)                    
+# set vars(cts,create_clock_tree_spec,post_tcl)                   
+# set vars(cts,create_clock_tree_spec,replace_tcl)                
+# set vars(cts,create_clock_tree_spec,skip)                       
+# set vars(cts,clock_design,pre_tcl)                              
+# set vars(cts,clock_design,post_tcl)                             
+# set vars(cts,clock_design,replace_tcl)                          
+# set vars(cts,clock_design,skip)                                 
+# set vars(cts,disable_clock_gate_cells,pre_tcl)                  
+# set vars(cts,disable_clock_gate_cells,post_tcl)                 
+# set vars(cts,disable_clock_gate_cells,replace_tcl)              
+# set vars(cts,disable_clock_gate_cells,skip)                     
+# set vars(cts,run_clock_eco,pre_tcl)                             
+# set vars(cts,run_clock_eco,post_tcl)                            
+# set vars(cts,run_clock_eco,replace_tcl)                         
+# set vars(cts,run_clock_eco,skip)                                
+# set vars(cts,update_timing,pre_tcl)                             
+# set vars(cts,update_timing,post_tcl)                            
+# set vars(cts,update_timing,replace_tcl)                         
+# set vars(cts,update_timing,skip)                                
+# set vars(cts,create_ccopt_clock_tree_spec,pre_tcl)              
+# set vars(cts,create_ccopt_clock_tree_spec,post_tcl)             
+# set vars(cts,create_ccopt_clock_tree_spec,replace_tcl)          
+# set vars(cts,create_ccopt_clock_tree_spec,skip)                 
+# set vars(cts,ccopt_design,pre_tcl)                              
+# set vars(cts,ccopt_design,post_tcl)                             
+# set vars(cts,ccopt_design,replace_tcl)                          
+# set vars(cts,ccopt_design,skip)                                 
+# set vars(cts,time_design,pre_tcl)                               
+# set vars(cts,time_design,post_tcl)                              
+# set vars(cts,time_design,replace_tcl)                           
+# set vars(cts,time_design,skip)                                  
+# set vars(cts,save_design,pre_tcl)                               
+# set vars(cts,save_design,post_tcl)                              
+# set vars(cts,save_design,replace_tcl)                           
+# set vars(cts,save_design,skip)                                  
+# set vars(cts,report_power,pre_tcl)                              
+# set vars(cts,report_power,post_tcl)                             
+# set vars(cts,report_power,replace_tcl)                          
+# set vars(cts,report_power,skip)                                 
+# set vars(cts,verify_power_domain,pre_tcl)                       
+# set vars(cts,verify_power_domain,post_tcl)                      
+# set vars(cts,verify_power_domain,replace_tcl)                   
+# set vars(cts,verify_power_domain,skip)                          
+# set vars(cts,run_clp,pre_tcl)                                   
+# set vars(cts,run_clp,post_tcl)                                  
+# set vars(cts,run_clp,replace_tcl)                               
+# set vars(cts,run_clp,skip)                                      
+# set vars(postcts,set_distribute_host,pre_tcl)                   
+# set vars(postcts,set_distribute_host,post_tcl)                  
+# set vars(postcts,set_distribute_host,replace_tcl)               
+# set vars(postcts,set_distribute_host,skip)                      
+# set vars(postcts,set_multi_cpu_usage,pre_tcl)                   
+# set vars(postcts,set_multi_cpu_usage,post_tcl)                  
+# set vars(postcts,set_multi_cpu_usage,replace_tcl)               
+# set vars(postcts,set_multi_cpu_usage,skip)                      
+# set vars(postcts,initialize_step,pre_tcl)                       
+# set vars(postcts,initialize_step,post_tcl)                      
+# set vars(postcts,initialize_step,replace_tcl)                   
+# set vars(postcts,initialize_step,skip)                          
+# set vars(postcts,set_design_mode,pre_tcl)                       
+# set vars(postcts,set_design_mode,post_tcl)                      
+# set vars(postcts,set_design_mode,replace_tcl)                   
+# set vars(postcts,set_design_mode,skip)                          
+# set vars(postcts,set_delay_cal_mode,pre_tcl)                    
+# set vars(postcts,set_delay_cal_mode,post_tcl)                   
+# set vars(postcts,set_delay_cal_mode,replace_tcl)                
+# set vars(postcts,set_delay_cal_mode,skip)                       
+# set vars(postcts,set_analysis_mode,pre_tcl)                     
+# set vars(postcts,set_analysis_mode,post_tcl)                    
+# set vars(postcts,set_analysis_mode,replace_tcl)                 
+# set vars(postcts,set_analysis_mode,skip)                        
+# set vars(postcts,set_opt_mode,pre_tcl)                          
+# set vars(postcts,set_opt_mode,post_tcl)                         
+# set vars(postcts,set_opt_mode,replace_tcl)                      
+# set vars(postcts,set_opt_mode,skip)                             
+# set vars(postcts,opt_design,pre_tcl)                            
+# set vars(postcts,opt_design,post_tcl)                           
+# set vars(postcts,opt_design,replace_tcl)                        
+# set vars(postcts,opt_design,skip)                               
+# set vars(postcts,save_design,pre_tcl)                           
+# set vars(postcts,save_design,post_tcl)                          
+# set vars(postcts,save_design,replace_tcl)                       
+# set vars(postcts,save_design,skip)                              
+# set vars(postcts,report_power,pre_tcl)                          
+# set vars(postcts,report_power,post_tcl)                         
+# set vars(postcts,report_power,replace_tcl)                      
+# set vars(postcts,report_power,skip)                             
+# set vars(postcts,verify_power_domain,pre_tcl)                   
+# set vars(postcts,verify_power_domain,post_tcl)                  
+# set vars(postcts,verify_power_domain,replace_tcl)               
+# set vars(postcts,verify_power_domain,skip)                      
+# set vars(postcts,run_clp,pre_tcl)                               
+# set vars(postcts,run_clp,post_tcl)                              
+# set vars(postcts,run_clp,replace_tcl)                           
+# set vars(postcts,run_clp,skip)                                  
+# set vars(postcts_hold,set_distribute_host,pre_tcl)              
+# set vars(postcts_hold,set_distribute_host,post_tcl)             
+# set vars(postcts_hold,set_distribute_host,replace_tcl)          
+# set vars(postcts_hold,set_distribute_host,skip)                 
+# set vars(postcts_hold,set_multi_cpu_usage,pre_tcl)              
+# set vars(postcts_hold,set_multi_cpu_usage,post_tcl)             
+# set vars(postcts_hold,set_multi_cpu_usage,replace_tcl)          
+# set vars(postcts_hold,set_multi_cpu_usage,skip)                 
+# set vars(postcts_hold,initialize_step,pre_tcl)                  
+# set vars(postcts_hold,initialize_step,post_tcl)                 
+# set vars(postcts_hold,initialize_step,replace_tcl)              
+# set vars(postcts_hold,initialize_step,skip)                     
+# set vars(postcts_hold,set_dont_use,pre_tcl)                     
+# set vars(postcts_hold,set_dont_use,post_tcl)                    
+# set vars(postcts_hold,set_dont_use,replace_tcl)                 
+# set vars(postcts_hold,set_dont_use,skip)                        
+# set vars(postcts_hold,set_opt_mode,pre_tcl)                     
+# set vars(postcts_hold,set_opt_mode,post_tcl)                    
+# set vars(postcts_hold,set_opt_mode,replace_tcl)                 
+# set vars(postcts_hold,set_opt_mode,skip)                        
+# set vars(postcts_hold,opt_design,pre_tcl)                       
+# set vars(postcts_hold,opt_design,post_tcl)                      
+# set vars(postcts_hold,opt_design,replace_tcl)                   
+# set vars(postcts_hold,opt_design,skip)                          
+# set vars(postcts_hold,save_design,pre_tcl)                      
+# set vars(postcts_hold,save_design,post_tcl)                     
+# set vars(postcts_hold,save_design,replace_tcl)                  
+# set vars(postcts_hold,save_design,skip)                         
+# set vars(postcts_hold,report_power,pre_tcl)                     
+# set vars(postcts_hold,report_power,post_tcl)                    
+# set vars(postcts_hold,report_power,replace_tcl)                 
+# set vars(postcts_hold,report_power,skip)                        
+# set vars(postcts_hold,verify_power_domain,pre_tcl)              
+# set vars(postcts_hold,verify_power_domain,post_tcl)             
+# set vars(postcts_hold,verify_power_domain,replace_tcl)          
+# set vars(postcts_hold,verify_power_domain,skip)                 
+# set vars(postcts_hold,run_clp,pre_tcl)                          
+# set vars(postcts_hold,run_clp,post_tcl)                         
+# set vars(postcts_hold,run_clp,replace_tcl)                      
+# set vars(postcts_hold,run_clp,skip)                             
+# set vars(route,set_distribute_host,pre_tcl)                     
+# set vars(route,set_distribute_host,post_tcl)                    
+# set vars(route,set_distribute_host,replace_tcl)                 
+# set vars(route,set_distribute_host,skip)                        
+# set vars(route,set_multi_cpu_usage,pre_tcl)                     
+# set vars(route,set_multi_cpu_usage,post_tcl)                    
+# set vars(route,set_multi_cpu_usage,replace_tcl)                 
+# set vars(route,set_multi_cpu_usage,skip)                        
+# set vars(route,initialize_step,pre_tcl)                         
+# set vars(route,initialize_step,post_tcl)                        
+# set vars(route,initialize_step,replace_tcl)                     
+# set vars(route,initialize_step,skip)                            
+# set vars(route,set_nanoroute_mode,pre_tcl)                      
+# set vars(route,set_nanoroute_mode,post_tcl)                     
+# set vars(route,set_nanoroute_mode,replace_tcl)                  
+# set vars(route,set_nanoroute_mode,skip)                         
+# set vars(route,add_filler_cells,pre_tcl)                        
+# set vars(route,add_filler_cells,post_tcl)                       
+# set vars(route,add_filler_cells,replace_tcl)                    
+# set vars(route,add_filler_cells,skip)                           
+# set vars(route,route_secondary_pg_nets,pre_tcl)                 
+# set vars(route,route_secondary_pg_nets,post_tcl)                
+# set vars(route,route_secondary_pg_nets,replace_tcl)             
+# set vars(route,route_secondary_pg_nets,skip)                    
+# set vars(route,check_place,pre_tcl)                             
+# set vars(route,check_place,post_tcl)                            
+# set vars(route,check_place,replace_tcl)                         
+# set vars(route,check_place,skip)                                
+# set vars(route_design,set_analysis_mode,pre_tcl)                
+# set vars(route_design,set_analysis_mode,post_tcl)               
+# set vars(route_design,set_analysis_mode,replace_tcl)            
+# set vars(route_design,set_analysis_mode,skip)                   
+# set vars(route,route_design,pre_tcl)                            
+# set vars(route,route_design,post_tcl)                           
+# set vars(route,route_design,replace_tcl)                        
+# set vars(route,route_design,skip)                               
+# set vars(route,run_clock_eco,pre_tcl)                           
+# set vars(route,run_clock_eco,post_tcl)                          
+# set vars(route,run_clock_eco,replace_tcl)                       
+# set vars(route,run_clock_eco,skip)                              
+# set vars(route,spread_wires,pre_tcl)                            
+# set vars(route,spread_wires,post_tcl)                           
+# set vars(route,spread_wires,replace_tcl)                        
+# set vars(route,spread_wires,skip)                               
+# set vars(route,set_extract_rc_mode,pre_tcl)                     
+# set vars(route,set_extract_rc_mode,post_tcl)                    
+# set vars(route,set_extract_rc_mode,replace_tcl)                 
+# set vars(route,set_extract_rc_mode,skip)                        
+# set vars(route,initialize_timing,pre_tcl)                       
+# set vars(route,initialize_timing,post_tcl)                      
+# set vars(route,initialize_timing,replace_tcl)                   
+# set vars(route,initialize_timing,skip)                          
+# set vars(route,time_design,pre_tcl)                             
+# set vars(route,time_design,post_tcl)                            
+# set vars(route,time_design,replace_tcl)                         
+# set vars(route,time_design,skip)                                
+# set vars(route,save_design,pre_tcl)                             
+# set vars(route,save_design,post_tcl)                            
+# set vars(route,save_design,replace_tcl)                         
+# set vars(route,save_design,skip)                                
+# set vars(route,report_power,pre_tcl)                            
+# set vars(route,report_power,post_tcl)                           
+# set vars(route,report_power,replace_tcl)                        
+# set vars(route,report_power,skip)                               
+# set vars(route,verify_power_domain,pre_tcl)                     
+# set vars(route,verify_power_domain,post_tcl)                    
+# set vars(route,verify_power_domain,replace_tcl)                 
+# set vars(route,verify_power_domain,skip)                        
+# set vars(route,run_clp,pre_tcl)                                 
+# set vars(route,run_clp,post_tcl)                                
+# set vars(route,run_clp,replace_tcl)                             
+# set vars(route,run_clp,skip)                                    
+# set vars(postroute,set_distribute_host,pre_tcl)                 
+# set vars(postroute,set_distribute_host,post_tcl)                
+# set vars(postroute,set_distribute_host,replace_tcl)             
+# set vars(postroute,set_distribute_host,skip)                    
+# set vars(postroute,set_multi_cpu_usage,pre_tcl)                 
+# set vars(postroute,set_multi_cpu_usage,post_tcl)                
+# set vars(postroute,set_multi_cpu_usage,replace_tcl)             
+# set vars(postroute,set_multi_cpu_usage,skip)                    
+# set vars(postroute,initialize_step,pre_tcl)                     
+# set vars(postroute,initialize_step,post_tcl)                    
+# set vars(postroute,initialize_step,replace_tcl)                 
+# set vars(postroute,initialize_step,skip)                        
+# set vars(postroute,set_design_mode,pre_tcl)                     
+# set vars(postroute,set_design_mode,post_tcl)                    
+# set vars(postroute,set_design_mode,replace_tcl)                 
+# set vars(postroute,set_design_mode,skip)                        
+# set vars(postroute,set_extract_rc_mode,pre_tcl)                 
+# set vars(postroute,set_extract_rc_mode,post_tcl)                
+# set vars(postroute,set_extract_rc_mode,replace_tcl)             
+# set vars(postroute,set_extract_rc_mode,skip)                    
+# set vars(postroute,set_analysis_mode,pre_tcl)                   
+# set vars(postroute,set_analysis_mode,post_tcl)                  
+# set vars(postroute,set_analysis_mode,replace_tcl)               
+# set vars(postroute,set_analysis_mode,skip)                      
+# set vars(postroute,set_delay_cal_mode,pre_tcl)                  
+# set vars(postroute,set_delay_cal_mode,post_tcl)                 
+# set vars(postroute,set_delay_cal_mode,replace_tcl)              
+# set vars(postroute,set_delay_cal_mode,skip)                     
+# set vars(postroute,add_metalfill,pre_tcl)                       
+# set vars(postroute,add_metalfill,post_tcl)                      
+# set vars(postroute,add_metalfill,replace_tcl)                   
+# set vars(postroute,add_metalfill,skip)                          
+# set vars(postroute,delete_filler_cells,pre_tcl)                 
+# set vars(postroute,delete_filler_cells,post_tcl)                
+# set vars(postroute,delete_filler_cells,replace_tcl)             
+# set vars(postroute,delete_filler_cells,skip)                    
+# set vars(postroute,opt_design,pre_tcl)                          
+# set vars(postroute,opt_design,post_tcl)                         
+# set vars(postroute,opt_design,replace_tcl)                      
+# set vars(postroute,opt_design,skip)                             
+# set vars(postroute,add_filler_cells,pre_tcl)                    
+# set vars(postroute,add_filler_cells,post_tcl)                   
+# set vars(postroute,add_filler_cells,replace_tcl)                
+# set vars(postroute,add_filler_cells,skip)                       
+# set vars(postroute,trim_metalfill,pre_tcl)                      
+# set vars(postroute,trim_metalfill,post_tcl)                     
+# set vars(postroute,trim_metalfill,replace_tcl)                  
+# set vars(postroute,trim_metalfill,skip)                         
+# set vars(route,verify_litho,pre_tcl)                            
+# set vars(route,verify_litho,post_tcl)                           
+# set vars(route,verify_litho,replace_tcl)                        
+# set vars(route,verify_litho,skip)                               
+# set vars(postroute,save_design,pre_tcl)                         
+# set vars(postroute,save_design,post_tcl)                        
+# set vars(postroute,save_design,replace_tcl)                     
+# set vars(postroute,save_design,skip)                            
+# set vars(postroute,report_power,pre_tcl)                        
+# set vars(postroute,report_power,post_tcl)                       
+# set vars(postroute,report_power,replace_tcl)                    
+# set vars(postroute,report_power,skip)                           
+# set vars(postroute,verify_power_domain,pre_tcl)                 
+# set vars(postroute,verify_power_domain,post_tcl)                
+# set vars(postroute,verify_power_domain,replace_tcl)             
+# set vars(postroute,verify_power_domain,skip)                    
+# set vars(postroute,run_clp,pre_tcl)                             
+# set vars(postroute,run_clp,post_tcl)                            
+# set vars(postroute,run_clp,replace_tcl)                         
+# set vars(postroute,run_clp,skip)                                
+# set vars(postroute_hold,set_distribute_host,pre_tcl)            
+# set vars(postroute_hold,set_distribute_host,post_tcl)           
+# set vars(postroute_hold,set_distribute_host,replace_tcl)        
+# set vars(postroute_hold,set_distribute_host,skip)               
+# set vars(postroute_hold,set_multi_cpu_usage,pre_tcl)            
+# set vars(postroute_hold,set_multi_cpu_usage,post_tcl)           
+# set vars(postroute_hold,set_multi_cpu_usage,replace_tcl)        
+# set vars(postroute_hold,set_multi_cpu_usage,skip)               
+# set vars(postroute_hold,initialize_step,pre_tcl)                
+# set vars(postroute_hold,initialize_step,post_tcl)               
+# set vars(postroute_hold,initialize_step,replace_tcl)            
+# set vars(postroute_hold,initialize_step,skip)                   
+# set vars(postroute_hold,set_design_mode,pre_tcl)                
+# set vars(postroute_hold,set_design_mode,post_tcl)               
+# set vars(postroute_hold,set_design_mode,replace_tcl)            
+# set vars(postroute_hold,set_design_mode,skip)                   
+# set vars(postroute_hold,set_extract_rc_mode,pre_tcl)            
+# set vars(postroute_hold,set_extract_rc_mode,post_tcl)           
+# set vars(postroute_hold,set_extract_rc_mode,replace_tcl)        
+# set vars(postroute_hold,set_extract_rc_mode,skip)               
+# set vars(postroute_hold,set_dont_use_mode,pre_tcl)              
+# set vars(postroute_hold,set_dont_use_mode,post_tcl)             
+# set vars(postroute_hold,set_dont_use_mode,replace_tcl)          
+# set vars(postroute_hold,set_dont_use_mode,skip)                 
+# set vars(postroute_hold,set_opt_mode,pre_tcl)                   
+# set vars(postroute_hold,set_opt_mode,post_tcl)                  
+# set vars(postroute_hold,set_opt_mode,replace_tcl)               
+# set vars(postroute_hold,set_opt_mode,skip)                      
+# set vars(postroute_hold,delete_filler_cells,pre_tcl)            
+# set vars(postroute_hold,delete_filler_cells,post_tcl)           
+# set vars(postroute_hold,delete_filler_cells,replace_tcl)        
+# set vars(postroute_hold,delete_filler_cells,skip)               
+# set vars(postroute_hold,opt_design,pre_tcl)                     
+# set vars(postroute_hold,opt_design,post_tcl)                    
+# set vars(postroute_hold,opt_design,replace_tcl)                 
+# set vars(postroute_hold,opt_design,skip)                        
+# set vars(postroute_hold,add_filler_cells,pre_tcl)               
+# set vars(postroute_hold,add_filler_cells,post_tcl)              
+# set vars(postroute_hold,add_filler_cells,replace_tcl)           
+# set vars(postroute_hold,add_filler_cells,skip)                  
+# set vars(postroute_hold,trim_metalfill,pre_tcl)                 
+# set vars(postroute_hold,trim_metalfill,post_tcl)                
+# set vars(postroute_hold,trim_metalfill,replace_tcl)             
+# set vars(postroute_hold,trim_metalfill,skip)                    
+# set vars(postroute_hold,save_design,pre_tcl)                    
+# set vars(postroute_hold,save_design,post_tcl)                   
+# set vars(postroute_hold,save_design,replace_tcl)                
+# set vars(postroute_hold,save_design,skip)                       
+# set vars(postroute_hold,report_power,pre_tcl)                   
+# set vars(postroute_hold,report_power,post_tcl)                  
+# set vars(postroute_hold,report_power,replace_tcl)               
+# set vars(postroute_hold,report_power,skip)                      
+# set vars(postroute_hold,verify_power_domain,pre_tcl)            
+# set vars(postroute_hold,verify_power_domain,post_tcl)           
+# set vars(postroute_hold,verify_power_domain,replace_tcl)        
+# set vars(postroute_hold,verify_power_domain,skip)               
+# set vars(postroute_hold,run_clp,pre_tcl)                        
+# set vars(postroute_hold,run_clp,post_tcl)                       
+# set vars(postroute_hold,run_clp,replace_tcl)                    
+# set vars(postroute_hold,run_clp,skip)                           
+# set vars(postroute_si_hold,set_distribute_host,pre_tcl)         
+# set vars(postroute_si_hold,set_distribute_host,post_tcl)        
+# set vars(postroute_si_hold,set_distribute_host,replace_tcl)     
+# set vars(postroute_si_hold,set_distribute_host,skip)            
+# set vars(postroute_si_hold,set_multi_cpu_usage,pre_tcl)         
+# set vars(postroute_si_hold,set_multi_cpu_usage,post_tcl)        
+# set vars(postroute_si_hold,set_multi_cpu_usage,replace_tcl)     
+# set vars(postroute_si_hold,set_multi_cpu_usage,skip)            
+# set vars(postroute_si_hold,initialize_step,pre_tcl)             
+# set vars(postroute_si_hold,initialize_step,post_tcl)            
+# set vars(postroute_si_hold,initialize_step,replace_tcl)         
+# set vars(postroute_si_hold,initialize_step,skip)                
+# set vars(postroute_si_hold,set_design_mode,pre_tcl)             
+# set vars(postroute_si_hold,set_design_mode,post_tcl)            
+# set vars(postroute_si_hold,set_design_mode,replace_tcl)         
+# set vars(postroute_si_hold,set_design_mode,skip)                
+# set vars(postroute_si_hold,set_dont_use,pre_tcl)                
+# set vars(postroute_si_hold,set_dont_use,post_tcl)               
+# set vars(postroute_si_hold,set_dont_use,replace_tcl)            
+# set vars(postroute_si_hold,set_dont_use,skip)                   
+# set vars(postroute_si_hold,set_opt_mode,pre_tcl)                
+# set vars(postroute_si_hold,set_opt_mode,post_tcl)               
+# set vars(postroute_si_hold,set_opt_mode,replace_tcl)            
+# set vars(postroute_si_hold,set_opt_mode,skip)                   
+# set vars(postroute_si_hold,set_extract_rc_mode,pre_tcl)         
+# set vars(postroute_si_hold,set_extract_rc_mode,post_tcl)        
+# set vars(postroute_si_hold,set_extract_rc_mode,replace_tcl)     
+# set vars(postroute_si_hold,set_extract_rc_mode,skip)            
+# set vars(postroute_si_hold,set_si_mode,pre_tcl)                 
+# set vars(postroute_si_hold,set_si_mode,post_tcl)                
+# set vars(postroute_si_hold,set_si_mode,replace_tcl)             
+# set vars(postroute_si_hold,set_si_mode,skip)                    
+# set vars(postroute_si_hold,set_delay_cal_mode,pre_tcl)          
+# set vars(postroute_si_hold,set_delay_cal_mode,post_tcl)         
+# set vars(postroute_si_hold,set_delay_cal_mode,replace_tcl)      
+# set vars(postroute_si_hold,set_delay_cal_mode,skip)             
+# set vars(postroute_si_hold,set_analysis_mode,pre_tcl)           
+# set vars(postroute_si_hold,set_analysis_mode,post_tcl)          
+# set vars(postroute_si_hold,set_analysis_mode,replace_tcl)       
+# set vars(postroute_si_hold,set_analysis_mode,skip)              
+# set vars(postroute_si_hold,add_metalfill,pre_tcl)               
+# set vars(postroute_si_hold,add_metalfill,post_tcl)              
+# set vars(postroute_si_hold,add_metalfill,replace_tcl)           
+# set vars(postroute_si_hold,add_metalfill,skip)                  
+# set vars(postroute_si_hold,delete_filler_cells,pre_tcl)         
+# set vars(postroute_si_hold,delete_filler_cells,post_tcl)        
+# set vars(postroute_si_hold,delete_filler_cells,replace_tcl)     
+# set vars(postroute_si_hold,delete_filler_cells,skip)            
+# set vars(postroute_si_hold,opt_design,pre_tcl)                  
+# set vars(postroute_si_hold,opt_design,post_tcl)                 
+# set vars(postroute_si_hold,opt_design,replace_tcl)              
+# set vars(postroute_si_hold,opt_design,skip)                     
+# set vars(postroute_si_hold,add_filler_cells,pre_tcl)            
+# set vars(postroute_si_hold,add_filler_cells,post_tcl)           
+# set vars(postroute_si_hold,add_filler_cells,replace_tcl)        
+# set vars(postroute_si_hold,add_filler_cells,skip)               
+# set vars(postroute_si_hold,trim_metalfill,pre_tcl)              
+# set vars(postroute_si_hold,trim_metalfill,post_tcl)             
+# set vars(postroute_si_hold,trim_metalfill,replace_tcl)          
+# set vars(postroute_si_hold,trim_metalfill,skip)                 
+# set vars(postroute_si_hold,save_design,pre_tcl)                 
+# set vars(postroute_si_hold,save_design,post_tcl)                
+# set vars(postroute_si_hold,save_design,replace_tcl)             
+# set vars(postroute_si_hold,save_design,skip)                    
+# set vars(postroute_si_hold,report_power,pre_tcl)                
+# set vars(postroute_si_hold,report_power,post_tcl)               
+# set vars(postroute_si_hold,report_power,replace_tcl)            
+# set vars(postroute_si_hold,report_power,skip)                   
+# set vars(postroute_si_hold,verify_power_domain,pre_tcl)         
+# set vars(postroute_si_hold,verify_power_domain,post_tcl)        
+# set vars(postroute_si_hold,verify_power_domain,replace_tcl)     
+# set vars(postroute_si_hold,verify_power_domain,skip)            
+# set vars(postroute_si_hold,run_clp,pre_tcl)                     
+# set vars(postroute_si_hold,run_clp,post_tcl)                    
+# set vars(postroute_si_hold,run_clp,replace_tcl)                 
+# set vars(postroute_si_hold,run_clp,skip)                        
+# set vars(postroute_si,set_distribute_host,pre_tcl)              
+# set vars(postroute_si,set_distribute_host,post_tcl)             
+# set vars(postroute_si,set_distribute_host,replace_tcl)          
+# set vars(postroute_si,set_distribute_host,skip)                 
+# set vars(postroute_si,set_multi_cpu_usage,pre_tcl)              
+# set vars(postroute_si,set_multi_cpu_usage,post_tcl)             
+# set vars(postroute_si,set_multi_cpu_usage,replace_tcl)          
+# set vars(postroute_si,set_multi_cpu_usage,skip)                 
+# set vars(postroute_si,initialize_step,pre_tcl)                  
+# set vars(postroute_si,initialize_step,post_tcl)                 
+# set vars(postroute_si,initialize_step,replace_tcl)              
+# set vars(postroute_si,initialize_step,skip)                     
+# set vars(postroute_si,set_design_mode,pre_tcl)                  
+# set vars(postroute_si,set_design_mode,post_tcl)                 
+# set vars(postroute_si,set_design_mode,replace_tcl)              
+# set vars(postroute_si,set_design_mode,skip)                     
+# set vars(postroute_si,set_extract_rc_mode,pre_tcl)              
+# set vars(postroute_si,set_extract_rc_mode,post_tcl)             
+# set vars(postroute_si,set_extract_rc_mode,replace_tcl)          
+# set vars(postroute_si,set_extract_rc_mode,skip)                 
+# set vars(postroute_si,set_si_mode,pre_tcl)                      
+# set vars(postroute_si,set_si_mode,post_tcl)                     
+# set vars(postroute_si,set_si_mode,replace_tcl)                  
+# set vars(postroute_si,set_si_mode,skip)                         
+# set vars(postroute_si,set_analysis_mode,pre_tcl)                
+# set vars(postroute_si,set_analysis_mode,post_tcl)               
+# set vars(postroute_si,set_analysis_mode,replace_tcl)            
+# set vars(postroute_si,set_analysis_mode,skip)                   
+# set vars(postroute_si,set_delay_cal_mode,pre_tcl)               
+# set vars(postroute_si,set_delay_cal_mode,post_tcl)              
+# set vars(postroute_si,set_delay_cal_mode,replace_tcl)           
+# set vars(postroute_si,set_delay_cal_mode,skip)                  
+# set vars(postroute_si,add_metalfill,pre_tcl)                    
+# set vars(postroute_si,add_metalfill,post_tcl)                   
+# set vars(postroute_si,add_metalfill,replace_tcl)                
+# set vars(postroute_si,add_metalfill,skip)                       
+# set vars(postroute_si,delete_filler_cells,pre_tcl)              
+# set vars(postroute_si,delete_filler_cells,post_tcl)             
+# set vars(postroute_si,delete_filler_cells,replace_tcl)          
+# set vars(postroute_si,delete_filler_cells,skip)                 
+# set vars(postroute_si,opt_design,pre_tcl)                       
+# set vars(postroute_si,opt_design,post_tcl)                      
+# set vars(postroute_si,opt_design,replace_tcl)                   
+# set vars(postroute_si,opt_design,skip)                          
+# set vars(postroute_si,add_filler_cells,pre_tcl)                 
+# set vars(postroute_si,add_filler_cells,post_tcl)                
+# set vars(postroute_si,add_filler_cells,replace_tcl)             
+# set vars(postroute_si,add_filler_cells,skip)                    
+# set vars(postroute_si,trim_metalfill,pre_tcl)                   
+# set vars(postroute_si,trim_metalfill,post_tcl)                  
+# set vars(postroute_si,trim_metalfill,replace_tcl)               
+# set vars(postroute_si,trim_metalfill,skip)                      
+# set vars(postroute_si,save_design,pre_tcl)                      
+# set vars(postroute_si,save_design,post_tcl)                     
+# set vars(postroute_si,save_design,replace_tcl)                  
+# set vars(postroute_si,save_design,skip)                         
+# set vars(postroute_si,report_power,pre_tcl)                     
+# set vars(postroute_si,report_power,post_tcl)                    
+# set vars(postroute_si,report_power,replace_tcl)                 
+# set vars(postroute_si,report_power,skip)                        
+# set vars(postroute_si,verify_power_domain,pre_tcl)              
+# set vars(postroute_si,verify_power_domain,post_tcl)             
+# set vars(postroute_si,verify_power_domain,replace_tcl)          
+# set vars(postroute_si,verify_power_domain,skip)                 
+# set vars(postroute_si,run_clp,pre_tcl)                          
+# set vars(postroute_si,run_clp,post_tcl)                         
+# set vars(postroute_si,run_clp,replace_tcl)                      
+# set vars(postroute_si,run_clp,skip)                             
+# set vars(signoff,fix_litho,pre_tcl)                             
+# set vars(signoff,fix_litho,post_tcl)                            
+# set vars(signoff,fix_litho,replace_tcl)                         
+# set vars(signoff,fix_litho,skip)                                
+# set vars(signoff,add_metalfill,pre_tcl)                         
+# set vars(signoff,add_metalfill,post_tcl)                        
+# set vars(signoff,add_metalfill,replace_tcl)                     
+# set vars(signoff,add_metalfill,skip)                            
+# set vars(signoff,set_distribute_host,pre_tcl)                   
+# set vars(signoff,set_distribute_host,post_tcl)                  
+# set vars(signoff,set_distribute_host,replace_tcl)               
+# set vars(signoff,set_distribute_host,skip)                      
+# set vars(signoff,set_multi_cpu_usage,pre_tcl)                   
+# set vars(signoff,set_multi_cpu_usage,post_tcl)                  
+# set vars(signoff,set_multi_cpu_usage,replace_tcl)               
+# set vars(signoff,set_multi_cpu_usage,skip)                      
+# set vars(signoff,set_design_mode,pre_tcl)                       
+# set vars(signoff,set_design_mode,post_tcl)                      
+# set vars(signoff,set_design_mode,replace_tcl)                   
+# set vars(signoff,set_design_mode,skip)                          
+# set vars(signoff,initialize_timing,pre_tcl)                     
+# set vars(signoff,initialize_timing,post_tcl)                    
+# set vars(signoff,initialize_timing,replace_tcl)                 
+# set vars(signoff,initialize_timing,skip)                        
+# set vars(signoff,initialize_step,pre_tcl)                       
+# set vars(signoff,initialize_step,post_tcl)                      
+# set vars(signoff,initialize_step,replace_tcl)                   
+# set vars(signoff,initialize_step,skip)                          
+# set vars(signoff,set_analysis_mode,pre_tcl)                     
+# set vars(signoff,set_analysis_mode,post_tcl)                    
+# set vars(signoff,set_analysis_mode,replace_tcl)                 
+# set vars(signoff,set_analysis_mode,skip)                        
+# set vars(signoff,set_delay_cal_mode,pre_tcl)                    
+# set vars(signoff,set_delay_cal_mode,post_tcl)                   
+# set vars(signoff,set_delay_cal_mode,replace_tcl)                
+# set vars(signoff,set_delay_cal_mode,skip)                       
+# set vars(signoff,set_extract_rc_mode,pre_tcl)                   
+# set vars(signoff,set_extract_rc_mode,post_tcl)                  
+# set vars(signoff,set_extract_rc_mode,replace_tcl)               
+# set vars(signoff,set_extract_rc_mode,skip)                      
+# set vars(signoff,extract_rc,pre_tcl)                            
+# set vars(signoff,extract_rc,post_tcl)                           
+# set vars(signoff,extract_rc,replace_tcl)                        
+# set vars(signoff,extract_rc,skip)                               
+# set vars(signoff,dump_spef,pre_tcl)                             
+# set vars(signoff,dump_spef,post_tcl)                            
+# set vars(signoff,dump_spef,replace_tcl)                         
+# set vars(signoff,dump_spef,skip)                                
+# set vars(signoff,time_design_setup,pre_tcl)                     
+# set vars(signoff,time_design_setup,post_tcl)                    
+# set vars(signoff,time_design_setup,replace_tcl)                 
+# set vars(signoff,time_design_setup,skip)                        
+# set vars(signoff,time_design_hold,pre_tcl)                      
+# set vars(signoff,time_design_hold,post_tcl)                     
+# set vars(signoff,time_design_hold,replace_tcl)                  
+# set vars(signoff,time_design_hold,skip)                         
+# set vars(signoff,stream_out,pre_tcl)                            
+# set vars(signoff,stream_out,post_tcl)                           
+# set vars(signoff,stream_out,replace_tcl)                        
+# set vars(signoff,stream_out,skip)                               
+# set vars(signoff,oasis_out,pre_tcl)                             
+# set vars(signoff,oasis_out,post_tcl)                            
+# set vars(signoff,oasis_out,replace_tcl)                         
+# set vars(signoff,oasis_out,skip)                                
+# set vars(signoff,save_oa_design,pre_tcl)                        
+# set vars(signoff,save_oa_design,post_tcl)                       
+# set vars(signoff,save_oa_design,replace_tcl)                    
+# set vars(signoff,save_oa_design,skip)                           
+# set vars(signoff,create_ilm,pre_tcl)                            
+# set vars(signoff,create_ilm,post_tcl)                           
+# set vars(signoff,create_ilm,replace_tcl)                        
+# set vars(signoff,create_ilm,skip)                               
+# set vars(signoff,summary_report,pre_tcl)                        
+# set vars(signoff,summary_report,post_tcl)                       
+# set vars(signoff,summary_report,replace_tcl)                    
+# set vars(signoff,summary_report,skip)                           
+# set vars(signoff,verify_connectivity,pre_tcl)                   
+# set vars(signoff,verify_connectivity,post_tcl)                  
+# set vars(signoff,verify_connectivity,replace_tcl)               
+# set vars(signoff,verify_connectivity,skip)                      
+# set vars(signoff,verify_geometry,pre_tcl)                       
+# set vars(signoff,verify_geometry,post_tcl)                      
+# set vars(signoff,verify_geometry,replace_tcl)                   
+# set vars(signoff,verify_geometry,skip)                          
+# set vars(signoff,verify_metal_density,pre_tcl)                  
+# set vars(signoff,verify_metal_density,post_tcl)                 
+# set vars(signoff,verify_metal_density,replace_tcl)              
+# set vars(signoff,verify_metal_density,skip)                     
+# set vars(signoff,verify_process_antenna,pre_tcl)                
+# set vars(signoff,verify_process_antenna,post_tcl)               
+# set vars(signoff,verify_process_antenna,replace_tcl)            
+# set vars(signoff,verify_process_antenna,skip)                   
+# set vars(signoff,save_design,pre_tcl)                           
+# set vars(signoff,save_design,post_tcl)                          
+# set vars(signoff,save_design,replace_tcl)                       
+# set vars(signoff,save_design,skip)                              
+# set vars(signoff,report_power,pre_tcl)                          
+# set vars(signoff,report_power,post_tcl)                         
+# set vars(signoff,report_power,replace_tcl)                      
+# set vars(signoff,report_power,skip)                             
+# set vars(signoff,verify_power_domain,pre_tcl)                   
+# set vars(signoff,verify_power_domain,post_tcl)                  
+# set vars(signoff,verify_power_domain,replace_tcl)               
+# set vars(signoff,verify_power_domain,skip)                      
+# set vars(signoff,run_clp,pre_tcl)                               
+# set vars(signoff,run_clp,post_tcl)                              
+# set vars(signoff,run_clp,replace_tcl)                           
+# set vars(signoff,run_clp,skip)                                  
+# set vars(partition,initialize_timing,pre_tcl)                   
+# set vars(partition,initialize_timing,post_tcl)                  
+# set vars(partition,initialize_timing,replace_tcl)               
+# set vars(partition,initialize_timing,skip)                      
+# set vars(partition,load_cpf,pre_tcl)                            
+# set vars(partition,load_cpf,post_tcl)                           
+# set vars(partition,load_cpf,replace_tcl)                        
+# set vars(partition,load_cpf,skip)                               
+# set vars(partition,commit_cpf,pre_tcl)                          
+# set vars(partition,commit_cpf,post_tcl)                         
+# set vars(partition,commit_cpf,replace_tcl)                      
+# set vars(partition,commit_cpf,skip)                             
+# set vars(partition,load_ieee1801,pre_tcl)                       
+# set vars(partition,load_ieee1801,post_tcl)                      
+# set vars(partition,load_ieee1801,replace_tcl)                   
+# set vars(partition,load_ieee1801,skip)                          
+# set vars(partition,commit_ieee1801,pre_tcl)                     
+# set vars(partition,commit_ieee1801,post_tcl)                    
+# set vars(partition,commit_ieee1801,replace_tcl)                 
+# set vars(partition,commit_ieee1801,skip)                        
+# set vars(partition,run_clp_init,pre_tcl)                        
+# set vars(partition,run_clp_init,post_tcl)                       
+# set vars(partition,run_clp_init,replace_tcl)                    
+# set vars(partition,run_clp_init,skip)                           
+# set vars(partition,save_init_dbs,pre_tcl)                       
+# set vars(partition,save_init_dbs,post_tcl)                      
+# set vars(partition,save_init_dbs,replace_tcl)                   
+# set vars(partition,save_init_dbs,skip)                          
+# set vars(partition,set_budgeting_mode,pre_tcl)                  
+# set vars(partition,set_budgeting_mode,post_tcl)                 
+# set vars(partition,set_budgeting_mode,replace_tcl)              
+# set vars(partition,set_budgeting_mode,skip)                     
+# set vars(partition,update_constraint_mode,pre_tcl)              
+# set vars(partition,update_constraint_mode,post_tcl)             
+# set vars(partition,update_constraint_mode,replace_tcl)          
+# set vars(partition,update_constraint_mode,skip)                 
+# set vars(partition,set_ptn_user_cns_file,pre_tcl)               
+# set vars(partition,set_ptn_user_cns_file,post_tcl)              
+# set vars(partition,set_ptn_user_cns_file,replace_tcl)           
+# set vars(partition,set_ptn_user_cns_file,skip)                  
+# set vars(partition,set_place_mode,pre_tcl)                      
+# set vars(partition,set_place_mode,post_tcl)                     
+# set vars(partition,set_place_mode,replace_tcl)                  
+# set vars(partition,set_place_mode,skip)                         
+# set vars(partition,place_design,pre_tcl)                        
+# set vars(partition,place_design,post_tcl)                       
+# set vars(partition,place_design,replace_tcl)                    
+# set vars(partition,place_design,skip)                           
+# set vars(partition,save_place_dbs,pre_tcl)                      
+# set vars(partition,save_place_dbs,post_tcl)                     
+# set vars(partition,save_place_dbs,replace_tcl)                  
+# set vars(partition,save_place_dbs,skip)                         
+# set vars(partition,trial_route,pre_tcl)                         
+# set vars(partition,trial_route,post_tcl)                        
+# set vars(partition,trial_route,replace_tcl)                     
+# set vars(partition,trial_route,skip)                            
+# set vars(partition,assign_ptn_pins,pre_tcl)                     
+# set vars(partition,assign_ptn_pins,post_tcl)                    
+# set vars(partition,assign_ptn_pins,replace_tcl)                 
+# set vars(partition,assign_ptn_pins,skip)                        
+# set vars(partition,check_pin_assignment,pre_tcl)                
+# set vars(partition,check_pin_assignment,post_tcl)               
+# set vars(partition,check_pin_assignment,replace_tcl)            
+# set vars(partition,check_pin_assignment,skip)                   
+# set vars(partition,report_unaligned_nets,pre_tcl)               
+# set vars(partition,report_unaligned_nets,post_tcl)              
+# set vars(partition,report_unaligned_nets,replace_tcl)           
+# set vars(partition,report_unaligned_nets,skip)                  
+# set vars(partition,set_ptn_pin_status,pre_tcl)                  
+# set vars(partition,set_ptn_pin_status,post_tcl)                 
+# set vars(partition,set_ptn_pin_status,replace_tcl)              
+# set vars(partition,set_ptn_pin_status,skip)                     
+# set vars(partition,derive_timing_budget,pre_tcl)                
+# set vars(partition,derive_timing_budget,post_tcl)               
+# set vars(partition,derive_timing_budget,replace_tcl)            
+# set vars(partition,derive_timing_budget,skip)                   
+# set vars(partition,save_budget_dbs,pre_tcl)                     
+# set vars(partition,save_budget_dbs,post_tcl)                    
+# set vars(partition,save_budget_dbs,replace_tcl)                 
+# set vars(partition,save_budget_dbs,skip)                        
+# set vars(partition,run_clp,pre_tcl)                             
+# set vars(partition,run_clp,post_tcl)                            
+# set vars(partition,run_clp,replace_tcl)                         
+# set vars(partition,run_clp,skip)                                
+# set vars(partition,partition,pre_tcl)                           
+# set vars(partition,partition,post_tcl)                          
+# set vars(partition,partition,replace_tcl)                       
+# set vars(partition,partition,skip)                              
+# set vars(partition,save_partition,pre_tcl)                      
+# set vars(partition,save_partition,post_tcl)                     
+# set vars(partition,save_partition,replace_tcl)                  
+# set vars(partition,save_partition,skip)                         
+# set vars(rebudget,initialize_timing,pre_tcl)                    
+# set vars(rebudget,initialize_timing,post_tcl)                   
+# set vars(rebudget,initialize_timing,replace_tcl)                
+# set vars(rebudget,initialize_timing,skip)                       
+# set vars(assemble,assemble_design,pre_tcl)                      
+# set vars(assemble,assemble_design,post_tcl)                     
+# set vars(assemble,assemble_design,replace_tcl)                  
+# set vars(assemble,assemble_design,skip)                         
+# set vars(assemble,specify_ilm,pre_tcl)                          
+# set vars(assemble,specify_ilm,post_tcl)                         
+# set vars(assemble,specify_ilm,replace_tcl)                      
+# set vars(assemble,specify_ilm,skip)                             
+# set vars(assemble,load_ilm_non_sdc_file,pre_tcl)                
+# set vars(assemble,load_ilm_non_sdc_file,post_tcl)               
+# set vars(assemble,load_ilm_non_sdc_file,replace_tcl)            
+# set vars(assemble,load_ilm_non_sdc_file,skip)                   
+# set vars(assemble,load_cpf,pre_tcl)                             
+# set vars(assemble,load_cpf,post_tcl)                            
+# set vars(assemble,load_cpf,replace_tcl)                         
+# set vars(assemble,load_cpf,skip)                                
+# set vars(assemble,commit_cpf,pre_tcl)                           
+# set vars(assemble,commit_cpf,post_tcl)                          
+# set vars(assemble,commit_cpf,replace_tcl)                       
+# set vars(assemble,commit_cpf,skip)                              
+# set vars(assemble,initialize_timing,pre_tcl)                    
+# set vars(assemble,initialize_timing,post_tcl)                   
+# set vars(assemble,initialize_timing,replace_tcl)                
+# set vars(assemble,initialize_timing,skip)                       
+# set vars(assemble,update_timing,pre_tcl)                        
+# set vars(assemble,update_timing,post_tcl)                       
+# set vars(assemble,update_timing,replace_tcl)                    
+# set vars(assemble,update_timing,skip)                           
+# set vars(assemble,pre_pac_verify_connectivity,pre_tcl)          
+# set vars(assemble,pre_pac_verify_connectivity,post_tcl)         
+# set vars(assemble,pre_pac_verify_connectivity,replace_tcl)      
+# set vars(assemble,pre_pac_verify_connectivity,skip)             
+# set vars(assemble,pre_pac_verify_geometry,pre_tcl)              
+# set vars(assemble,pre_pac_verify_geometry,post_tcl)             
+# set vars(assemble,pre_pac_verify_geometry,replace_tcl)          
+# set vars(assemble,pre_pac_verify_geometry,skip)                 
+# set vars(assemble,set_module_view,pre_tcl)                      
+# set vars(assemble,set_module_view,post_tcl)                     
+# set vars(assemble,set_module_view,replace_tcl)                  
+# set vars(assemble,set_module_view,skip)                         
+# set vars(assemble,delete_filler_cells,pre_tcl)                  
+# set vars(assemble,delete_filler_cells,post_tcl)                 
+# set vars(assemble,delete_filler_cells,replace_tcl)              
+# set vars(assemble,delete_filler_cells,skip)                     
+# set vars(assemble,opt_design,pre_tcl)                           
+# set vars(assemble,opt_design,post_tcl)                          
+# set vars(assemble,opt_design,replace_tcl)                       
+# set vars(assemble,opt_design,skip)                              
+# set vars(assemble,add_filler_cells,pre_tcl)                     
+# set vars(assemble,add_filler_cells,post_tcl)                    
+# set vars(assemble,add_filler_cells,replace_tcl)                 
+# set vars(assemble,add_filler_cells,skip)                        
+# set vars(assemble,post_pac_verify_connectivity,pre_tcl)         
+# set vars(assemble,post_pac_verify_connectivity,post_tcl)        
+# set vars(assemble,post_pac_verify_connectivity,replace_tcl)     
+# set vars(assemble,post_pac_verify_connectivity,skip)            
+# set vars(assemble,post_pac_verify_geometry,pre_tcl)             
+# set vars(assemble,post_pac_verify_geometry,post_tcl)            
+# set vars(assemble,post_pac_verify_geometry,replace_tcl)         
+# set vars(assemble,post_pac_verify_geometry,skip)                
+# set vars(flexilm,clear_active_logic_view,pre_tcl)               
+# set vars(flexilm,clear_active_logic_view,post_tcl)              
+# set vars(flexilm,clear_active_logic_view,replace_tcl)           
+# set vars(flexilm,clear_active_logic_view,skip)                  
+# set vars(flexilm,commit_module_model,pre_tcl)                   
+# set vars(flexilm,commit_module_model,post_tcl)                  
+# set vars(flexilm,commit_module_model,replace_tcl)               
+# set vars(flexilm,commit_module_model,skip)                      
+# set vars(flexilm,create_active_logic_view,pre_tcl)              
+# set vars(flexilm,create_active_logic_view,post_tcl)             
+# set vars(flexilm,create_active_logic_view,replace_tcl)          
+# set vars(flexilm,create_active_logic_view,skip)                 
+# set vars(flexilm,get_module_view,pre_tcl)                       
+# set vars(flexilm,get_module_view,post_tcl)                      
+# set vars(flexilm,get_module_view,replace_tcl)                   
+# set vars(flexilm,get_module_view,skip)                          
+# set vars(flexilm,report_resource,pre_tcl)                       
+# set vars(flexilm,report_resource,post_tcl)                      
+# set vars(flexilm,report_resource,replace_tcl)                   
+# set vars(flexilm,report_resource,skip)                          
+# set vars(flexilm,restore_design,pre_tcl)                        
+# set vars(flexilm,restore_design,post_tcl)                       
+# set vars(flexilm,restore_design,replace_tcl)                    
+# set vars(flexilm,restore_design,skip)                           
+# set vars(flexilm,save_dbs,pre_tcl)                              
+# set vars(flexilm,save_dbs,post_tcl)                             
+# set vars(flexilm,save_dbs,replace_tcl)                          
+# set vars(flexilm,save_dbs,skip)                                 
+# set vars(flexilm,set_hier_mode,pre_tcl)                         
+# set vars(flexilm,set_hier_mode,post_tcl)                        
+# set vars(flexilm,set_hier_mode,replace_tcl)                     
+# set vars(flexilm,set_hier_mode,skip)                            
+# set vars(flexilm,set_module_model,pre_tcl)                      
+# set vars(flexilm,set_module_model,post_tcl)                     
+# set vars(flexilm,set_module_model,replace_tcl)                  
+# set vars(flexilm,set_module_model,skip)                         
+# set vars(flexilm,update_partition,pre_tcl)                      
+# set vars(flexilm,update_partition,post_tcl)                     
+# set vars(flexilm,update_partition,replace_tcl)                  
+# set vars(flexilm,update_partition,skip)                         
+
diff --git a/sky130_cds/pnr/TEMPLATES/INNOVUS/innovus_config.tcl b/sky130_cds/pnr/TEMPLATES/INNOVUS/innovus_config.tcl
new file mode 100755
index 000000000..5355e26ab
--- /dev/null
+++ b/sky130_cds/pnr/TEMPLATES/INNOVUS/innovus_config.tcl
@@ -0,0 +1,388 @@
+###############################################################################
+#                       CADENCE COPYRIGHT NOTICE
+#         © 2008-2013 Cadence Design Systems, Inc. All rights reserved.
+#------------------------------------------------------------------------------
+#
+# This Foundation Flow is provided as an example of how to perform specialized
+# tasks.
+#
+# This work may not be copied, re-published, uploaded, or distributed in any way,
+# in any medium, whether in whole or in part, without prior written permission
+# from Cadence. Notwithstanding any restrictions herein, subject to compliance
+# with the terms and conditions of the Cadence software license agreement under
+# which this material was provided, this material may be copied and internally
+# distributed solely for internal purposes for use with Cadence tools.
+#
+# This work is Cadence intellectual property and may under no circumstances be
+# given to third parties, neither in original nor in modified versions, without
+# explicit written permission from Cadence. The information contained herein is
+# the proprietary and confidential information of Cadence or its licensors, and
+# is supplied subject to, and may be used only by Cadence's current customers
+# in accordance with, a previously executed license agreement between Cadence
+# and its customer.
+#
+#------------------------------------------------------------------------------
+# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL
+# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  MATERIAL, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###############################################################################
+
+##########################################################################################
+#                        INNOVUS FOUNDATION FLOW
+#-----------------------------------------------------------------------------------------
+# This is the Innovus foundation flow configuration file.  It contains all the necessary flow
+# options to drive the CDNS flat and/or hier implementation flows. For low power flow,
+# an addition low power configuration file (lp_config.tcl) is also required if power
+# domain specific information needs to be defined.
+##########################################################################################
+# Optionally define the following when applicable
+# --------------------------------------------------------------------
+#set vars(assign_buffer)                  {1 -buffer }"
+#set vars(buffer_tie_assign)              
+#set vars(dont_use_list)                  
+#set vars(delay_cells)                    
+#set vars(tie_cells)                      
+#set vars(tie_cells,max_distance)         
+#set vars(tie_cells,max_fanout)           
+#set vars(skew_buffers)                   
+#set vars(filler_cells)                   
+#set vars(clock_gate_cells)               
+#set vars(jtag_cells)                     
+#set vars(jtag_rows)                      
+#set vars(spare_cells)                    
+#set vars(enable_ocv)                     
+#set vars(enable_cppr)                    
+#set vars(place_io_pins)                   
+#set vars(clock_gate_aware)               
+#set vars(clock_gate_clone)               
+#set vars(clock_eco)                      
+#set vars(flow_effort)                    
+#set vars(congestion_effort)              
+#set vars(power_effort)                   
+#set vars(useful_skew)                    
+#set vars(preserve_assertions)            
+#set vars(all_end_points)                 
+#set vars(size_only_file)                  
+#set vars(fix_fanout_load)                
+#set vars(run_cts)                        
+#set vars(cts_engine)                      
+#set vars(cts_cell_list)                  
+#set vars(cts_buffer_cells)               
+#set vars(cts_inverter_cells)             
+#set vars(cts_use_inverters)              
+#set vars(cts_effort)                     
+#set vars(cts_io_opt)                     
+#set vars(clk_tree_top_layer)             
+#set vars(clk_leaf_top_layer)             
+#set vars(clk_tree_bottom_layer)          
+#set vars(clk_leaf_bottom_layer)          
+#set vars(clk_tree_ndr)                   
+#set vars(clk_tree_extra_space)           
+#set vars(clk_leaf_ndr)                   
+#set vars(clk_leaf_extra_space)           
+#set vars(route_clock_nets)               
+#set vars(postcts_setup_hold)             
+#set vars(fix_hold)                       
+#set vars(fix_hold_ignore_ios)            
+#set vars(fix_hold_allow_tns_degradation) 
+#set vars(multi_cut_effort)               
+#set vars(litho_driven_routing)           
+#set vars(verify_litho)                   
+#set vars(lpa_tech_file)                  
+#set vars(postroute_spread_wires)         
+#set vars(track_opt)                      
+#set vars(postroute_extraction_effort)    
+#set vars(postroute_setup_hold)           
+#set vars(signoff_extraction_effort)      
+#set vars(si_analysis_type)               
+#set vars(acceptable_wns)                 
+#set vars(report_power)                   
+#set vars(report_run_time)                
+#set vars(save_rc)                        
+#set vars(save_constraints)               
+#set vars(absolute_lib_path)              
+#set vars(relative_path)                  
+#set vars(time_design_options,setup)      "list of valid timeDesign options EXCLUDING -preCTS/postCTS/postRoute -prefix and -outDir"
+#set vars(time_design_options,hold)       "list of valid timeDesign options EXCLUDING -preCTS/postCTS/postRoute -prefix and -outDir"
+# --------------------------------------------------------------------
+#  For hierarchical flows ...
+#set vars(insert_feedthrough)              
+#set vars(placement_based_ptn)             
+#set vars(use_flexmodels)                  
+#set vars(use_proto_net_delay_model)       
+#set vars(budget_mode)                     "trial_ipo proto_net_delay_model giga_opt"
+#set vars(flexmodel_as_ptn)                
+#set vars(flexmodel_art_based)             
+
+###############################################################################
+# Below are the available plug-ins for the flat foundation flow.  Each 
+# should point to a file. If the file doesn't exist, the flow will print
+# a warning an continue.  The place_tcl and cts_tcl are unique in that 
+# they REPLACE the placeDesign and clockDesign calls, respectively.
+# --------------------------------------------------------------------
+#set vars(always_source_tcl)              
+#set vars(final_always_source_tcl)        
+#set vars(pre_init_tcl)                   
+#set vars(post_init_tcl)                  
+#set vars(pre_place_tcl)                  
+#set vars(place_tcl)                      
+#set vars(post_place_tcl)                 
+#set vars(pre_prects_tcl)                 
+#set vars(post_prects_tcl)                
+#set vars(pre_cts_tcl)                    
+#set vars(cts_tcl)                        
+#set vars(post_cts_tcl)                   
+#set vars(pre_postcts_tcl)                
+#set vars(post_postcts_tcl)               
+#set vars(pre_postcts_hold_tcl)           
+#set vars(post_postcts_hold_tcl)          
+#set vars(pre_route_tcl)                  
+#set vars(post_route_tcl)                 
+#set vars(pre_postroute_tcl)              
+#set vars(post_postroute_tcl)             
+#set vars(pre_postroute_hold_tcl)         
+#set vars(post_postroute_hold_tcl)        
+#set vars(pre_postroute_si_tcl)           
+#set vars(post_postroute_si_tcl)          
+#set vars(pre_postroute_si_hold_tcl)      
+#set vars(post_postroute_si_hold_tcl)     
+#set vars(pre_signoff_tcl)                
+#set vars(post_signoff_tcl)               
+# --------------------------------------------------------------------
+# Below are the plug-ins available for the hierarhical flow ... note
+# the additional plug-ins for the partition and assemble steps.  
+# Keep in mind 
+#    - The partitioning step will also load the pre/post init
+#      and pre/post place plug-ins.
+#    - The assemble step will also load the pre/post signoff
+#      plug-ins as well.  
+# --------------------------------------------------------------------
+#set vars(always_source_tcl)              
+#set vars(final_always_source_tcl)        
+#set vars(pre_init_tcl)                   
+#set vars(post_init_tcl)                  
+#set vars(pre_place_tcl)                  
+#set vars(place_tcl)                      
+#set vars(post_place_tcl)                 
+#set vars(pre_pin_assign_tcl)              
+#set vars(post_pin_assign_tcl)             
+#set vars(pre_partition_tcl)               
+#set vars(post_partition_tcl)              
+#set vars(pre_assemble_tcl)                
+#set vars(post_assemble_tcl)               
+#set vars(pre_signoff_tcl)                
+#set vars(post_signoff_tcl)               
+# --------------------------------------------------------------------
+# All other plug-ins are only used during the flat implementation
+# of the partitions. To enable plug-ins for partition implementation
+# define in the vars(,edi_config) file for that partition
+# --------------------------------------------------------------------
+# set vars(,edi_config_tcl)         
+# set vars(,edi_config_tcl)         
+# --------------------------------------------------------------------
+# There are additional variables called command tags that provide more
+# granular customization control.  See tags.tcl for more information
+
+#######################################################################
+# To insert metal fill during the flow define the following two
+# variables:
+# - vars(metalfill) [pre_postroute, pre_postroute_si, pre_signoff]
+# - vars(metalfill_tcl) 
+#######################################################################
+#set vars(metalfill)                  pre_postroute
+#set vars(metalfill_tcl)              
+
+#######################################################################
+# There are some flow control variables that can be set:
+# - vars(abort) controls whether codegen aborts when error is found
+#   in the variable setup.  This default to true.  When disabled,
+#   possible TCL errors can occur during flow execution
+# - vars(catch_errors) controls whether a catch is included around
+#   each set of flow step commands.  The default is true.
+# - vars(save_on_catch) controls whether a database is saved when
+#   an error is caught. This defaults to true and only works
+#   when vars(catch_errors) is true
+# - vars(mail,to) and vars(mail,steps) control whether a mail message
+#   is sent after each step completes.  When enabled a mail message
+#   will be sent (containing the timing summary if available) for 
+#   any step in vars(steps).  If vars(steps) is undefined, a message
+#   will be sent for every step.
+# 
+# --------------------------------------------------------------------
+# set vars(abort)                          "
+# set vars(catch_errors)                   "
+# set vars(save_on_catch)                  "
+# set vars(mail,to)                        [list of email addresses]
+# set vasr(mail,steps)                     [list of steps]
+# set vars(tags,verbose)                   "
+# set vars(tags,verbosity_level)           [high | low]"
+
+#######################################################################
+# Brief description of the above variables
+# --------------------------------------------------------------------
+# - dont_use_list (list of cell names to disable during optimization)
+# - delay_cells (list of delay cells to enable during hold fixing)
+# - cts_cell_list (list of cells for clockDesign)
+# - skew_buffers (list of buffers to use during useful skew)
+# - filler_cells (list of filler cells)
+# - clock_gate_cells (list of clock gating elements)
+# - jtag_cells (list of jtag instances)
+# - jtag_rows (number of rows to use during  jtag placement)
+# - spare_cells (list of spare cells instances)
+# - gds_layer_map (gds layer map file)
+# - gds_files (list of gds files)
+# - oa_ref_lib (OA reference library name)
+# - oa_abstract_view (OA abstract view name)
+# - oa_layout_view (OA layout view name)
+# - buffer_tie_assign (buffer logic 1/0 tie nets)
+# - assign_buffer (buffer assign statements)
+# --------------------------------------------------------------------
+# The flow includes some options to enable some commonly used command options.  
+# These flags provide easy access to certain options/commands within SOCE.  
+# They should be set based on the needs of the design/methodology.  
+# The inclusion of these options does not represent a recommendation. 
+# --------------------------------------------------------------------
+# For early runs, you may want to skip the cts step. To do this, use
+# 'set vars(run_cts) false'
+# --------------------------------------------------------------------
+# To select ccoptDesign for CTS, use 
+# 'set vars(cts_engine) 'ccopt' (default is cts)
+# --------------------------------------------------------------------
+# - vars(cts_engine) (ccopt_cts | ccopt)
+# Some other options that affect ccopt are:
+# - vars(cts_buffer_list)
+# - vars(cts_inverter_list)
+# - vars(cts_use_inverters)
+# - vars(cts_effort)
+# - vars(cts_io_opt)
+# --------------------------------------------------------------------
+# Options for clock routing:
+# -vars(clk_tree_top_layer)    (top layer for non-leaf nets)
+# -vars(clk_leaf_top_layer)    (top layer for leaf nets) 
+# -vars(clk_tree_bottom_layer) (bottom layer for non-leaf nets)
+# -vars(clk_leaf_bottom_layer) (bottom layer for leaf nets)
+# -vars(clk_tree_ndr)          (non-default rule for non-leaf nets)
+# -vars(clk_tree_extra_space)  (extra space for non-leaf nets)
+# -vars(clk_leaf_ndr)          (non-default rule for leaf nets0
+# -vars(clk_leaf_extra_space)  (extra space for non-leaf nets)
+# ====================================================================
+# Common path pessimism removal will be enabled by default after cts
+# To disable 'set vars(enable_cppr) false'
+# --------------------------------------------------------------------
+# Analysis mode 'onChipVariation' will be enabled by default prior
+# to post-route optimization. To disable 'set vars(enable_ocv) false'
+# To enable it elsewhere in the flow, use 'set vars(enable_ocv) '
+# Where  = "pre_place | pre_prects | pre_postcts |
+#                  pre_postroute | pre_postroute_si | pre_signoff"
+# --------------------------------------------------------------------
+# The default leakage power effort is "none". For low power flows,
+# 'set vars(leakage_power_effort) high'
+# --------------------------------------------------------------------
+# The default dynamic power effort is "none". For low power flows,
+# 'set vars(dynamic_power_effort) high'
+# --------------------------------------------------------------------
+# The default recommendation is to NOT place IO pins during
+# cell placement.  To enable pin placement,  
+# set vars(place_io_pins) true 
+# --------------------------------------------------------------------
+# The enable clock gate aware placement, 
+# 'set vars(clock_gate_aware) true'
+# --------------------------------------------------------------------
+# The enable clock gate cloning, use
+# 'set vars(clock_gate_clone) true'
+# --------------------------------------------------------------------
+# The default recommendation is to route all clock nets
+# during CTS.  To disable this 'set vars(route_clock_nets) false'
+# --------------------------------------------------------------------
+# To update IO latency after CTS, use
+# 'set vars(update_io_latency) false'
+# --------------------------------------------------------------------
+# For congested designs, 'set vars(congestion_effort) high'
+# --------------------------------------------------------------------
+# To preserve constraints on IO ports (useful for hierarchical
+# designs), 'set vars(preserve_assertions) true'
+# --------------------------------------------------------------------
+# To enable useful skew optimization, 'set vars(useful_skew) true'
+# --------------------------------------------------------------------
+# To enable TNS optimization, use
+# 'set vars(all_end_points) '
+# ... critical range is no longer support 
+# --------------------------------------------------------------------
+# To use a size only file, 
+# 'set vars(size_only_file) '
+# --------------------------------------------------------------------
+# To enable fanout load fixing,
+# 'set vars(fix_fanout_load) true'
+# --------------------------------------------------------------------
+# For difficult timing designs, 'set vars(high_timing_effort) true'
+# This overrides certain user settings to enable a variety of options
+# throughout the flow for optimal QoR at the expense of runtime
+# --------------------------------------------------------------------
+# To enable -inPlaceOpt, 'set vars(in_place_opt) true
+# --------------------------------------------------------------------
+# To enable useful skew optimization, 'set vars(useful_skew) true'
+# Also, set vars(skew_buffers) to the list of useable clock buffers
+# --------------------------------------------------------------------
+# To disable hold fixing,
+# 'set vars(fix_hold) false'
+# --------------------------------------------------------------------
+# To disable hold fixing for IO, 
+# 'set vars(fix_hold_ignore_ios) true'
+# --------------------------------------------------------------------
+# To disallow hold fixing from degrading setup tns, use
+# 'set vars(fix_hold_allow_tns_degradation) false'
+# --------------------------------------------------------------------
+# The flow default is to disable multi-cut via insertion.  For 90nm
+# and below, it is recommended to insert multi-cut vias using
+# 'set vars(multi_cut_effort) medium. This will come with a runtime and
+# memory penalty and will also affect QoR.
+# For maximum multi-cut via coverage 'set vars(multi_cut_effort) high'
+# This will come with additional runtime/memory overhead.
+# --------------------------------------------------------------------
+# The default is not to do litho driven routing,
+# To enable, use 'set vars(litho_driven_routing) true'
+# To enable litho verify and repair, use 'set vars(verify_litho) true'
+# --------------------------------------------------------------------
+# To enable postroute wire spreading, use
+# 'set vars(spread_wires) true'
+# --------------------------------------------------------------------
+# To enable diode based antenna fixing, use
+# 'set vars(antenna_diode) '
+# --------------------------------------------------------------------
+# The default postroute extraction effort, is detail extraction (low).
+# To enable tQRC (medium), or iQRC (high) for the postroute closure
+# flow, use 
+# 'set vars(postroute_extraction_effort) 
+# --------------------------------------------------------------------
+# To disable AAE (default) delay calculation
+# 'set vars(enable_si_aware) false'
+# --------------------------------------------------------------------
+# To enable third party SI correlation, use
+# 'set vars(si_analysis_type) pessimistic'
+# --------------------------------------------------------------------
+# To enable celtic based analysis/fixing, use 
+# 'set vars(enable_celtic_steps) true'
+# --------------------------------------------------------------------
+# To enable power reporting at each step in the flow, use
+# 'set vars(report_power) true'
+# To provide an activity for power optimization and reporting,
+# 'set vars(activity_file)        '
+# 'set vars(activity_file_format) '
+# --------------------------------------------------------------------
+# There are some options to saveDesign:
+# To save rcdb information for postroute steps, use
+# 'set vars(save_rc) true '
+# To save timing constraints, use:
+# 'set vars(save_constraints) true'
+# The folowing are used to control how the paths are written out:
+# - vars(relative_path)
+# - vars(absolute_lib_path)
+# --------------------------------------------------------------------
+# The default is to abort if there are errors found during the setup 
+# check; to disable this, use
+# set vars(abort) false"
diff --git a/sky130_cds/pnr/TEMPLATES/INNOVUS/innovus_tags.tcl b/sky130_cds/pnr/TEMPLATES/INNOVUS/innovus_tags.tcl
new file mode 100755
index 000000000..fa0e12312
--- /dev/null
+++ b/sky130_cds/pnr/TEMPLATES/INNOVUS/innovus_tags.tcl
@@ -0,0 +1,1183 @@
+###############################################################################
+#                       CADENCE COPYRIGHT NOTICE
+#         © 2008-2013 Cadence Design Systems, Inc. All rights reserved.
+#------------------------------------------------------------------------------
+#
+# This Foundation Flow is provided as an example of how to perform specialized
+# tasks.
+#
+# This work may not be copied, re-published, uploaded, or distributed in any way,
+# in any medium, whether in whole or in part, without prior written permission
+# from Cadence. Notwithstanding any restrictions herein, subject to compliance
+# with the terms and conditions of the Cadence software license agreement under
+# which this material was provided, this material may be copied and internally
+# distributed solely for internal purposes for use with Cadence tools.
+#
+# This work is Cadence intellectual property and may under no circumstances be
+# given to third parties, neither in original nor in modified versions, without
+# explicit written permission from Cadence. The information contained herein is
+# the proprietary and confidential information of Cadence or its licensors, and
+# is supplied subject to, and may be used only by Cadence's current customers
+# in accordance with, a previously executed license agreement between Cadence
+# and its customer.
+#
+#------------------------------------------------------------------------------
+# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL
+# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  MATERIAL, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###############################################################################
+
+##################################################################################
+# Below is a list of commands that can be tagged with the following tags:
+#
+#   - pre_tcl           => Script to be run before the tagged command
+#   - post_tcl          => Script to be run after the tagged command
+#   - replace_tcl       => Script to be run before the tagged command
+#   - skip          => Skip the tagged command
+#
+# These variables are structure ,, 
+# They should be added to your setup.tcl or innovus_config.tcl
+#
+##################################################################################
+
+# set vars(tags,verbose)                   "
+# set vars(tags,verbosity_level)           [high | low]"
+
+# set vars(init,set_distribute_host,pre_tcl)                      
+# set vars(init,set_distribute_host,post_tcl)                     
+# set vars(init,set_distribute_host,replace_tcl)                  
+# set vars(init,set_distribute_host,skip)                         
+# set vars(init,set_multi_cpu_usage,pre_tcl)                      
+# set vars(init,set_multi_cpu_usage,post_tcl)                     
+# set vars(init,set_multi_cpu_usage,replace_tcl)                  
+# set vars(init,set_multi_cpu_usage,skip)                         
+# set vars(init,set_distribute_host,pre_tcl)                      
+# set vars(init,set_distribute_host,post_tcl)                     
+# set vars(init,set_distribute_host,replace_tcl)                  
+# set vars(init,set_distribute_host,skip)                         
+# set vars(init,set_multi_cpu_usage,pre_tcl)                      
+# set vars(init,set_multi_cpu_usage,post_tcl)                     
+# set vars(init,set_multi_cpu_usage,replace_tcl)                  
+# set vars(init,set_multi_cpu_usage,skip)                         
+# set vars(init,set_rc_factor,pre_tcl)                            
+# set vars(init,set_rc_factor,post_tcl)                           
+# set vars(init,set_rc_factor,replace_tcl)                        
+# set vars(init,set_rc_factor,skip)                               
+# set vars(init,derate_timing,pre_tcl)                            
+# set vars(init,derate_timing,post_tcl)                           
+# set vars(init,derate_timing,replace_tcl)                        
+# set vars(init,derate_timing,skip)                               
+# set vars(init,create_rc_corner,pre_tcl)                         
+# set vars(init,create_rc_corner,post_tcl)                        
+# set vars(init,create_rc_corner,replace_tcl)                     
+# set vars(init,create_rc_corner,skip)                            
+# set vars(init,create_library_set,pre_tcl)                       
+# set vars(init,create_library_set,post_tcl)                      
+# set vars(init,create_library_set,replace_tcl)                   
+# set vars(init,create_library_set,skip)                          
+# set vars(init,create_op_cond,pre_tcl)                           
+# set vars(init,create_op_cond,post_tcl)                          
+# set vars(init,create_op_cond,replace_tcl)                       
+# set vars(init,create_op_cond,skip)                              
+# set vars(init,create_delay_corner,pre_tcl)                      
+# set vars(init,create_delay_corner,post_tcl)                     
+# set vars(init,create_delay_corner,replace_tcl)                  
+# set vars(init,create_delay_corner,skip)                         
+# set vars(init,create_constraint_mode,pre_tcl)                   
+# set vars(init,create_constraint_mode,post_tcl)                  
+# set vars(init,create_constraint_mode,replace_tcl)               
+# set vars(init,create_constraint_mode,skip)                      
+# set vars(init,create_analysis_view,pre_tcl)                     
+# set vars(init,create_analysis_view,post_tcl)                    
+# set vars(init,create_analysis_view,replace_tcl)                 
+# set vars(init,create_analysis_view,skip)                        
+# set vars(init,update_delay_corner,pre_tcl)                      
+# set vars(init,update_delay_corner,post_tcl)                     
+# set vars(init,update_delay_corner,replace_tcl)                  
+# set vars(init,update_delay_corner,skip)                         
+# set vars(init,update_library_set,pre_tcl)                       
+# set vars(init,update_library_set,post_tcl)                      
+# set vars(init,update_library_set,replace_tcl)                   
+# set vars(init,update_library_set,skip)                          
+# set vars(init,derate_timing,pre_tcl)                            
+# set vars(init,derate_timing,post_tcl)                           
+# set vars(init,derate_timing,replace_tcl)                        
+# set vars(init,derate_timing,skip)                               
+# set vars(init,set_default_view,pre_tcl)                         
+# set vars(init,set_default_view,post_tcl)                        
+# set vars(init,set_default_view,replace_tcl)                     
+# set vars(init,set_default_view,skip)                            
+# set vars(init,set_power_analysis_mode,pre_tcl)                  
+# set vars(init,set_power_analysis_mode,post_tcl)                 
+# set vars(init,set_power_analysis_mode,replace_tcl)              
+# set vars(init,set_power_analysis_mode,skip)                     
+# set vars(init,load_config,pre_tcl)                              
+# set vars(init,load_config,post_tcl)                             
+# set vars(init,load_config,replace_tcl)                          
+# set vars(init,load_config,skip)                                 
+# set vars(init,init_design,pre_tcl)                              
+# set vars(init,init_design,post_tcl)                             
+# set vars(init,init_design,replace_tcl)                          
+# set vars(init,init_design,skip)                                 
+# set vars(init,load_floorplan,pre_tcl)                           
+# set vars(init,load_floorplan,post_tcl)                          
+# set vars(init,load_floorplan,replace_tcl)                       
+# set vars(init,load_floorplan,skip)                              
+# set vars(init,generate_tracks,pre_tcl)                          
+# set vars(init,generate_tracks,post_tcl)                         
+# set vars(init,generate_tracks,replace_tcl)                      
+# set vars(init,generate_tracks,skip)                             
+# set vars(init,read_power_intent,pre_tcl)                                 
+# set vars(init,read_power_intent,post_tcl)                                
+# set vars(init,read_power_intent,replace_tcl)                             
+# set vars(init,read_power_intent,skip)                                    
+# set vars(init,commit_power_intent,pre_tcl)                               
+# set vars(init,commit_power_intent,post_tcl)                              
+# set vars(init,commit_power_intent,replace_tcl)                           
+# set vars(init,commit_power_intent,skip)                                  
+# set vars(init,read_activity_file,pre_tcl)                       
+# set vars(init,read_activity_file,post_tcl)                      
+# set vars(init,read_activity_file,replace_tcl)                   
+# set vars(init,read_activity_file,skip)                          
+# set vars(init,specify_ilm,pre_tcl)                              
+# set vars(init,specify_ilm,post_tcl)                             
+# set vars(init,specify_ilm,replace_tcl)                          
+# set vars(init,specify_ilm,skip)                                 
+# set vars(init,load_ilm_non_sdc_file,pre_tcl)                    
+# set vars(init,load_ilm_non_sdc_file,post_tcl)                   
+# set vars(init,load_ilm_non_sdc_file,replace_tcl)                
+# set vars(init,load_ilm_non_sdc_file,skip)                       
+# set vars(init,initialize_timing,pre_tcl)                        
+# set vars(init,initialize_timing,post_tcl)                       
+# set vars(init,initialize_timing,replace_tcl)                    
+# set vars(init,initialize_timing,skip)                           
+# set vars(init,load_scan,pre_tcl)                                
+# set vars(init,load_scan,post_tcl)                               
+# set vars(init,load_scan,replace_tcl)                            
+# set vars(init,load_scan,skip)                                   
+# set vars(init,specify_spare_gates,pre_tcl)                      
+# set vars(init,specify_spare_gates,post_tcl)                     
+# set vars(init,specify_spare_gates,replace_tcl)                  
+# set vars(init,specify_spare_gates,skip)                         
+# set vars(init,set_dont_use,pre_tcl)                             
+# set vars(init,set_dont_use,post_tcl)                            
+# set vars(init,set_dont_use,replace_tcl)                         
+# set vars(init,set_dont_use,skip)                                
+# set vars(init,set_max_route_layer,pre_tcl)                      
+# set vars(init,set_max_route_layer,post_tcl)                     
+# set vars(init,set_max_route_layer,replace_tcl)                  
+# set vars(init,set_max_route_layer,skip)                         
+# set vars(init,set_design_mode,pre_tcl)                          
+# set vars(init,set_design_mode,post_tcl)                         
+# set vars(init,set_design_mode,replace_tcl)                      
+# set vars(init,set_design_mode,skip)                             
+# set vars(init,insert_welltaps_endcaps,pre_tcl)                  
+# set vars(init,insert_welltaps_endcaps,post_tcl)                 
+# set vars(init,insert_welltaps_endcaps,replace_tcl)              
+# set vars(init,insert_welltaps_endcaps,skip)                     
+# set vars(init,load_config,pre_tcl)                              
+# set vars(init,load_config,post_tcl)                             
+# set vars(init,load_config,replace_tcl)                          
+# set vars(init,load_config,skip)                                 
+# set vars(init,time_design,pre_tcl)                              
+# set vars(init,time_design,post_tcl)                             
+# set vars(init,time_design,replace_tcl)                          
+# set vars(init,time_design,skip)                                 
+# set vars(init,check_design,pre_tcl)                             
+# set vars(init,check_design,post_tcl)                            
+# set vars(init,check_design,replace_tcl)                         
+# set vars(init,check_design,skip)                                
+# set vars(init,check_timing,pre_tcl)                             
+# set vars(init,check_timing,post_tcl)                            
+# set vars(init,check_timing,replace_tcl)                         
+# set vars(init,check_timing,skip)                                
+# set vars(init,report_power_domains,pre_tcl)                     
+# set vars(init,report_power_domains,post_tcl)                    
+# set vars(init,report_power_domains,replace_tcl)                 
+# set vars(init,report_power_domains,skip)                        
+# set vars(place,set_distribute_host,pre_tcl)                     
+# set vars(place,set_distribute_host,post_tcl)                    
+# set vars(place,set_distribute_host,replace_tcl)                 
+# set vars(place,set_distribute_host,skip)                        
+# set vars(place,set_multi_cpu_usage,pre_tcl)                     
+# set vars(place,set_multi_cpu_usage,post_tcl)                    
+# set vars(place,set_multi_cpu_usage,replace_tcl)                 
+# set vars(place,set_multi_cpu_usage,skip)                        
+# set vars(place,restore_design,pre_tcl)                          
+# set vars(place,restore_design,post_tcl)                         
+# set vars(place,restore_design,replace_tcl)                      
+# set vars(place,restore_design,skip)                             
+# set vars(place,initialize_step,pre_tcl)                         
+# set vars(place,initialize_step,post_tcl)                        
+# set vars(place,initialize_step,replace_tcl)                     
+# set vars(place,initialize_step,skip)                            
+# set vars(place,set_design_mode,pre_tcl)                         
+# set vars(place,set_design_mode,post_tcl)                        
+# set vars(place,set_design_mode,replace_tcl)                     
+# set vars(place,set_design_mode,skip)                            
+# set vars(place,set_delay_cal_mode,pre_tcl)                      
+# set vars(place,set_delay_cal_mode,post_tcl)                     
+# set vars(place,set_delay_cal_mode,replace_tcl)                  
+# set vars(place,set_delay_cal_mode,skip)                         
+# set vars(place,set_place_mode,pre_tcl)                          
+# set vars(place,set_place_mode,post_tcl)                         
+# set vars(place,set_place_mode,replace_tcl)                      
+# set vars(place,set_place_mode,skip)                             
+# set vars(place,set_opt_mode,pre_tcl)                            
+# set vars(place,set_opt_mode,post_tcl)                           
+# set vars(place,set_opt_mode,replace_tcl)                        
+# set vars(place,set_opt_mode,skip)                               
+# set vars(place,set_tie_hilo_mode,pre_tcl)                       
+# set vars(place,set_tie_hilo_mode,post_tcl)                      
+# set vars(place,set_tie_hilo_mode,replace_tcl)                   
+# set vars(place,set_tie_hilo_mode,skip)                          
+# set vars(place,cleanup_specify_clock_tree,pre_tcl)              
+# set vars(place,cleanup_specify_clock_tree,post_tcl)             
+# set vars(place,cleanup_specify_clock_tree,replace_tcl)          
+# set vars(place,cleanup_specify_clock_tree,skip)                 
+# set vars(place,specify_clock_tree,pre_tcl)                      
+# set vars(place,specify_clock_tree,post_tcl)                     
+# set vars(place,specify_clock_tree,replace_tcl)                  
+# set vars(place,specify_clock_tree,skip)                         
+# set vars(place,specify_jtag,pre_tcl)                            
+# set vars(place,specify_jtag,post_tcl)                           
+# set vars(place,specify_jtag,replace_tcl)                        
+# set vars(place,specify_jtag,skip)                               
+# set vars(place,place_jtag,pre_tcl)                              
+# set vars(place,place_jtag,post_tcl)                             
+# set vars(place,place_jtag,replace_tcl)                          
+# set vars(place,place_jtag,skip)                                 
+# set vars(place,eco_place,pre_tcl)                               
+# set vars(place,eco_place,post_tcl)                              
+# set vars(place,eco_place,replace_tcl)                           
+# set vars(place,eco_place,skip)                                  
+# set vars(place,place_design,pre_tcl)                            
+# set vars(place,place_design,post_tcl)                           
+# set vars(place,place_design,replace_tcl)                        
+# set vars(place,place_design,skip)                               
+# set vars(place,add_tie_cells,pre_tcl)                           
+# set vars(place,add_tie_cells,post_tcl)                          
+# set vars(place,add_tie_cells,replace_tcl)                       
+# set vars(place,add_tie_cells,skip)                              
+# set vars(place,set_tie_hi_lo_mode,pre_tcl)                       
+# set vars(place,set_tie_hi_lo_mode,post_tcl)                      
+# set vars(place,set_tie_hi_lo_mode,replace_tcl)                   
+# set vars(place,set_tie_hi_lo_mode,skip)                          
+# set vars(place,time_design,pre_tcl)                             
+# set vars(place,time_design,post_tcl)                            
+# set vars(place,time_design,replace_tcl)                         
+# set vars(place,time_design,skip)                                
+# set vars(place,save_design,pre_tcl)                             
+# set vars(place,save_design,post_tcl)                            
+# set vars(place,save_design,replace_tcl)                         
+# set vars(place,save_design,skip)                                
+# set vars(place,report_power,pre_tcl)                            
+# set vars(place,report_power,post_tcl)                           
+# set vars(place,report_power,replace_tcl)                        
+# set vars(place,report_power,skip)                               
+# set vars(place,verify_power_domain,pre_tcl)                     
+# set vars(place,verify_power_domain,post_tcl)                    
+# set vars(place,verify_power_domain,replace_tcl)                 
+# set vars(place,verify_power_domain,skip)                        
+# set vars(place,run_clp,pre_tcl)                                 
+# set vars(place,run_clp,post_tcl)                                
+# set vars(place,run_clp,replace_tcl)                             
+# set vars(place,run_clp,skip)                                    
+# set vars(prects,set_distribute_host,pre_tcl)                    
+# set vars(prects,set_distribute_host,post_tcl)                   
+# set vars(prects,set_distribute_host,replace_tcl)                
+# set vars(prects,set_distribute_host,skip)                       
+# set vars(prects,set_multi_cpu_usage,pre_tcl)                    
+# set vars(prects,set_multi_cpu_usage,post_tcl)                   
+# set vars(prects,set_multi_cpu_usage,replace_tcl)                
+# set vars(prects,set_multi_cpu_usage,skip)                       
+# set vars(prects,initialize_step,pre_tcl)                        
+# set vars(prects,initialize_step,post_tcl)                       
+# set vars(prects,initialize_step,replace_tcl)                    
+# set vars(prects,initialize_step,skip)                           
+# set vars(prects,set_design_mode,pre_tcl)                        
+# set vars(prects,set_design_mode,post_tcl)                       
+# set vars(prects,set_design_mode,replace_tcl)                    
+# set vars(prects,set_design_mode,skip)                           
+# set vars(prects,set_analysis_mode,pre_tcl)                      
+# set vars(prects,set_analysis_mode,post_tcl)                     
+# set vars(prects,set_analysis_mode,replace_tcl)                  
+# set vars(prects,set_analysis_mode,skip)                         
+# set vars(prects,set_ilm_type,pre_tcl)                           
+# set vars(prects,set_ilm_type,post_tcl)                          
+# set vars(prects,set_ilm_type,replace_tcl)                       
+# set vars(prects,set_ilm_type,skip)                              
+# set vars(prects,cleanup_specify_clock_tree,pre_tcl)             
+# set vars(prects,cleanup_specify_clock_tree,post_tcl)            
+# set vars(prects,cleanup_specify_clock_tree,replace_tcl)         
+# set vars(prects,cleanup_specify_clock_tree,skip)                
+# set vars(prects,create_clock_tree_spec,pre_tcl)                 
+# set vars(prects,create_clock_tree_spec,post_tcl)                
+# set vars(prects,create_clock_tree_spec,replace_tcl)             
+# set vars(prects,create_clock_tree_spec,skip)                    
+# set vars(prects,specify_clock_tree,pre_tcl)                     
+# set vars(prects,specify_clock_tree,post_tcl)                    
+# set vars(prects,specify_clock_tree,replace_tcl)                 
+# set vars(prects,specify_clock_tree,skip)                        
+# set vars(prects,set_useful_skew_mode,pre_tcl)                   
+# set vars(prects,set_useful_skew_mode,post_tcl)                  
+# set vars(prects,set_useful_skew_mode,replace_tcl)               
+# set vars(prects,set_useful_skew_mode,skip)                      
+# set vars(prects,set_opt_mode,pre_tcl)                           
+# set vars(prects,set_opt_mode,post_tcl)                          
+# set vars(prects,set_opt_mode,replace_tcl)                       
+# set vars(prects,set_opt_mode,skip)                              
+# set vars(prects,set_design_mode,pre_tcl)                        
+# set vars(prects,set_design_mode,post_tcl)                       
+# set vars(prects,set_design_mode,replace_tcl)                    
+# set vars(prects,set_design_mode,skip)                           
+# set vars(prects,set_delay_cal_mode,pre_tcl)                     
+# set vars(prects,set_delay_cal_mode,post_tcl)                    
+# set vars(prects,set_delay_cal_mode,replace_tcl)                 
+# set vars(prects,set_delay_cal_mode,skip)                        
+# set vars(prects,set_dont_use,pre_tcl)                           
+# set vars(prects,set_dont_use,post_tcl)                          
+# set vars(prects,set_dont_use,replace_tcl)                       
+# set vars(prects,set_dont_use,skip)                              
+# set vars(prects,opt_design,pre_tcl)                             
+# set vars(prects,opt_design,post_tcl)                            
+# set vars(prects,opt_design,replace_tcl)                         
+# set vars(prects,opt_design,skip)                                
+# set vars(prects,ck_clone_gate,pre_tcl)                          
+# set vars(prects,ck_clone_gate,post_tcl)                         
+# set vars(prects,ck_clone_gate,replace_tcl)                      
+# set vars(prects,ck_clone_gate,skip)                             
+# set vars(prects,save_design,pre_tcl)                            
+# set vars(prects,save_design,post_tcl)                           
+# set vars(prects,save_design,replace_tcl)                        
+# set vars(prects,save_design,skip)                               
+# set vars(prects,report_power,pre_tcl)                           
+# set vars(prects,report_power,post_tcl)                          
+# set vars(prects,report_power,replace_tcl)                       
+# set vars(prects,report_power,skip)                              
+# set vars(prects,verify_power_domain,pre_tcl)                    
+# set vars(prects,verify_power_domain,post_tcl)                   
+# set vars(prects,verify_power_domain,replace_tcl)                
+# set vars(prects,verify_power_domain,skip)                       
+# set vars(prects,run_clp,pre_tcl)                                
+# set vars(prects,run_clp,post_tcl)                               
+# set vars(prects,run_clp,replace_tcl)                            
+# set vars(prects,run_clp,skip)                                   
+# set vars(cts,set_distribute_host,pre_tcl)                       
+# set vars(cts,set_distribute_host,post_tcl)                      
+# set vars(cts,set_distribute_host,replace_tcl)                   
+# set vars(cts,set_distribute_host,skip)                          
+# set vars(cts,set_multi_cpu_usage,pre_tcl)                       
+# set vars(cts,set_multi_cpu_usage,post_tcl)                      
+# set vars(cts,set_multi_cpu_usage,replace_tcl)                   
+# set vars(cts,set_multi_cpu_usage,skip)                          
+# set vars(cts,initialize_step,pre_tcl)                           
+# set vars(cts,initialize_step,post_tcl)                          
+# set vars(cts,initialize_step,replace_tcl)                       
+# set vars(cts,initialize_step,skip)                              
+# set vars(cts,set_design_mode,pre_tcl)                           
+# set vars(cts,set_design_mode,post_tcl)                          
+# set vars(cts,set_design_mode,replace_tcl)                       
+# set vars(cts,set_design_mode,skip)                              
+# set vars(cts,set_cts_mode,pre_tcl)                              
+# set vars(cts,set_cts_mode,post_tcl)                             
+# set vars(cts,set_cts_mode,replace_tcl)                          
+# set vars(cts,set_cts_mode,skip)                                 
+# set vars(cts,update_ccopt_rc_corner,pre_tcl)                    
+# set vars(cts,update_ccopt_rc_corner,post_tcl)                   
+# set vars(cts,update_ccopt_rc_corner,replace_tcl)                
+# set vars(cts,update_ccopt_rc_corner,skip)                       
+# set vars(cts,set_ccopt_mode,pre_tcl)                            
+# set vars(cts,set_ccopt_mode,post_tcl)                           
+# set vars(cts,set_ccopt_mode,replace_tcl)                        
+# set vars(cts,set_ccopt_mode,skip)                               
+# set vars(cts,set_nanoroute_mode,pre_tcl)                        
+# set vars(cts,set_nanoroute_mode,post_tcl)                       
+# set vars(cts,set_nanoroute_mode,replace_tcl)                    
+# set vars(cts,set_nanoroute_mode,skip)                           
+# set vars(cts,enable_clock_gate_cells,pre_tcl)                   
+# set vars(cts,enable_clock_gate_cells,post_tcl)                  
+# set vars(cts,enable_clock_gate_cells,replace_tcl)               
+# set vars(cts,enable_clock_gate_cells,skip)                      
+# set vars(cts,create_clock_tree_spec,pre_tcl)                    
+# set vars(cts,create_clock_tree_spec,post_tcl)                   
+# set vars(cts,create_clock_tree_spec,replace_tcl)                
+# set vars(cts,create_clock_tree_spec,skip)                       
+# set vars(cts,clock_design,pre_tcl)                              
+# set vars(cts,clock_design,post_tcl)                             
+# set vars(cts,clock_design,replace_tcl)                          
+# set vars(cts,clock_design,skip)                                 
+# set vars(cts,disable_clock_gate_cells,pre_tcl)                  
+# set vars(cts,disable_clock_gate_cells,post_tcl)                 
+# set vars(cts,disable_clock_gate_cells,replace_tcl)              
+# set vars(cts,disable_clock_gate_cells,skip)                     
+# set vars(cts,run_clock_eco,pre_tcl)                             
+# set vars(cts,run_clock_eco,post_tcl)                            
+# set vars(cts,run_clock_eco,replace_tcl)                         
+# set vars(cts,run_clock_eco,skip)                                
+# set vars(cts,update_timing,pre_tcl)                             
+# set vars(cts,update_timing,post_tcl)                            
+# set vars(cts,update_timing,replace_tcl)                         
+# set vars(cts,update_timing,skip)                                
+# set vars(cts,create_ccopt_clock_tree_spec,pre_tcl)              
+# set vars(cts,create_ccopt_clock_tree_spec,post_tcl)             
+# set vars(cts,create_ccopt_clock_tree_spec,replace_tcl)          
+# set vars(cts,create_ccopt_clock_tree_spec,skip)                 
+# set vars(cts,ccopt_design,pre_tcl)                              
+# set vars(cts,ccopt_design,post_tcl)                             
+# set vars(cts,ccopt_design,replace_tcl)                          
+# set vars(cts,ccopt_design,skip)                                 
+# set vars(cts,time_design,pre_tcl)                               
+# set vars(cts,time_design,post_tcl)                              
+# set vars(cts,time_design,replace_tcl)                           
+# set vars(cts,time_design,skip)                                  
+# set vars(cts,save_design,pre_tcl)                               
+# set vars(cts,save_design,post_tcl)                              
+# set vars(cts,save_design,replace_tcl)                           
+# set vars(cts,save_design,skip)                                  
+# set vars(cts,report_power,pre_tcl)                              
+# set vars(cts,report_power,post_tcl)                             
+# set vars(cts,report_power,replace_tcl)                          
+# set vars(cts,report_power,skip)                                 
+# set vars(cts,verify_power_domain,pre_tcl)                       
+# set vars(cts,verify_power_domain,post_tcl)                      
+# set vars(cts,verify_power_domain,replace_tcl)                   
+# set vars(cts,verify_power_domain,skip)                          
+# set vars(cts,run_clp,pre_tcl)                                   
+# set vars(cts,run_clp,post_tcl)                                  
+# set vars(cts,run_clp,replace_tcl)                               
+# set vars(cts,run_clp,skip)                                      
+# set vars(postcts,set_distribute_host,pre_tcl)                   
+# set vars(postcts,set_distribute_host,post_tcl)                  
+# set vars(postcts,set_distribute_host,replace_tcl)               
+# set vars(postcts,set_distribute_host,skip)                      
+# set vars(postcts,set_multi_cpu_usage,pre_tcl)                   
+# set vars(postcts,set_multi_cpu_usage,post_tcl)                  
+# set vars(postcts,set_multi_cpu_usage,replace_tcl)               
+# set vars(postcts,set_multi_cpu_usage,skip)                      
+# set vars(postcts,initialize_step,pre_tcl)                       
+# set vars(postcts,initialize_step,post_tcl)                      
+# set vars(postcts,initialize_step,replace_tcl)                   
+# set vars(postcts,initialize_step,skip)                          
+# set vars(postcts,set_design_mode,pre_tcl)                       
+# set vars(postcts,set_design_mode,post_tcl)                      
+# set vars(postcts,set_design_mode,replace_tcl)                   
+# set vars(postcts,set_design_mode,skip)                          
+# set vars(postcts,set_delay_cal_mode,pre_tcl)                    
+# set vars(postcts,set_delay_cal_mode,post_tcl)                   
+# set vars(postcts,set_delay_cal_mode,replace_tcl)                
+# set vars(postcts,set_delay_cal_mode,skip)                       
+# set vars(postcts,set_analysis_mode,pre_tcl)                     
+# set vars(postcts,set_analysis_mode,post_tcl)                    
+# set vars(postcts,set_analysis_mode,replace_tcl)                 
+# set vars(postcts,set_analysis_mode,skip)                        
+# set vars(postcts,set_opt_mode,pre_tcl)                          
+# set vars(postcts,set_opt_mode,post_tcl)                         
+# set vars(postcts,set_opt_mode,replace_tcl)                      
+# set vars(postcts,set_opt_mode,skip)                             
+# set vars(postcts,opt_design,pre_tcl)                            
+# set vars(postcts,opt_design,post_tcl)                           
+# set vars(postcts,opt_design,replace_tcl)                        
+# set vars(postcts,opt_design,skip)                               
+# set vars(postcts,save_design,pre_tcl)                           
+# set vars(postcts,save_design,post_tcl)                          
+# set vars(postcts,save_design,replace_tcl)                       
+# set vars(postcts,save_design,skip)                              
+# set vars(postcts,report_power,pre_tcl)                          
+# set vars(postcts,report_power,post_tcl)                         
+# set vars(postcts,report_power,replace_tcl)                      
+# set vars(postcts,report_power,skip)                             
+# set vars(postcts,verify_power_domain,pre_tcl)                   
+# set vars(postcts,verify_power_domain,post_tcl)                  
+# set vars(postcts,verify_power_domain,replace_tcl)               
+# set vars(postcts,verify_power_domain,skip)                      
+# set vars(postcts,run_clp,pre_tcl)                               
+# set vars(postcts,run_clp,post_tcl)                              
+# set vars(postcts,run_clp,replace_tcl)                           
+# set vars(postcts,run_clp,skip)                                  
+# set vars(postcts_hold,set_distribute_host,pre_tcl)              
+# set vars(postcts_hold,set_distribute_host,post_tcl)             
+# set vars(postcts_hold,set_distribute_host,replace_tcl)          
+# set vars(postcts_hold,set_distribute_host,skip)                 
+# set vars(postcts_hold,set_multi_cpu_usage,pre_tcl)              
+# set vars(postcts_hold,set_multi_cpu_usage,post_tcl)             
+# set vars(postcts_hold,set_multi_cpu_usage,replace_tcl)          
+# set vars(postcts_hold,set_multi_cpu_usage,skip)                 
+# set vars(postcts_hold,initialize_step,pre_tcl)                  
+# set vars(postcts_hold,initialize_step,post_tcl)                 
+# set vars(postcts_hold,initialize_step,replace_tcl)              
+# set vars(postcts_hold,initialize_step,skip)                     
+# set vars(postcts_hold,set_dont_use,pre_tcl)                     
+# set vars(postcts_hold,set_dont_use,post_tcl)                    
+# set vars(postcts_hold,set_dont_use,replace_tcl)                 
+# set vars(postcts_hold,set_dont_use,skip)                        
+# set vars(postcts_hold,set_opt_mode,pre_tcl)                     
+# set vars(postcts_hold,set_opt_mode,post_tcl)                    
+# set vars(postcts_hold,set_opt_mode,replace_tcl)                 
+# set vars(postcts_hold,set_opt_mode,skip)                        
+# set vars(postcts_hold,opt_design,pre_tcl)                       
+# set vars(postcts_hold,opt_design,post_tcl)                      
+# set vars(postcts_hold,opt_design,replace_tcl)                   
+# set vars(postcts_hold,opt_design,skip)                          
+# set vars(postcts_hold,save_design,pre_tcl)                      
+# set vars(postcts_hold,save_design,post_tcl)                     
+# set vars(postcts_hold,save_design,replace_tcl)                  
+# set vars(postcts_hold,save_design,skip)                         
+# set vars(postcts_hold,report_power,pre_tcl)                     
+# set vars(postcts_hold,report_power,post_tcl)                    
+# set vars(postcts_hold,report_power,replace_tcl)                 
+# set vars(postcts_hold,report_power,skip)                        
+# set vars(postcts_hold,verify_power_domain,pre_tcl)              
+# set vars(postcts_hold,verify_power_domain,post_tcl)             
+# set vars(postcts_hold,verify_power_domain,replace_tcl)          
+# set vars(postcts_hold,verify_power_domain,skip)                 
+# set vars(postcts_hold,run_clp,pre_tcl)                          
+# set vars(postcts_hold,run_clp,post_tcl)                         
+# set vars(postcts_hold,run_clp,replace_tcl)                      
+# set vars(postcts_hold,run_clp,skip)                             
+# set vars(route,set_distribute_host,pre_tcl)                     
+# set vars(route,set_distribute_host,post_tcl)                    
+# set vars(route,set_distribute_host,replace_tcl)                 
+# set vars(route,set_distribute_host,skip)                        
+# set vars(route,set_multi_cpu_usage,pre_tcl)                     
+# set vars(route,set_multi_cpu_usage,post_tcl)                    
+# set vars(route,set_multi_cpu_usage,replace_tcl)                 
+# set vars(route,set_multi_cpu_usage,skip)                        
+# set vars(route,initialize_step,pre_tcl)                         
+# set vars(route,initialize_step,post_tcl)                        
+# set vars(route,initialize_step,replace_tcl)                     
+# set vars(route,initialize_step,skip)                            
+# set vars(route,set_nanoroute_mode,pre_tcl)                      
+# set vars(route,set_nanoroute_mode,post_tcl)                     
+# set vars(route,set_nanoroute_mode,replace_tcl)                  
+# set vars(route,set_nanoroute_mode,skip)                         
+# set vars(route,add_filler_cells,pre_tcl)                        
+# set vars(route,add_filler_cells,post_tcl)                       
+# set vars(route,add_filler_cells,replace_tcl)                    
+# set vars(route,add_filler_cells,skip)                           
+# set vars(route,route_secondary_pg_nets,pre_tcl)                 
+# set vars(route,route_secondary_pg_nets,post_tcl)                
+# set vars(route,route_secondary_pg_nets,replace_tcl)             
+# set vars(route,route_secondary_pg_nets,skip)                    
+# set vars(route,check_place,pre_tcl)                             
+# set vars(route,check_place,post_tcl)                            
+# set vars(route,check_place,replace_tcl)                         
+# set vars(route,check_place,skip)                                
+# set vars(route_design,set_analysis_mode,pre_tcl)                
+# set vars(route_design,set_analysis_mode,post_tcl)               
+# set vars(route_design,set_analysis_mode,replace_tcl)            
+# set vars(route_design,set_analysis_mode,skip)                   
+# set vars(route,route_design,pre_tcl)                            
+# set vars(route,route_design,post_tcl)                           
+# set vars(route,route_design,replace_tcl)                        
+# set vars(route,route_design,skip)                               
+# set vars(route,run_clock_eco,pre_tcl)                           
+# set vars(route,run_clock_eco,post_tcl)                          
+# set vars(route,run_clock_eco,replace_tcl)                       
+# set vars(route,run_clock_eco,skip)                              
+# set vars(route,spread_wires,pre_tcl)                            
+# set vars(route,spread_wires,post_tcl)                           
+# set vars(route,spread_wires,replace_tcl)                        
+# set vars(route,spread_wires,skip)                               
+# set vars(route,set_extract_rc_mode,pre_tcl)                     
+# set vars(route,set_extract_rc_mode,post_tcl)                    
+# set vars(route,set_extract_rc_mode,replace_tcl)                 
+# set vars(route,set_extract_rc_mode,skip)                        
+# set vars(route,initialize_timing,pre_tcl)                       
+# set vars(route,initialize_timing,post_tcl)                      
+# set vars(route,initialize_timing,replace_tcl)                   
+# set vars(route,initialize_timing,skip)                          
+# set vars(route,time_design,pre_tcl)                             
+# set vars(route,time_design,post_tcl)                            
+# set vars(route,time_design,replace_tcl)                         
+# set vars(route,time_design,skip)                                
+# set vars(route,save_design,pre_tcl)                             
+# set vars(route,save_design,post_tcl)                            
+# set vars(route,save_design,replace_tcl)                         
+# set vars(route,save_design,skip)                                
+# set vars(route,report_power,pre_tcl)                            
+# set vars(route,report_power,post_tcl)                           
+# set vars(route,report_power,replace_tcl)                        
+# set vars(route,report_power,skip)                               
+# set vars(route,verify_power_domain,pre_tcl)                     
+# set vars(route,verify_power_domain,post_tcl)                    
+# set vars(route,verify_power_domain,replace_tcl)                 
+# set vars(route,verify_power_domain,skip)                        
+# set vars(route,run_clp,pre_tcl)                                 
+# set vars(route,run_clp,post_tcl)                                
+# set vars(route,run_clp,replace_tcl)                             
+# set vars(route,run_clp,skip)                                    
+# set vars(postroute,set_distribute_host,pre_tcl)                 
+# set vars(postroute,set_distribute_host,post_tcl)                
+# set vars(postroute,set_distribute_host,replace_tcl)             
+# set vars(postroute,set_distribute_host,skip)                    
+# set vars(postroute,set_multi_cpu_usage,pre_tcl)                 
+# set vars(postroute,set_multi_cpu_usage,post_tcl)                
+# set vars(postroute,set_multi_cpu_usage,replace_tcl)             
+# set vars(postroute,set_multi_cpu_usage,skip)                    
+# set vars(postroute,initialize_step,pre_tcl)                     
+# set vars(postroute,initialize_step,post_tcl)                    
+# set vars(postroute,initialize_step,replace_tcl)                 
+# set vars(postroute,initialize_step,skip)                        
+# set vars(postroute,set_design_mode,pre_tcl)                     
+# set vars(postroute,set_design_mode,post_tcl)                    
+# set vars(postroute,set_design_mode,replace_tcl)                 
+# set vars(postroute,set_design_mode,skip)                        
+# set vars(postroute,set_extract_rc_mode,pre_tcl)                 
+# set vars(postroute,set_extract_rc_mode,post_tcl)                
+# set vars(postroute,set_extract_rc_mode,replace_tcl)             
+# set vars(postroute,set_extract_rc_mode,skip)                    
+# set vars(postroute,set_analysis_mode,pre_tcl)                   
+# set vars(postroute,set_analysis_mode,post_tcl)                  
+# set vars(postroute,set_analysis_mode,replace_tcl)               
+# set vars(postroute,set_analysis_mode,skip)                      
+# set vars(postroute,set_delay_cal_mode,pre_tcl)                  
+# set vars(postroute,set_delay_cal_mode,post_tcl)                 
+# set vars(postroute,set_delay_cal_mode,replace_tcl)              
+# set vars(postroute,set_delay_cal_mode,skip)                     
+# set vars(postroute,add_metalfill,pre_tcl)                       
+# set vars(postroute,add_metalfill,post_tcl)                      
+# set vars(postroute,add_metalfill,replace_tcl)                   
+# set vars(postroute,add_metalfill,skip)                          
+# set vars(postroute,delete_filler_cells,pre_tcl)                 
+# set vars(postroute,delete_filler_cells,post_tcl)                
+# set vars(postroute,delete_filler_cells,replace_tcl)             
+# set vars(postroute,delete_filler_cells,skip)                    
+# set vars(postroute,opt_design,pre_tcl)                          
+# set vars(postroute,opt_design,post_tcl)                         
+# set vars(postroute,opt_design,replace_tcl)                      
+# set vars(postroute,opt_design,skip)                             
+# set vars(postroute,add_filler_cells,pre_tcl)                    
+# set vars(postroute,add_filler_cells,post_tcl)                   
+# set vars(postroute,add_filler_cells,replace_tcl)                
+# set vars(postroute,add_filler_cells,skip)                       
+# set vars(postroute,trim_metalfill,pre_tcl)                      
+# set vars(postroute,trim_metalfill,post_tcl)                     
+# set vars(postroute,trim_metalfill,replace_tcl)                  
+# set vars(postroute,trim_metalfill,skip)                         
+# set vars(route,verify_litho,pre_tcl)                            
+# set vars(route,verify_litho,post_tcl)                           
+# set vars(route,verify_litho,replace_tcl)                        
+# set vars(route,verify_litho,skip)                               
+# set vars(postroute,save_design,pre_tcl)                         
+# set vars(postroute,save_design,post_tcl)                        
+# set vars(postroute,save_design,replace_tcl)                     
+# set vars(postroute,save_design,skip)                            
+# set vars(postroute,report_power,pre_tcl)                        
+# set vars(postroute,report_power,post_tcl)                       
+# set vars(postroute,report_power,replace_tcl)                    
+# set vars(postroute,report_power,skip)                           
+# set vars(postroute,verify_power_domain,pre_tcl)                 
+# set vars(postroute,verify_power_domain,post_tcl)                
+# set vars(postroute,verify_power_domain,replace_tcl)             
+# set vars(postroute,verify_power_domain,skip)                    
+# set vars(postroute,run_clp,pre_tcl)                             
+# set vars(postroute,run_clp,post_tcl)                            
+# set vars(postroute,run_clp,replace_tcl)                         
+# set vars(postroute,run_clp,skip)                                
+# set vars(postroute_hold,set_distribute_host,pre_tcl)            
+# set vars(postroute_hold,set_distribute_host,post_tcl)           
+# set vars(postroute_hold,set_distribute_host,replace_tcl)        
+# set vars(postroute_hold,set_distribute_host,skip)               
+# set vars(postroute_hold,set_multi_cpu_usage,pre_tcl)            
+# set vars(postroute_hold,set_multi_cpu_usage,post_tcl)           
+# set vars(postroute_hold,set_multi_cpu_usage,replace_tcl)        
+# set vars(postroute_hold,set_multi_cpu_usage,skip)               
+# set vars(postroute_hold,initialize_step,pre_tcl)                
+# set vars(postroute_hold,initialize_step,post_tcl)               
+# set vars(postroute_hold,initialize_step,replace_tcl)            
+# set vars(postroute_hold,initialize_step,skip)                   
+# set vars(postroute_hold,set_design_mode,pre_tcl)                
+# set vars(postroute_hold,set_design_mode,post_tcl)               
+# set vars(postroute_hold,set_design_mode,replace_tcl)            
+# set vars(postroute_hold,set_design_mode,skip)                   
+# set vars(postroute_hold,set_extract_rc_mode,pre_tcl)            
+# set vars(postroute_hold,set_extract_rc_mode,post_tcl)           
+# set vars(postroute_hold,set_extract_rc_mode,replace_tcl)        
+# set vars(postroute_hold,set_extract_rc_mode,skip)               
+# set vars(postroute_hold,set_dont_use_mode,pre_tcl)              
+# set vars(postroute_hold,set_dont_use_mode,post_tcl)             
+# set vars(postroute_hold,set_dont_use_mode,replace_tcl)          
+# set vars(postroute_hold,set_dont_use_mode,skip)                 
+# set vars(postroute_hold,set_opt_mode,pre_tcl)                   
+# set vars(postroute_hold,set_opt_mode,post_tcl)                  
+# set vars(postroute_hold,set_opt_mode,replace_tcl)               
+# set vars(postroute_hold,set_opt_mode,skip)                      
+# set vars(postroute_hold,delete_filler_cells,pre_tcl)            
+# set vars(postroute_hold,delete_filler_cells,post_tcl)           
+# set vars(postroute_hold,delete_filler_cells,replace_tcl)        
+# set vars(postroute_hold,delete_filler_cells,skip)               
+# set vars(postroute_hold,opt_design,pre_tcl)                     
+# set vars(postroute_hold,opt_design,post_tcl)                    
+# set vars(postroute_hold,opt_design,replace_tcl)                 
+# set vars(postroute_hold,opt_design,skip)                        
+# set vars(postroute_hold,add_filler_cells,pre_tcl)               
+# set vars(postroute_hold,add_filler_cells,post_tcl)              
+# set vars(postroute_hold,add_filler_cells,replace_tcl)           
+# set vars(postroute_hold,add_filler_cells,skip)                  
+# set vars(postroute_hold,trim_metalfill,pre_tcl)                 
+# set vars(postroute_hold,trim_metalfill,post_tcl)                
+# set vars(postroute_hold,trim_metalfill,replace_tcl)             
+# set vars(postroute_hold,trim_metalfill,skip)                    
+# set vars(postroute_hold,save_design,pre_tcl)                    
+# set vars(postroute_hold,save_design,post_tcl)                   
+# set vars(postroute_hold,save_design,replace_tcl)                
+# set vars(postroute_hold,save_design,skip)                       
+# set vars(postroute_hold,report_power,pre_tcl)                   
+# set vars(postroute_hold,report_power,post_tcl)                  
+# set vars(postroute_hold,report_power,replace_tcl)               
+# set vars(postroute_hold,report_power,skip)                      
+# set vars(postroute_hold,verify_power_domain,pre_tcl)            
+# set vars(postroute_hold,verify_power_domain,post_tcl)           
+# set vars(postroute_hold,verify_power_domain,replace_tcl)        
+# set vars(postroute_hold,verify_power_domain,skip)               
+# set vars(postroute_hold,run_clp,pre_tcl)                        
+# set vars(postroute_hold,run_clp,post_tcl)                       
+# set vars(postroute_hold,run_clp,replace_tcl)                    
+# set vars(postroute_hold,run_clp,skip)                           
+# set vars(postroute_si_hold,set_distribute_host,pre_tcl)         
+# set vars(postroute_si_hold,set_distribute_host,post_tcl)        
+# set vars(postroute_si_hold,set_distribute_host,replace_tcl)     
+# set vars(postroute_si_hold,set_distribute_host,skip)            
+# set vars(postroute_si_hold,set_multi_cpu_usage,pre_tcl)         
+# set vars(postroute_si_hold,set_multi_cpu_usage,post_tcl)        
+# set vars(postroute_si_hold,set_multi_cpu_usage,replace_tcl)     
+# set vars(postroute_si_hold,set_multi_cpu_usage,skip)            
+# set vars(postroute_si_hold,initialize_step,pre_tcl)             
+# set vars(postroute_si_hold,initialize_step,post_tcl)            
+# set vars(postroute_si_hold,initialize_step,replace_tcl)         
+# set vars(postroute_si_hold,initialize_step,skip)                
+# set vars(postroute_si_hold,set_design_mode,pre_tcl)             
+# set vars(postroute_si_hold,set_design_mode,post_tcl)            
+# set vars(postroute_si_hold,set_design_mode,replace_tcl)         
+# set vars(postroute_si_hold,set_design_mode,skip)                
+# set vars(postroute_si_hold,set_dont_use,pre_tcl)                
+# set vars(postroute_si_hold,set_dont_use,post_tcl)               
+# set vars(postroute_si_hold,set_dont_use,replace_tcl)            
+# set vars(postroute_si_hold,set_dont_use,skip)                   
+# set vars(postroute_si_hold,set_opt_mode,pre_tcl)                
+# set vars(postroute_si_hold,set_opt_mode,post_tcl)               
+# set vars(postroute_si_hold,set_opt_mode,replace_tcl)            
+# set vars(postroute_si_hold,set_opt_mode,skip)                   
+# set vars(postroute_si_hold,set_extract_rc_mode,pre_tcl)         
+# set vars(postroute_si_hold,set_extract_rc_mode,post_tcl)        
+# set vars(postroute_si_hold,set_extract_rc_mode,replace_tcl)     
+# set vars(postroute_si_hold,set_extract_rc_mode,skip)            
+# set vars(postroute_si_hold,set_si_mode,pre_tcl)                 
+# set vars(postroute_si_hold,set_si_mode,post_tcl)                
+# set vars(postroute_si_hold,set_si_mode,replace_tcl)             
+# set vars(postroute_si_hold,set_si_mode,skip)                    
+# set vars(postroute_si_hold,set_delay_cal_mode,pre_tcl)          
+# set vars(postroute_si_hold,set_delay_cal_mode,post_tcl)         
+# set vars(postroute_si_hold,set_delay_cal_mode,replace_tcl)      
+# set vars(postroute_si_hold,set_delay_cal_mode,skip)             
+# set vars(postroute_si_hold,set_analysis_mode,pre_tcl)           
+# set vars(postroute_si_hold,set_analysis_mode,post_tcl)          
+# set vars(postroute_si_hold,set_analysis_mode,replace_tcl)       
+# set vars(postroute_si_hold,set_analysis_mode,skip)              
+# set vars(postroute_si_hold,add_metalfill,pre_tcl)               
+# set vars(postroute_si_hold,add_metalfill,post_tcl)              
+# set vars(postroute_si_hold,add_metalfill,replace_tcl)           
+# set vars(postroute_si_hold,add_metalfill,skip)                  
+# set vars(postroute_si_hold,delete_filler_cells,pre_tcl)         
+# set vars(postroute_si_hold,delete_filler_cells,post_tcl)        
+# set vars(postroute_si_hold,delete_filler_cells,replace_tcl)     
+# set vars(postroute_si_hold,delete_filler_cells,skip)            
+# set vars(postroute_si_hold,opt_design,pre_tcl)                  
+# set vars(postroute_si_hold,opt_design,post_tcl)                 
+# set vars(postroute_si_hold,opt_design,replace_tcl)              
+# set vars(postroute_si_hold,opt_design,skip)                     
+# set vars(postroute_si_hold,add_filler_cells,pre_tcl)            
+# set vars(postroute_si_hold,add_filler_cells,post_tcl)           
+# set vars(postroute_si_hold,add_filler_cells,replace_tcl)        
+# set vars(postroute_si_hold,add_filler_cells,skip)               
+# set vars(postroute_si_hold,trim_metalfill,pre_tcl)              
+# set vars(postroute_si_hold,trim_metalfill,post_tcl)             
+# set vars(postroute_si_hold,trim_metalfill,replace_tcl)          
+# set vars(postroute_si_hold,trim_metalfill,skip)                 
+# set vars(postroute_si_hold,save_design,pre_tcl)                 
+# set vars(postroute_si_hold,save_design,post_tcl)                
+# set vars(postroute_si_hold,save_design,replace_tcl)             
+# set vars(postroute_si_hold,save_design,skip)                    
+# set vars(postroute_si_hold,report_power,pre_tcl)                
+# set vars(postroute_si_hold,report_power,post_tcl)               
+# set vars(postroute_si_hold,report_power,replace_tcl)            
+# set vars(postroute_si_hold,report_power,skip)                   
+# set vars(postroute_si_hold,verify_power_domain,pre_tcl)         
+# set vars(postroute_si_hold,verify_power_domain,post_tcl)        
+# set vars(postroute_si_hold,verify_power_domain,replace_tcl)     
+# set vars(postroute_si_hold,verify_power_domain,skip)            
+# set vars(postroute_si_hold,run_clp,pre_tcl)                     
+# set vars(postroute_si_hold,run_clp,post_tcl)                    
+# set vars(postroute_si_hold,run_clp,replace_tcl)                 
+# set vars(postroute_si_hold,run_clp,skip)                        
+# set vars(postroute_si,set_distribute_host,pre_tcl)              
+# set vars(postroute_si,set_distribute_host,post_tcl)             
+# set vars(postroute_si,set_distribute_host,replace_tcl)          
+# set vars(postroute_si,set_distribute_host,skip)                 
+# set vars(postroute_si,set_multi_cpu_usage,pre_tcl)              
+# set vars(postroute_si,set_multi_cpu_usage,post_tcl)             
+# set vars(postroute_si,set_multi_cpu_usage,replace_tcl)          
+# set vars(postroute_si,set_multi_cpu_usage,skip)                 
+# set vars(postroute_si,initialize_step,pre_tcl)                  
+# set vars(postroute_si,initialize_step,post_tcl)                 
+# set vars(postroute_si,initialize_step,replace_tcl)              
+# set vars(postroute_si,initialize_step,skip)                     
+# set vars(postroute_si,set_design_mode,pre_tcl)                  
+# set vars(postroute_si,set_design_mode,post_tcl)                 
+# set vars(postroute_si,set_design_mode,replace_tcl)              
+# set vars(postroute_si,set_design_mode,skip)                     
+# set vars(postroute_si,set_extract_rc_mode,pre_tcl)              
+# set vars(postroute_si,set_extract_rc_mode,post_tcl)             
+# set vars(postroute_si,set_extract_rc_mode,replace_tcl)          
+# set vars(postroute_si,set_extract_rc_mode,skip)                 
+# set vars(postroute_si,set_si_mode,pre_tcl)                      
+# set vars(postroute_si,set_si_mode,post_tcl)                     
+# set vars(postroute_si,set_si_mode,replace_tcl)                  
+# set vars(postroute_si,set_si_mode,skip)                         
+# set vars(postroute_si,set_analysis_mode,pre_tcl)                
+# set vars(postroute_si,set_analysis_mode,post_tcl)               
+# set vars(postroute_si,set_analysis_mode,replace_tcl)            
+# set vars(postroute_si,set_analysis_mode,skip)                   
+# set vars(postroute_si,set_delay_cal_mode,pre_tcl)               
+# set vars(postroute_si,set_delay_cal_mode,post_tcl)              
+# set vars(postroute_si,set_delay_cal_mode,replace_tcl)           
+# set vars(postroute_si,set_delay_cal_mode,skip)                  
+# set vars(postroute_si,add_metalfill,pre_tcl)                    
+# set vars(postroute_si,add_metalfill,post_tcl)                   
+# set vars(postroute_si,add_metalfill,replace_tcl)                
+# set vars(postroute_si,add_metalfill,skip)                       
+# set vars(postroute_si,delete_filler_cells,pre_tcl)              
+# set vars(postroute_si,delete_filler_cells,post_tcl)             
+# set vars(postroute_si,delete_filler_cells,replace_tcl)          
+# set vars(postroute_si,delete_filler_cells,skip)                 
+# set vars(postroute_si,opt_design,pre_tcl)                       
+# set vars(postroute_si,opt_design,post_tcl)                      
+# set vars(postroute_si,opt_design,replace_tcl)                   
+# set vars(postroute_si,opt_design,skip)                          
+# set vars(postroute_si,add_filler_cells,pre_tcl)                 
+# set vars(postroute_si,add_filler_cells,post_tcl)                
+# set vars(postroute_si,add_filler_cells,replace_tcl)             
+# set vars(postroute_si,add_filler_cells,skip)                    
+# set vars(postroute_si,trim_metalfill,pre_tcl)                   
+# set vars(postroute_si,trim_metalfill,post_tcl)                  
+# set vars(postroute_si,trim_metalfill,replace_tcl)               
+# set vars(postroute_si,trim_metalfill,skip)                      
+# set vars(postroute_si,save_design,pre_tcl)                      
+# set vars(postroute_si,save_design,post_tcl)                     
+# set vars(postroute_si,save_design,replace_tcl)                  
+# set vars(postroute_si,save_design,skip)                         
+# set vars(postroute_si,report_power,pre_tcl)                     
+# set vars(postroute_si,report_power,post_tcl)                    
+# set vars(postroute_si,report_power,replace_tcl)                 
+# set vars(postroute_si,report_power,skip)                        
+# set vars(postroute_si,verify_power_domain,pre_tcl)              
+# set vars(postroute_si,verify_power_domain,post_tcl)             
+# set vars(postroute_si,verify_power_domain,replace_tcl)          
+# set vars(postroute_si,verify_power_domain,skip)                 
+# set vars(postroute_si,run_clp,pre_tcl)                          
+# set vars(postroute_si,run_clp,post_tcl)                         
+# set vars(postroute_si,run_clp,replace_tcl)                      
+# set vars(postroute_si,run_clp,skip)                             
+# set vars(signoff,fix_litho,pre_tcl)                             
+# set vars(signoff,fix_litho,post_tcl)                            
+# set vars(signoff,fix_litho,replace_tcl)                         
+# set vars(signoff,fix_litho,skip)                                
+# set vars(signoff,add_metalfill,pre_tcl)                         
+# set vars(signoff,add_metalfill,post_tcl)                        
+# set vars(signoff,add_metalfill,replace_tcl)                     
+# set vars(signoff,add_metalfill,skip)                            
+# set vars(signoff,set_distribute_host,pre_tcl)                   
+# set vars(signoff,set_distribute_host,post_tcl)                  
+# set vars(signoff,set_distribute_host,replace_tcl)               
+# set vars(signoff,set_distribute_host,skip)                      
+# set vars(signoff,set_multi_cpu_usage,pre_tcl)                   
+# set vars(signoff,set_multi_cpu_usage,post_tcl)                  
+# set vars(signoff,set_multi_cpu_usage,replace_tcl)               
+# set vars(signoff,set_multi_cpu_usage,skip)                      
+# set vars(signoff,set_design_mode,pre_tcl)                       
+# set vars(signoff,set_design_mode,post_tcl)                      
+# set vars(signoff,set_design_mode,replace_tcl)                   
+# set vars(signoff,set_design_mode,skip)                          
+# set vars(signoff,initialize_timing,pre_tcl)                     
+# set vars(signoff,initialize_timing,post_tcl)                    
+# set vars(signoff,initialize_timing,replace_tcl)                 
+# set vars(signoff,initialize_timing,skip)                        
+# set vars(signoff,initialize_step,pre_tcl)                       
+# set vars(signoff,initialize_step,post_tcl)                      
+# set vars(signoff,initialize_step,replace_tcl)                   
+# set vars(signoff,initialize_step,skip)                          
+# set vars(signoff,set_analysis_mode,pre_tcl)                     
+# set vars(signoff,set_analysis_mode,post_tcl)                    
+# set vars(signoff,set_analysis_mode,replace_tcl)                 
+# set vars(signoff,set_analysis_mode,skip)                        
+# set vars(signoff,set_delay_cal_mode,pre_tcl)                    
+# set vars(signoff,set_delay_cal_mode,post_tcl)                   
+# set vars(signoff,set_delay_cal_mode,replace_tcl)                
+# set vars(signoff,set_delay_cal_mode,skip)                       
+# set vars(signoff,set_extract_rc_mode,pre_tcl)                   
+# set vars(signoff,set_extract_rc_mode,post_tcl)                  
+# set vars(signoff,set_extract_rc_mode,replace_tcl)               
+# set vars(signoff,set_extract_rc_mode,skip)                      
+# set vars(signoff,extract_rc,pre_tcl)                            
+# set vars(signoff,extract_rc,post_tcl)                           
+# set vars(signoff,extract_rc,replace_tcl)                        
+# set vars(signoff,extract_rc,skip)                               
+# set vars(signoff,dump_spef,pre_tcl)                             
+# set vars(signoff,dump_spef,post_tcl)                            
+# set vars(signoff,dump_spef,replace_tcl)                         
+# set vars(signoff,dump_spef,skip)                                
+# set vars(signoff,time_design_setup,pre_tcl)                     
+# set vars(signoff,time_design_setup,post_tcl)                    
+# set vars(signoff,time_design_setup,replace_tcl)                 
+# set vars(signoff,time_design_setup,skip)                        
+# set vars(signoff,time_design_hold,pre_tcl)                      
+# set vars(signoff,time_design_hold,post_tcl)                     
+# set vars(signoff,time_design_hold,replace_tcl)                  
+# set vars(signoff,time_design_hold,skip)                         
+# set vars(signoff,stream_out,pre_tcl)                            
+# set vars(signoff,stream_out,post_tcl)                           
+# set vars(signoff,stream_out,replace_tcl)                        
+# set vars(signoff,stream_out,skip)                               
+# set vars(signoff,oasis_out,pre_tcl)                             
+# set vars(signoff,oasis_out,post_tcl)                            
+# set vars(signoff,oasis_out,replace_tcl)                         
+# set vars(signoff,oasis_out,skip)                                
+# set vars(signoff,save_oa_design,pre_tcl)                        
+# set vars(signoff,save_oa_design,post_tcl)                       
+# set vars(signoff,save_oa_design,replace_tcl)                    
+# set vars(signoff,save_oa_design,skip)                           
+# set vars(signoff,create_ilm,pre_tcl)                            
+# set vars(signoff,create_ilm,post_tcl)                           
+# set vars(signoff,create_ilm,replace_tcl)                        
+# set vars(signoff,create_ilm,skip)                               
+# set vars(signoff,summary_report,pre_tcl)                        
+# set vars(signoff,summary_report,post_tcl)                       
+# set vars(signoff,summary_report,replace_tcl)                    
+# set vars(signoff,summary_report,skip)                           
+# set vars(signoff,verify_connectivity,pre_tcl)                   
+# set vars(signoff,verify_connectivity,post_tcl)                  
+# set vars(signoff,verify_connectivity,replace_tcl)               
+# set vars(signoff,verify_connectivity,skip)                      
+# set vars(signoff,verify_geometry,pre_tcl)                       
+# set vars(signoff,verify_geometry,post_tcl)                      
+# set vars(signoff,verify_geometry,replace_tcl)                   
+# set vars(signoff,verify_geometry,skip)                          
+# set vars(signoff,verify_metal_density,pre_tcl)                  
+# set vars(signoff,verify_metal_density,post_tcl)                 
+# set vars(signoff,verify_metal_density,replace_tcl)              
+# set vars(signoff,verify_metal_density,skip)                     
+# set vars(signoff,verify_process_antenna,pre_tcl)                
+# set vars(signoff,verify_process_antenna,post_tcl)               
+# set vars(signoff,verify_process_antenna,replace_tcl)            
+# set vars(signoff,verify_process_antenna,skip)                   
+# set vars(signoff,save_design,pre_tcl)                           
+# set vars(signoff,save_design,post_tcl)                          
+# set vars(signoff,save_design,replace_tcl)                       
+# set vars(signoff,save_design,skip)                              
+# set vars(signoff,report_power,pre_tcl)                          
+# set vars(signoff,report_power,post_tcl)                         
+# set vars(signoff,report_power,replace_tcl)                      
+# set vars(signoff,report_power,skip)                             
+# set vars(signoff,verify_power_domain,pre_tcl)                   
+# set vars(signoff,verify_power_domain,post_tcl)                  
+# set vars(signoff,verify_power_domain,replace_tcl)               
+# set vars(signoff,verify_power_domain,skip)                      
+# set vars(signoff,run_clp,pre_tcl)                               
+# set vars(signoff,run_clp,post_tcl)                              
+# set vars(signoff,run_clp,replace_tcl)                           
+# set vars(signoff,run_clp,skip)                                  
+# set vars(partition,initialize_timing,pre_tcl)                   
+# set vars(partition,initialize_timing,post_tcl)                  
+# set vars(partition,initialize_timing,replace_tcl)               
+# set vars(partition,initialize_timing,skip)                      
+# set vars(partition,read_power_intent,pre_tcl)                            
+# set vars(partition,read_power_intent,post_tcl)                           
+# set vars(partition,read_power_intent,replace_tcl)                        
+# set vars(partition,read_power_intent,skip)                               
+# set vars(partition,commit_power_intent,pre_tcl)                          
+# set vars(partition,commit_power_intent,post_tcl)                         
+# set vars(partition,commit_power_intent,replace_tcl)                      
+# set vars(partition,commit_power_intent,skip)                             
+# set vars(partition,run_clp_init,pre_tcl)                        
+# set vars(partition,run_clp_init,post_tcl)                       
+# set vars(partition,run_clp_init,replace_tcl)                    
+# set vars(partition,run_clp_init,skip)                           
+# set vars(partition,save_init_dbs,pre_tcl)                       
+# set vars(partition,save_init_dbs,post_tcl)                      
+# set vars(partition,save_init_dbs,replace_tcl)                   
+# set vars(partition,save_init_dbs,skip)                          
+# set vars(partition,set_budgeting_mode,pre_tcl)                  
+# set vars(partition,set_budgeting_mode,post_tcl)                 
+# set vars(partition,set_budgeting_mode,replace_tcl)              
+# set vars(partition,set_budgeting_mode,skip)                     
+# set vars(partition,update_constraint_mode,pre_tcl)              
+# set vars(partition,update_constraint_mode,post_tcl)             
+# set vars(partition,update_constraint_mode,replace_tcl)          
+# set vars(partition,update_constraint_mode,skip)                 
+# set vars(partition,set_ptn_user_cns_file,pre_tcl)               
+# set vars(partition,set_ptn_user_cns_file,post_tcl)              
+# set vars(partition,set_ptn_user_cns_file,replace_tcl)           
+# set vars(partition,set_ptn_user_cns_file,skip)                  
+# set vars(partition,set_place_mode,pre_tcl)                      
+# set vars(partition,set_place_mode,post_tcl)                     
+# set vars(partition,set_place_mode,replace_tcl)                  
+# set vars(partition,set_place_mode,skip)                         
+# set vars(partition,place_design,pre_tcl)                        
+# set vars(partition,place_design,post_tcl)                       
+# set vars(partition,place_design,replace_tcl)                    
+# set vars(partition,place_design,skip)                           
+# set vars(partition,save_place_dbs,pre_tcl)                      
+# set vars(partition,save_place_dbs,post_tcl)                     
+# set vars(partition,save_place_dbs,replace_tcl)                  
+# set vars(partition,save_place_dbs,skip)                         
+# set vars(partition,trial_route,pre_tcl)                         
+# set vars(partition,trial_route,post_tcl)                        
+# set vars(partition,trial_route,replace_tcl)                     
+# set vars(partition,trial_route,skip)                            
+# set vars(partition,assign_ptn_pins,pre_tcl)                     
+# set vars(partition,assign_ptn_pins,post_tcl)                    
+# set vars(partition,assign_ptn_pins,replace_tcl)                 
+# set vars(partition,assign_ptn_pins,skip)                        
+# set vars(partition,check_pin_assignment,pre_tcl)                
+# set vars(partition,check_pin_assignment,post_tcl)               
+# set vars(partition,check_pin_assignment,replace_tcl)            
+# set vars(partition,check_pin_assignment,skip)                   
+# set vars(partition,report_unaligned_nets,pre_tcl)               
+# set vars(partition,report_unaligned_nets,post_tcl)              
+# set vars(partition,report_unaligned_nets,replace_tcl)           
+# set vars(partition,report_unaligned_nets,skip)                  
+# set vars(partition,set_ptn_pin_status,pre_tcl)                  
+# set vars(partition,set_ptn_pin_status,post_tcl)                 
+# set vars(partition,set_ptn_pin_status,replace_tcl)              
+# set vars(partition,set_ptn_pin_status,skip)                     
+# set vars(partition,derive_timing_budget,pre_tcl)                
+# set vars(partition,derive_timing_budget,post_tcl)               
+# set vars(partition,derive_timing_budget,replace_tcl)            
+# set vars(partition,derive_timing_budget,skip)                   
+# set vars(partition,save_budget_dbs,pre_tcl)                     
+# set vars(partition,save_budget_dbs,post_tcl)                    
+# set vars(partition,save_budget_dbs,replace_tcl)                 
+# set vars(partition,save_budget_dbs,skip)                        
+# set vars(partition,run_clp,pre_tcl)                             
+# set vars(partition,run_clp,post_tcl)                            
+# set vars(partition,run_clp,replace_tcl)                         
+# set vars(partition,run_clp,skip)                                
+# set vars(partition,partition,pre_tcl)                           
+# set vars(partition,partition,post_tcl)                          
+# set vars(partition,partition,replace_tcl)                       
+# set vars(partition,partition,skip)                              
+# set vars(partition,save_partition,pre_tcl)                      
+# set vars(partition,save_partition,post_tcl)                     
+# set vars(partition,save_partition,replace_tcl)                  
+# set vars(partition,save_partition,skip)                         
+# set vars(rebudget,initialize_timing,pre_tcl)                    
+# set vars(rebudget,initialize_timing,post_tcl)                   
+# set vars(rebudget,initialize_timing,replace_tcl)                
+# set vars(rebudget,initialize_timing,skip)                       
+# set vars(assemble,assemble_design,pre_tcl)                      
+# set vars(assemble,assemble_design,post_tcl)                     
+# set vars(assemble,assemble_design,replace_tcl)                  
+# set vars(assemble,assemble_design,skip)                         
+# set vars(assemble,specify_ilm,pre_tcl)                          
+# set vars(assemble,specify_ilm,post_tcl)                         
+# set vars(assemble,specify_ilm,replace_tcl)                      
+# set vars(assemble,specify_ilm,skip)                             
+# set vars(assemble,load_ilm_non_sdc_file,pre_tcl)                
+# set vars(assemble,load_ilm_non_sdc_file,post_tcl)               
+# set vars(assemble,load_ilm_non_sdc_file,replace_tcl)            
+# set vars(assemble,load_ilm_non_sdc_file,skip)                   
+# set vars(assemble,read_power_intent,pre_tcl)                             
+# set vars(assemble,read_power_intent,post_tcl)                            
+# set vars(assemble,read_power_intent,replace_tcl)                         
+# set vars(assemble,read_power_intent,skip)                                
+# set vars(assemble,commit_power_intent,pre_tcl)                           
+# set vars(assemble,commit_power_intent,post_tcl)                          
+# set vars(assemble,commit_power_intent,replace_tcl)                       
+# set vars(assemble,commit_power_intent,skip)                              
+# set vars(assemble,initialize_timing,pre_tcl)                    
+# set vars(assemble,initialize_timing,post_tcl)                   
+# set vars(assemble,initialize_timing,replace_tcl)                
+# set vars(assemble,initialize_timing,skip)                       
+# set vars(assemble,update_timing,pre_tcl)                        
+# set vars(assemble,update_timing,post_tcl)                       
+# set vars(assemble,update_timing,replace_tcl)                    
+# set vars(assemble,update_timing,skip)                           
+# set vars(assemble,pre_pac_verify_connectivity,pre_tcl)          
+# set vars(assemble,pre_pac_verify_connectivity,post_tcl)         
+# set vars(assemble,pre_pac_verify_connectivity,replace_tcl)      
+# set vars(assemble,pre_pac_verify_connectivity,skip)             
+# set vars(assemble,pre_pac_verify_geometry,pre_tcl)              
+# set vars(assemble,pre_pac_verify_geometry,post_tcl)             
+# set vars(assemble,pre_pac_verify_geometry,replace_tcl)          
+# set vars(assemble,pre_pac_verify_geometry,skip)                 
+# set vars(assemble,set_module_view,pre_tcl)                      
+# set vars(assemble,set_module_view,post_tcl)                     
+# set vars(assemble,set_module_view,replace_tcl)                  
+# set vars(assemble,set_module_view,skip)                         
+# set vars(assemble,delete_filler_cells,pre_tcl)                  
+# set vars(assemble,delete_filler_cells,post_tcl)                 
+# set vars(assemble,delete_filler_cells,replace_tcl)              
+# set vars(assemble,delete_filler_cells,skip)                     
+# set vars(assemble,opt_design,pre_tcl)                           
+# set vars(assemble,opt_design,post_tcl)                          
+# set vars(assemble,opt_design,replace_tcl)                       
+# set vars(assemble,opt_design,skip)                              
+# set vars(assemble,add_filler_cells,pre_tcl)                     
+# set vars(assemble,add_filler_cells,post_tcl)                    
+# set vars(assemble,add_filler_cells,replace_tcl)                 
+# set vars(assemble,add_filler_cells,skip)                        
+# set vars(assemble,post_pac_verify_connectivity,pre_tcl)         
+# set vars(assemble,post_pac_verify_connectivity,post_tcl)        
+# set vars(assemble,post_pac_verify_connectivity,replace_tcl)     
+# set vars(assemble,post_pac_verify_connectivity,skip)            
+# set vars(assemble,post_pac_verify_geometry,pre_tcl)             
+# set vars(assemble,post_pac_verify_geometry,post_tcl)            
+# set vars(assemble,post_pac_verify_geometry,replace_tcl)         
+# set vars(assemble,post_pac_verify_geometry,skip)                
+# set vars(flexilm,clear_active_logic_view,pre_tcl)               
+# set vars(flexilm,clear_active_logic_view,post_tcl)              
+# set vars(flexilm,clear_active_logic_view,replace_tcl)           
+# set vars(flexilm,clear_active_logic_view,skip)                  
+# set vars(flexilm,commit_module_model,pre_tcl)                   
+# set vars(flexilm,commit_module_model,post_tcl)                  
+# set vars(flexilm,commit_module_model,replace_tcl)               
+# set vars(flexilm,commit_module_model,skip)                      
+# set vars(flexilm,create_active_logic_view,pre_tcl)              
+# set vars(flexilm,create_active_logic_view,post_tcl)             
+# set vars(flexilm,create_active_logic_view,replace_tcl)          
+# set vars(flexilm,create_active_logic_view,skip)                 
+# set vars(flexilm,get_module_view,pre_tcl)                       
+# set vars(flexilm,get_module_view,post_tcl)                      
+# set vars(flexilm,get_module_view,replace_tcl)                   
+# set vars(flexilm,get_module_view,skip)                          
+# set vars(flexilm,report_resource,pre_tcl)                       
+# set vars(flexilm,report_resource,post_tcl)                      
+# set vars(flexilm,report_resource,replace_tcl)                   
+# set vars(flexilm,report_resource,skip)                          
+# set vars(flexilm,restore_design,pre_tcl)                        
+# set vars(flexilm,restore_design,post_tcl)                       
+# set vars(flexilm,restore_design,replace_tcl)                    
+# set vars(flexilm,restore_design,skip)                           
+# set vars(flexilm,save_dbs,pre_tcl)                              
+# set vars(flexilm,save_dbs,post_tcl)                             
+# set vars(flexilm,save_dbs,replace_tcl)                          
+# set vars(flexilm,save_dbs,skip)                                 
+# set vars(flexilm,set_hier_mode,pre_tcl)                         
+# set vars(flexilm,set_hier_mode,post_tcl)                        
+# set vars(flexilm,set_hier_mode,replace_tcl)                     
+# set vars(flexilm,set_hier_mode,skip)                            
+# set vars(flexilm,set_module_model,pre_tcl)                      
+# set vars(flexilm,set_module_model,post_tcl)                     
+# set vars(flexilm,set_module_model,replace_tcl)                  
+# set vars(flexilm,set_module_model,skip)                         
+# set vars(flexilm,update_partition,pre_tcl)                      
+# set vars(flexilm,update_partition,post_tcl)                     
+# set vars(flexilm,update_partition,replace_tcl)                  
+# set vars(flexilm,update_partition,skip)                         
+
diff --git a/sky130_cds/pnr/TEMPLATES/INNOVUS/lp_config.tcl b/sky130_cds/pnr/TEMPLATES/INNOVUS/lp_config.tcl
new file mode 100755
index 000000000..19e638f33
--- /dev/null
+++ b/sky130_cds/pnr/TEMPLATES/INNOVUS/lp_config.tcl
@@ -0,0 +1,211 @@
+###############################################################################
+#                       CADENCE COPYRIGHT NOTICE
+#         © 2008-2013 Cadence Design Systems, Inc. All rights reserved.
+#------------------------------------------------------------------------------
+#
+# This Foundation Flow is provided as an example of how to perform specialized
+# tasks.
+#
+# This work may not be copied, re-published, uploaded, or distributed in any way,
+# in any medium, whether in whole or in part, without prior written permission
+# from Cadence. Notwithstanding any restrictions herein, subject to compliance
+# with the terms and conditions of the Cadence software license agreement under
+# which this material was provided, this material may be copied and internally
+# distributed solely for internal purposes for use with Cadence tools.
+#
+# This work is Cadence intellectual property and may under no circumstances be
+# given to third parties, neither in original nor in modified versions, without
+# explicit written permission from Cadence. The information contained herein is
+# the proprietary and confidential information of Cadence or its licensors, and
+# is supplied subject to, and may be used only by Cadence's current customers
+# in accordance with, a previously executed license agreement between Cadence
+# and its customer.
+#
+#------------------------------------------------------------------------------
+# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL
+# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  MATERIAL, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###############################################################################
+
+##########################################################################################
+# Low power configuration file overlay.  This file contains foundation flow variables
+# that are specific to the LP/CPF flow and should be used in addition to the setup.tcl
+# and innovus_config.tcl files
+##########################################################################################
+#                           Placement Options
+# ----------------------------------------------------------------------------------------
+# set vars(resize_shifter_and_iso_insts) 
+#
+##########################################################################################
+#                           Tie cell information
+# ----------------------------------------------------------------------------------------
+# The variable vars(tie_cells) is defined in the innovus_config.tcl and is used to define a 
+# "global" tie cell list. This list will be used by default for each power domain.
+# It can be overridden for a given power domain by setting vars(,tie_cells).
+# ----------------------------------------------------------------------------------------
+# set vars(domain,tie_cells) >
+#
+##########################################################################################
+#                         Filler cell information
+# ----------------------------------------------------------------------------------------
+# The variable vars(filler_cells) is defined in the innovus_config.tcl and is used to define a 
+# "global" filler cell list. This list will be used by default for each power domain.
+# It can be overridden for a given power domain by setting vars(,filler_cells).
+# ----------------------------------------------------------------------------------------
+# set vars(domain,filler_cells) >
+#
+##########################################################################################
+#                          Welltap cell information
+# ----------------------------------------------------------------------------------------
+# The variable vars(welltaps) is defined in the innovus_config.tcl and is used to define a 
+# "global" welltap cell list. This list will be used by default for each power domain.
+# It can be overridden for a given power domain by setting vars(,welltaps).
+# ----------------------------------------------------------------------------------------
+#    verify_rule : maximum distance (in microns) between welltap cells and standard cells 
+#                  in microns
+#        max_gap : specifies the maximum distance from the right edge of one well-tap cell 
+#                  to the left edge of  the following well-tap cell in the same row
+#  cell_interval : specifies the maximum distance from the center of one well-tap cell 
+#                  to the center of the following well-tap cell in the same row
+#
+# NOTE: max_gap and cell_interval parameters are mutually exclusive, user has to define 
+#       only one of these parameters to add welltap cells
+#
+# ----------------------------------------------------------------------------------------
+# set vars(,welltaps) 		        >
+# set vars(,welltaps,checkerboard)  
+# set vars(,welltaps,max_gap)       
+# set vars(,welltaps,cell_interval) 
+# set vars(,welltaps,row_offset)    
+# set vars(,welltaps,verify_rule)   
+#
+##########################################################################################
+#                          Endcap cell information
+# ----------------------------------------------------------------------------------------
+# The variables vars(pre_endcap) and vars(post_endcap) are set in the innovus_config.tcl file and
+# are used to define "global" endcap cells. These used by default for each power domain.
+# They can be overridden for a given power domain setting vars(,pre_endcap)
+# and/or vars(,post_endcap).
+# ----------------------------------------------------------------------------------------
+# set vars(,pre_endcap)  
>
+# set vars(,post_endcap) >
+#
+##########################################################################################
+#                            Always on net buffering
+# ----------------------------------------------------------------------------------------
+# By default SOCE does always-on-net synthesis for SRPG control signal and PSO enable 
+# signals as part of optDesign -preCTS, but this can be manually done for specific nets if
+# necessary.  To do this, define the following variables and uncomment the pre_prects.tcl
+# plug-in template
+# ----------------------------------------------------------------------------------------
+# set vars(always_on_buffers)                	
+# set vars(always_on_nets)                  	
+# set vars(always_on_nets,max_fanout)       	 (optional)
+# set vars(always_on_nets,max_tran)         	 (optional)
+# set vars(always_on_nets,max_skew)         	 (optional)
+# set vars(always_on_nets,max_delay)        	 (optional)
+# set vars(,always_on_buffers)  >
+#
+##########################################################################################
+#                      Secondary power/ground routing
+# ----------------------------------------------------------------------------------------
+# Automatic secondary power routing can be enabled the foundation flows by setting 
+# vars(route_secondary_pg_nets) to true and providing cell pin pair information to
+# identify the connections requiring routing (PTBUFFD1:TVDD LVLLHCD4:VDDL, e.g.) 
+# ----------------------------------------------------------------------------------------
+# set vars(route_secondary_pg_nets)         [true | false]
+# set vars(secondary_pg,cell_pin_pairs)     
+# ----------------------------------------------------------------------------------------
+#In addition, the following can optionally defined either globally or per p/g net
+# ----------------------------------------------------------------------------------------
+# set vars(secondary_pg,max_fanout)       	
+# set vars(secondary_pg,pattern)          	
+# set vars(secondary_pg,non_default_rule) 	
+# ----------------------------------------------------------------------------------------
+# To optionally override for a given p/g net(s), use the vars(route_secondary_pg_nets) to 
+# define the list of nets to be overridden and then override vars(

,

,max_fanout) +# set vars(

,pattern) +# set vars(

,non_default_rule) +# +########################################################################################## +# runCLP options +# ---------------------------------------------------------------------------------------- +# set vars(clp_options) +# ---------------------------------------------------------------------------------------- +# set vars(clp_options) "" +# +########################################################################################## +# Modify power domains, row creation for power domains +# ---------------------------------------------------------------------------------------- +# The foundation flows contain a sample post_init_tcl (PLUG/post_init.tcl) plug-in to do +# power domain modification automatically based on the folloing variables: +# ---------------------------------------------------------------------------------------- +# set vars(,bbox) ; bondary coordinates in microns +# set vars(,rs_exts) ; distance in microns +# set vars(,min_gaps) ; distance in microns +# +########################################################################################## +# Power Shut-off Planning +# ---------------------------------------------------------------------------------------- +# The foundation flows contain a sample post_init_tcl (PLUG/post_init.tcl) plug-in to do +# power switch insertion automatically based on the following information: +# ---------------------------------------------------------------------------------------- +# set vars(,switchable) +# set vars(,switch_type) +# set vars(,switch_cell) +# set vars(,input_enable_pin) +# set vars(,output_enable_pin) +# set vars(,input_enable_net) +# set vars(,output_enable_net) +# set vars(,switch_instance) +# set vars(,top_offset) +# set vars(,bottom_offset) +# set vars(,right_offset) +# set vars(,left_offset) +# ---------------------------------------------------------------------------------------- +# Below variables are for column based pso implemetation +# ---------------------------------------------------------------------------------------- +# set vars(,checker_board) +# set vars(,horizonal_pitch) +# set vars(,column_height) +# set vars(,skip_rows) +# set vars(,back_to_back_chain) +# ... Connects the enableNetOut at the top of a column to the enableNetIn at the top of +# ... the next column, and connects the enableNetOut at the bottom of the column to the +# ... enableNetIn at the bottom of the next column +# ---------------------------------------------------------------------------------------- +# Below variables are for ring based pso implemetation +# ---------------------------------------------------------------------------------------- +# set vars(,top_ring) <1|0> +# set vars(,bottom_ring) <1|0> +# set vars(,right_ring) <1|0> +# set vars(,left_ring) <1|0> +# ... defines which side of the power domain to insert switches: +# ---------------------------------------------------------------------------------------- +# set vars(,top_switch_cell) +# set vars(,bottom_switch_cell) +# set vars(,left_switch_cell) +# set vars(,right_switch_cell) +# ... define pso cell name for each side of the power domain +# ---------------------------------------------------------------------------------------- +# set vars(,top_filler_cell) +# set vars(,bottom_filler_cell) +# set vars(,left_filler_cell) +# set vars(,right_filler_cell) +# set vars(,corner_cell_list) +# ... define filler cell name for each side of the power domain +# ---------------------------------------------------------------------------------------- +# set vars(,top_switches) <" -distribute"> +# set vars(,bottom_switches) <" -distribute"> +# set vars(,left_switches) <" -distribute"> +# set vars(,right_switches) <" -distribute"> +# ... define the number of switches for each side of the power domain +########################################################################################## diff --git a/sky130_cds/pnr/TEMPLATES/INNOVUS/setup.tcl b/sky130_cds/pnr/TEMPLATES/INNOVUS/setup.tcl new file mode 100755 index 000000000..bd0c55032 --- /dev/null +++ b/sky130_cds/pnr/TEMPLATES/INNOVUS/setup.tcl @@ -0,0 +1,300 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +##########################################################################################" +# CDNS FOUNDATION FLOW" +#-----------------------------------------------------------------------------------------" +# This is the foundation flow setup file. It contains all the necessary design" +# data to drive all the CDNS foundation flows. Each flow will also require an" +# additional configuration file to define flow specific information:" +#-----------------------------------------------------------------------------------------" +# INNOVUS -> innovus_config.tcl (for flat and hier implementation flows)" +# + lp_config.tcl (additional information for flat and hier lp flows)" +# -> proto_config.tcl (for the prototyping flow)" +##########################################################################################" + +global vars +set vars(version) 15.1 + +############################################################################### +# Define some variables to point to data, libraries, and scripts; +# script_root is required and must point to the foundation flow +# SCRIPTS directory. Recommendation is that the SCRIPTS directory +# should reside within the RUN directory +############################################################################### +set vars(design_root) +set vars(script_root) "./SCRIPTS" + +############################################################################### +# The following variables are used to define +# the design data for the flow. Either a fp_file, +# def_file or both can be defined +# -------------------------------------------------------------------- +set vars(design) +set vars(netlist) +set vars(fp_file) +#set vars(oa_fp) " " +#set vars(def_files) +#set vars(fp_tcl_file) +#set vars(fp_tcl_proc) +set vars(cts_spec) +#set vars(scan_def) +# -------------------------------------------------------------------- +set vars(process) +set vars(max_route_layer) +set vars(generate_tracks) (OPTIONAL) +#set vars(honor_pitch) (OPTIONAL) +############################################################################### +# One of cpf_file and ieee1801_file is REQUIRED for low power flows +# -------------------------------------------------------------------- +#set vars(cpf_file) +#set vars(ieee1801_file) +# -------------------------------------------------------------------- +# Optionally set the following to keep the previously defined rows +# If using IEEE 1801, replace "cpf" with "ieee1801". +#set vars(cpf_keep_rows) + +############################################################################### +# Define power/ground nets +############################################################################### +#set vars(power_nets) +#set vars(ground_nets) +############################################################################### +# The following are for defining user ILMs for flat or hierarchical flows. +# vars(,lef_file) is only necessary if the ILM lef file does not +# exist in the vars(lef_files) list. +# -------------------------------------------------------------------- +#set vars(ilm_list) +#set vars(,ilm_dir) +#set vars(,lef_file) +############################################################################### +# The following are REQUIRED for the ILM based +# hierarchical flow but are not necessary for +# the flat implementation flows. +# - cts spec for each partiition +# - latency sdc for each partition +# - edi config file for each (when applicable) +# -------------------------------------------------------------------- +#set vars(partition_list) +#set vars(,cts_spec) +#set vars(,latency_sdc) +#set vars(, + +############################################################################### +# Define library sets ... (REQUIRED) +# -------------------------------------------------------------------- +set vars(library_sets) + +set vars(,timing) +set vars(,si) + +############################################################################### +# Define lef library files ... (REQUIRED) +# -------------------------------------------------------------------- +set vars(lef_files) + +############################################################################### +# Define rc corners ... (REQUIRED) +# -------------------------------------------------------------------- +set vars(rc_corners) +set vars(,T) +set vars(,cap_table) +#set vars(,atf_file) +set vars(,qx_tech_file) +# set vars(,qx_lib_file) +# set vars(,qx_conf_file) + +############################################################################### +# Scale factors are also optional but are strongly encouraged for +# obtaining the best flow convergence and QoR. +# Scaling factors are applied per rc corner +# -------------------------------------------------------------------- +# set vars(,def_res_factor) +# set vars(,det_res_factor) +# set vars(,def_cap_factor) +# set vars(,det_cap_factor) +# set vars(,def_clk_res_factor) +# set vars(,det_clk_res_factor) +# set vars(,def_clk_cap_factor) +# set vars(,det_clk_cap_factor) +# set vars(,xcap_factor) +############################################################################### +set vars(,def_res_factor) +set vars(,det_res_factor) +set vars(,def_cap_factor) +set vars(,det_cap_factor) +set vars(,def_clk_res_factor) +set vars(,det_clk_res_factor) +set vars(,def_clk_cap_factor) +set vars(,det_clk_cap_factor) +set vars(,xcap_factor) + +############################################################################### +# Define operating conditions (optional) +# -------------------------------------------------------------------- +# set vars(opconds) " ..." +# set vars(,library_file) +# set vars(,process) +# set vars(,voltage) +# set vars(,temperature) +############################################################################### + +############################################################################### +# Define delay corners ... +# -------------------------------------------------------------------- +set vars(delay_corners) +set vars(,library_set) +set vars(,rc_corner) +#--------------------------------------------------------------------- +# Define derating factors for OCV here (clock and data). +# Derating factors are applied per delay corner ... +# OR, simply define vars(derate_tcl) plug-in with ALL +# your set_timing_derate commands and it will be used +#--------------------------------------------------------------------- +set vars(,data_cell_late) +set vars(,data_cell_early) +set vars(,data_net_late) +set vars(,data_net_early) +set vars(,clock_cell_late) +set vars(,clock_cell_early) +set vars(,clock_net_late) +set vars(,clock_net_early) +#set vars(,cell_check_late) +#set vars(,cell_check_early) + +############################################################################### +# Define constraints modes ... (REQUIRED) +# -------------------------------------------------------------------- +set vars(constraint_modes) +set vars(,pre_cts_sdc) +# -------------------------------------------------------------------- +# The following are optional for each mode ... +# Use EITHER incremental OR full post cts sdc +# -------------------------------------------------------------------- +#set vars(,post_cts_sdc) +#set vars(,incr_cts_sdc) + +############################################################################### +# Define analysis views ... (REQUIRED) +# -------------------------------------------------------------------- +set vars(setup_analysis_views) +set vars(hold_analysis_views) + +set vars(,delay_corner) +set vars(,constraint_mode) + +############################################################################### +# Define active setup and hold views and denote +# which are default (REQUIRED) +############################################################################### +set vars(default_setup_view) +set vars(default_hold_view) +set vars(active_setup_views) +set vars(active_hold_views) + +set vars(power_analysis_view) +############################################################################### +# Define GDS information ... (OPTIONAL) +# -------------------------------------------------------------------- +#set vars(gds_files) +#set vars(gds_layer_map) +#set vars(qrc_layer_map) +#set vars(qrc_library) +#set vars(qrc_config_file) + +############################################################################### +# Define extraction thresholds. Below are the recommended settings for 90nm +# and below. The are not the flow defaultsso they need to be set here. +############################################################################### +#set vars(relative_c_thresh) +#set vars(total_c_thresh) +#set vars(coupling_c_thresh) + +############################################################################### +# Define noise analysis settings. Below are the recommended settings for +# 90nm and below. They are not the flow defaults as they come with a +# run time penalty +############################################################################### +#set vars(delta_delay_threshold) + +######################################################################################### +# Variables for OA design import and export (OPTIONAL) +# --------------------------------------------------------------------------------------- +#set vars(oa_design_lib) +#set vars(oa_design_cell) +#set vars(oa_design_view) +# --------------------------------------------------------------------------------------- +#set vars(oa_ref_lib) +#set vars(oa_abstract_name) +#set vars(oa_layout_name) +######################################################################################### + +####################################################################### +# Distribution setup - lsf, rsh, local, or custom +####################################################################### +#set vars(distribute) +#set vars(distribute_timeout) +#set vars(custom,script) +#set vars(lsf,queue) +#set vars(lsf,resource) +#set vars(lsf,args) +#set vars(local_cpus) +#set vars(remote_hosts) +#set vars(cpus_per_remote_host) +#set vars(rsh,hosts) +#set vars(rsh,hosts) + +####################################################################### +# Design variables to handel large designs 10+M instances +# set placement_based_ptn to 1 to get place based flow +# set abutted_design to 1 to get steps like feedthrrouh with correct +# trialRoute settings +# set insert_feedthrough to 1 to add feedthrough for channel-based +# designs (feedthrough is always inserted for channelless designs, +# i.e. those where abutted_design is 1) +####################################################################### +#set vars(placement_based_ptn) +#set vars(abutted_design) +#set vars(insert_feedthrough) + +####################################################################### +# Variables controlling the use of flexmodels in the top-down +# hierarchical flow. +####################################################################### +#set vars(use_flexmodels) +#set vars(model_gen,art_based) +#set vars(model_gen,no_hold_view) +#set vars(model_gen,min_inst) + +Puts " Finished loading setup.tcl" diff --git a/sky130_cds/pnr/buildinfra/bin/compatibility.tcl b/sky130_cds/pnr/buildinfra/bin/compatibility.tcl new file mode 100755 index 000000000..5ce34ae7a --- /dev/null +++ b/sky130_cds/pnr/buildinfra/bin/compatibility.tcl @@ -0,0 +1,1315 @@ +#=========================================================================== +# File Name : Source: /net/splinter/fed/cvs/infrastructure/applets/compatibility.tcl,v +# Date Created : 07/20/2010 +# Date Modified : Date: 2012/03/07 02:42:47 +# Version : Revision: 1.35 +# Summary : Provide non-standard TCL commands to enable script reuse across Cadence +# Keywords : TCL compatibility script port EDI ae-ware ETS LEC conformal +# +# Description: +# RC has solid TCL support but also adds several useful commands that are +# not a standard part of TCL. Commands like add_command_help, parse_options, +# as well as others are frequently used in RC ae-ware scripts but not supported +# by most tools. In order to enable easy port of RC script to other tools +# within Cadence, this scripts are needed to emulate in other tools +# what is otherwise embedded in RC exectuable +# +# Assumptions: +# This script will be loaded in a Cadence tool that supports TCL +# +#=========================================================================== +##nagelfar syntax get_metric +##nagelfar syntax get_version +##nagelfar syntax get_version_info +##nagelfar syntax getVersion +##nagelfar syntax dbGet +##nagelfar syntax get_design +##nagelfar syntax get_root_module +##nagelfar syntax getLogFileName +##nagelfar syntax timedesign +global currTool + +# Load Cadence Compatibility Layer when not in RTL Compiler +if {[expr {[llength [info commands attribute_exists]] && \ + [attribute_exists -type root program_short_name] && \ + [string equal [get_attribute program_short_name /] "rc"]}]} { + set currTool rc +} else { + switch -regexp [info nameofexecutable] { + {/(velocity|encounter)$} { set currTool encounter } + {/ctos(gui)?$} { set currTool ctos } + {/(lec|LEC|verify)$} { set currTool lec } + {/(tclsh|tkcon)} { set currTool tclsh } + default { set currTool "unknown" } + } +} + +# exit if running in RTL Compiler; no emulation needed there +if {![string match "rc" ${currTool}]} { + # Put all ae-ware in a flat namespace to ease reference from one application to another + # As support for additional ae-ware is added through the compatibility layer, they will + # likely need to be added here if they have references to other ae-ware supported through + # the compatiblity layer + set ::ns(compat) "::aeware::compat" + set ::ns(parse_opt) $::ns(compat) + set ::ns(genrpt) $::ns(compat) + set ::ns(applet) $::ns(compat) + set ::ns(redirect) $::ns(compat) + set ::ns(regress) $::ns(compat) + + if {![llength [info procs alias]]} { proc alias {commandname command} { eval {interp alias {} $commandname {}} $command } } + + alias hidden_proc proc + alias tcl_source source + alias lcd cd + alias lls ls + alias lpwd pwd + alias ${::ns(compat)}::get_attr ${::ns(compat)}::get_attribute + alias ${::ns(compat)}::set_attr ${::ns(compat)}::set_attribute + alias ${::ns(compat)}::define_attr ${::ns(compat)}::define_attribute + + if {[string match "lec" ${currTool}]} { rename add_command_help _add_command_help } + + + namespace eval $::ns(compat) { + variable quietMode 0 + variable rootAttributes + + if {![llength [info commands ::add_command_help]]} { namespace export add_command_help } + if {![llength [info commands ::calling_proc]]} { namespace export calling_proc } + if {![llength [info commands ::dispatch_subcommand]]} { namespace export dispatch_subcommand } + if {![llength [info commands ::define_attribute]]} { namespace export define_attribute } + if {![llength [info commands ::get_attribute]]} { namespace export get_attribute } + if {![llength [info commands ::set_attribute]]} { namespace export set_attribute } + + proc basename {fullName} { return "[file tail $fullName]" } + + proc convert_unit {args} { + switch -- [parse_options "calling_proc" {} $args \ + "-to sos unit to convert input to(default is picoseconds)" toUnit \ + "srs string containing value to convert" inputStr] { + -2 { return } + 0 { return -code error } + } + + set inVal [lindex $inputStr 0] + set inUnit [lindex $inputStr 1] + } + + proc EdiMetricsPresent {args} { + set metricsCookie ".edi_metrics" + file delete ${metricsCookie} + ##nagelfar ignore + ::se::save_metric_file ${metricsCookie} + set returnVal "false" + switch [llength $args] { + 0 { if {[file exists "${metricsCookie}"]} { set returnVal "true" } } + 1 { + if {[file exists "${metricsCookie}"]} { + set metricFile [open ${metricsCookie} r] + while {![eof $metricFile]} { + set metricLine [gets $metricFile] + if {![regexp {se::save_metric\s+(.*)\s+(\{.*\})} $metricLine match metricName metricVal]} { continue } + if {[string match $metricName $args]} { set returnVal true; break; } + } + close $metricFile + } + } + default { return "Error:EdiMetricsPresent allows 1 or 0 arguments!" } + } + return ${returnVal} + } + + + proc ::aeware::compat::find {args} { + global currTool + + if {[regexp {(program_version|memory_usage|runtime)} $args]} { + if {[regexp {\-(des|desi|desig|design)} $args]} { return } + if {[regexp {(root.*\-attr|-attr.*root)} $args]} { return 1 } + } + if {[regexp {\-cost_group\s+\*} $args]} { + switch ${currTool} { + "encounter" { + # For EDI, only safe way to do this is generating a report and extracting the path groups from there + set logFile [open [getLogFileName] r] + seek $logFile 0 end + timedesign -reportonly + timedesign -hold -reportonly + while {![eof $logFile]} { + set logLine [gets $logFile] + if {[regexp {\|\s+Setup mode\s+\|\s+all\s+\|\s+(.*)\s+\|} ${logLine} match rawCgInfo]} { break } + } + close $logFile + regsub -all {\s+} ${rawCgInfo} "" ediCgInfo +# regsub {\|clkgate} ${ediCgInfo} "" ediCgInfo +# regsub {\|in2reg} ${ediCgInfo} "|inclkSrc2reg" ediCgInfo +# regsub {\|in2out} ${ediCgInfo} "|inclkSrc2out" ediCgInfo + return [split ${ediCgInfo} "|"] + # unset -nocomplain ediCgInfo + # foreach_in_collection cgName [get_path_groups] { lappend ediCgInfo [get_property $cgName name] } + # puts "$ediCgInfo" + } + "ctos" { return } + } + } + if {[regexp {\-(des|desi|desig|design)\s+(\S+)} $args match findOpt findStr]} { + switch ${currTool} { + "encounter" { return [dbGet top.name] } + "ctos" { return [get_design] } + "lec" { return [get_root_module] } + } + } + return + } + + proc what_is {args} { return } + + proc calling_proc {args} { + switch -- [parse_options "calling_proc" {} $args \ + "nos number of levels to go back for calling procs name" levels] { + -2 { return } + 0 { return -code error } + } + + # default is current level + if {[llength $levels]} { + if {$levels <= 0} { return -code error "Error: calling_proc argument must be > 0" } + } else { + set levels 0 + } + + # don't count this call to calling_proc + incr levels + + # puts "levels = $levels" + # puts "i_level = [info level]" + # puts "i_level_expr = [info level [expr {[info level] - $levels}]]" + # puts "index = [lindex [info level [expr {[info level] - $levels}]] 0]" + # puts "ns_tail = [namespace tail [lindex [info level [expr {[info level] - $levels}]] 0]]" + return [namespace tail [lindex [info level [expr {[info level] - $levels}]] 0]] + } + + proc get_attribute {args} { + global currTool + variable rootAttributes + variable $::ns(compat)::quietMode + + switch -- [parse_options [calling_proc] {} $args \ + "srs attribute name" attrName \ + "srm object of interest (must be unique)" objInfo] { + -2 { return } + 0 { return -code error } + } + + foreach obj $objInfo { + if {[string match "encounter" ${currTool}] && + [regexp "metric_?(value|tcl)?" $obj match metricArg]} { + if {[llength ${metricArg}]} { + set metricArg "-${metricArg}" + } else { + set metricArg "-value" + } + set metricValue "N/A" + if {[eval EdiMetricsPresent $attrName]} { set metricValue [eval get_metric $attrName ${metricArg}] } + return $metricValue + } + if {[regexp {slack} $attrName]} { + if {[eval EdiMetricsPresent timing.setup.WNS.${obj}]} { + set metricValue [get_metric timing.setup.WNS.${obj} -value] + return ${metricValue} + } else { + puts "Warning: No \'slack\' metrics available for ${obj}" + return "N/A" + } + } + if {!${quietMode} && ![regexp {/} $obj]} { + puts "Warning: only root attributes are currently supported by Cadence Compatibility Layer(CCL)" + puts " EDI also supports metrics; specify \'metric\' as the object type" + puts "\tget_attribute $attrName $objInfo" + return -code error + } + } + + switch -regexp -- $attrName { + {^(runtime|super_thread_runtime|super_thread_total_runtime)$} { + switch -regexp ${currTool} { + {(encounter|ctos|lec)} { + set f [open "|ps -p [pid] -o cputime --noheaders"] + set size [string trim [read $f]] + close $f + if {[regexp {(0*(\d+)-)?0*(\d+):0*(\d+):0*(\d+)} $size -> xx days hours min sec]} { + set secTime 0 + if {[llength ${days}]} { incr secTime [expr {$days * 24 * 60 * 60}] } + incr secTime [expr {$hours * 60 * 60}] + incr secTime [expr {$min * 60}] + incr secTime $sec + } + return $secTime + } + {(tclsh)} { + set f [open "|ps -p [pid] -o cputime --noheaders"] + set size [string trim [read $f]] + close $f + if {[regexp {(0*(\d+)-)?0*(\d+):0*(\d+):0*(\d+)} $size -> xx days hours min sec]} { + set secTime 0 + if {[llength ${days}]} { incr secTime [expr {$days * 24 * 60 * 60}] } + incr secTime [expr {$hours * 60 * 60}] + incr secTime [expr {$min * 60}] + incr secTime $sec + } + return $secTime + } + } + } + {^memory_usage$} { + switch -regexp ${currTool} { + {(encounter|ctos|lec)} { + set f [open "|ps -p [pid] -o vsz --noheaders"] + set size [string trim [read $f]] + close $f + return [format "%.2f" [expr {$size / 1024.0}]] + } + } + } + {^program_version$} { + switch ${currTool} { + "encounter" { return "[getVersion]" } + "ctos" { return [format "%s(%s)" [join [lrange [get_version] 0 2] .] [join [lrange [get_version] 4 5] {}]] } + "lec" { return [format "%s(%s)" [lindex [get_version_info] 0] [lindex [get_version_info] 2]] } + } + } + {^lp_power_unit$} { return "nW" } + {^lp_insert_clock_gating$} { return "false" } + {^super_thread_servers$} { return } + {^auto_super_thread$} { return 0 } + default { + if {[info exists rootAttributes(value,$attrName)]} { + return "$rootAttributes(value,$attrName)" + } elseif {!${quietMode}} { + return -code error "Error: attribute \'$attrName\' is currently not supported by Cadence Compatibility Layer(CCL)" + + } + } + } + return + } + + + proc set_attribute {args} { + variable rootAttributes + variable $::ns(compat)::quietMode + + set quiet 0 + if {[info exists quietMode] && ${quietMode}} { set quiet 1 } + + switch -- [parse_options [calling_proc] {} $args \ + "-quiet bos keeps quiet unless there are problems" quiet \ + "-lock bos attribute becomes read only once locked" lockAttr \ + "srs attribute name" attrName \ + "srs new value. A compound string (containing spaces) should be represented as a list (using double-quotes or braces)" attrVal \ + "srm object(s) of interest" objInfo] { + -2 { return } + 0 { return -code error } + } + + foreach obj $objInfo { + if {!${quiet} && ![regexp {/} $obj]} { + puts "Error: only root attributes are currently supported by Cadence Compatibility Layer(CCL)" + puts "\t\'$attrName\' will not be set to \'$attrVal\'" + return -code error + } + if {[info exists rootAttributes(value,$attrName)]} { + if {![eval IsValidArg $rootAttributes(dtype,$attrName) [list $attrVal]]} { + puts " set_attribute $attrName $attrVal $objInfo" + return -code error + } + if {!$quiet} { + puts " Setting attribute of \'$obj\': \'$attrName\' = ${attrVal}" + } + # Support for -check_function in define_attribute + if {[info exists rootAttributes(checkFunc,${attrName})]} { eval $rootAttributes(checkFunc,${attrName}) ${obj} ${attrVal} } + set rootAttributes(value,$attrName) $attrVal + } else { + return -code error "Error: attribute \'$attrName\' not found" + } + } + } + + proc define_attribute {args} { + variable rootAttributes + variable $::ns(compat)::quietMode + + set checkFunc {} + set setFunc {} + set computeFunc {} + + set checkFuncHelp "name of Tcl proc used to check value. The Tcl proc returns '1' if value is OK, '0' otherwise and requires two arguments: " + set setFuncHelp "name of Tcl proc used to set value. The Tcl proc returns the new value and requires three arguments: " + set computeFuncHelp "name of Tcl proc used to compute value. If this option is used the attribute becomes read-only, since its value is always computed. The Tcl proc" + + switch -- [parse_options [calling_proc] {} $args \ + "-category srs category name" catName \ + "-data_type srs data type (boolean, \'fixed point\', \'floating point number\', integer, string)" dataType \ + "-obj_type srs object type" objType \ + "-default_value sos default value" defaultVal \ + "-help_string sos help string" helpString \ + "-more_help_string sos extended help string" extraHelp \ + "-hidden bos hide attribute" isHidden \ + "-obsolete bos obsolete attribute" isObsolete \ + "-check_function sos $checkFuncHelp" checkFunc \ + "-compute_function sos $computeFuncHelp" computeFunc \ + "-set_function sos $setFuncHelp" setFunc \ + "-skip_in_db bos if set, command write_db will not store attribute settings in the database" skipDB \ + "srs attribute name" attrName] { + -2 { return } + 0 { return -code error } + } + + if {!${quietMode} && [llength $setFunc]} { + puts "Warning: user-attributes with -set_function are not supported by Cadence Compatibility Layer(CCL)" + puts "\tattribute \'$attrName\' will not be supported" + return + } + + if {!${quietMode} && [llength $computeFunc]} { + puts "Warning: user-attributes with -compute_function are not supported by Cadence Compatibility Layer(CCL)" + puts "\tattribute \'$attrName\' will not be supported" + return + } + + if {!${quietMode} && ![regexp {root} $objType]} { + puts "Warning: only root level user-attributes are supported by Cadence Compatibility Layer(CCL)" + puts "\tattribute \'$attrName\' will not be supported" + return + } + + set rootAttributes(value,$attrName) $defaultVal + set rootAttributes(dtype,$attrName) $dataType + set rootAttributes(value,$attrName) $defaultVal + if {[llength ${checkFunc}]} { set rootAttributes(checkFunc,$attrName) $checkFunc } + } + + # Currently, add_command_help is not emulated but implemented without doing anyhting to avoid errors + if {![llength [info commands ::add_command_help]]} { proc add_command_help {args} {} } + + # Provide help for command containing subcommands, edit_netlist is + # an example + proc subcommand_help {command help subcommands} { + puts " $command: $help" + puts "Usage: $command subcommand \[-h\]" + puts "" + puts " The 'subcommand' can be one of the following:" + + # get length of longest command name - used to pretty print help + set mlen 0 + foreach subcommand $subcommands { + set clen [string length [lindex $subcommand 0]] + set flag [lindex $subcommand 1] + if {$flag eq "hidden"} { + continue + } + if {$clen > $mlen} { + set mlen $clen + } + } + + foreach subcommand $subcommands { + set flag [lindex $subcommand 1] + if {$flag eq "hidden"} { + continue + } + set cmd_name [lindex $subcommand 0] + set cmd_help [lindex $subcommand 3] + set scount [expr {$mlen -[string length $cmd_name]}] + set spaces [string range [string repeat " " 50] 0 $scount] + puts "[format "%s%s- %s" $cmd_name $spaces $cmd_help]" + } + } + + # Fire off the appropriate subcommand. edit_netlist uses this. + # subcommands are formatted as: + proc dispatch_subcommand {command c_args subcommands help} { + if {[llength $c_args] < 1} { + subcommand_help $command $help $subcommands + return -code error "Failed on '$command $c_args'" + } else { + set subcommand [lindex $c_args 0] + + if {[string match "-h*" $subcommand]} { + subcommand_help $command $help $subcommands + return + } else { + set matches {} + set mlist {} + set cmdhelp "" + + foreach type $subcommands { + set this_subcommand [lindex $type 0] + + if {[string match "$subcommand*" $this_subcommand]} { + if {([lindex $type 1] eq "hidden") && \ + ($subcommand ne $this_subcommand)} { + continue + } + set function [lindex $type 2] + set cmdhelp [lindex $type 3] + lappend matches $this_subcommand + lappend mlist $type + } + } + + # get exact match for subcommand for cases with same beginning + # e.g. 'report power' and 'report power_domain' + set exact 0 + foreach type $matches { + if {$type eq $subcommand} { + set exact 1 + } + } + if {$exact} { + set matches $subcommand + foreach type $mlist { + if {$subcommand eq [lindex $type 0]} { + set function [lindex $type 2] + set cmdhelp [lindex $type 3] + break + } + } + } + + if {[llength $matches] > 1} { + #Get the matching subcommand with least string length + if { [string length $subcommand] > 2 } { + set type [lindex [lsort -index 0 $mlist] 0] + set function [lindex $type 2] + set cmdhelp [lindex $type 3] + + puts stdout "Ambiguous subcommand: $matches" + puts stdout "Choosing subcommand: '[lindex $type 0]'" + } else { + puts stdout "Ambiguous subcommand: $matches" + subcommand_help $command $help $subcommands + return -code error "Failed on '$command $c_args'" + } + } + + if {[llength $matches] == 0} { + puts stdout "Cannot find subcommand: $subcommand" + subcommand_help $command $help $subcommands + return -code error "Failed on '$command $c_args'" + } + } + } + + # Don't use concat because concat is slow. + set cmd [list $function] + set found_help 0 + foreach arg [lrange $c_args 1 end] { + lappend cmd $arg + if {($arg eq "-h") || ($arg eq "-he") || + ($arg eq "-hel") || ($arg eq "-help")} { + set found_help 1 + } + } + + # print help for hidden subcommands + # ARGH- the regexp is converting vdir objects into strings! + # Please be certain that you watch out for vdir objects. + #if {[regexp {\-h} $cmd] && ($cmdhelp ne "")} + if {$found_help && ($cmdhelp ne "")} { + puts " $command $matches: $cmdhelp" + } + eval $cmd + } + } + + namespace eval $::ns(parse_opt) { + + if {![llength [info commands ::parse_options]]} { namespace export parse_options } + + proc UsageInfo {cmd cmdOptions} { + upvar $cmdOptions optInfo + set cmdVersion {} + if { [expr {[llength $cmd] > 1}] && [string is double [lindex $cmd end]] } { + set cmdVersion [lindex $cmd end] + set cmd [lreplace ${cmd} end end] + } + set usageString {} + set usageHeader "\nUsage: $cmd" + if {[llength ${cmdVersion}]} { set usageHeader "\nCommand Version: ${cmdVersion}\nUsage: $cmd" } + foreach opt [lsort [array names optInfo var,*]] { + regsub "var," $opt "" optUsage + regsub "var," $opt "rqmt," optRqmt + regsub "var," $opt "help," optHelp + for {set i 0} {$i < [llength $optInfo($opt)]} {incr i} { + if {![regexp {b\w\w} [lindex $optInfo($optRqmt) $i]]} { append optUsage " " } + if {![regexp {\-.*} $optUsage]} { set optUsage "" } + switch -regexp [lindex $optInfo($optRqmt) $i] { + {n\w\w} { set optUsage "${optUsage}" } + {f\w\w} { set optUsage "${optUsage}" } + {s\w\w} { set optUsage "${optUsage}" } + } + if {[regexp {\wO\w} [lindex $optInfo($optRqmt) $i]]} { continue } + if {[regexp {\wo\w} [lindex $optInfo($optRqmt) $i]]} { set optUsage "\[${optUsage}\]" } + if {[regexp {\w\wm} [lindex $optInfo($optRqmt) $i]]} { set optUsage "${optUsage}+" } + append usageHeader " ${optUsage}" + lappend usageString " ${optUsage}:" + lappend usageString " [lindex $optInfo($optHelp) $i]" + } + } + + # Output usage help messsage + puts "$usageHeader\n" + foreach usageLine ${usageString} { puts "$usageLine" } + } + + proc ParseHelp {} { + puts " + Usage: parse_options cmd file_var args \[code var\]* + + cmd : + name of the command whose options are being parsed + file_var : + name of variable to hold file id + args : + options being passed to the command + code : + option parsing directive + var : + name of variable to hold option result + +The option parsing directive should be in the form: + (<-name> )?()? + where <-name> is a flag, for example \"-max\" + multiple string objects('srm' and 'som') are not supported for flagged options. + is a character indicating the option type + d: directory object + n: integer + f: float + b: boolean + s: string + is a character indicating optional, required or obsolete + o: optional + r: required + x: obsolete + is a character indicating single or multiple + s: single value only + m: multiple values accepted + is a string indicating directory types + The types must be separated by | characters + and must be bounded by parentheses. + For example, (port|pin) indicates that both + port and pin directories are accepted. + is a string returned to the user if the + \'-h\' flag is given. +" + } + + proc parse_options {args} { + set cmd [lindex $args 0] + set file_var [lindex $args 1] + set parseArgs [lindex $args 2] + set parseOptions [lrange $args 3 end] + set switchName {} + set helpString {} + set parseRqmt {} + + if {[info exists optInfo]} { unset optInfo } + if {[regexp {\-(h|he|hel|help)($|\s)} $cmd]} { + eval ParseHelp + return + } + foreach opt $parseOptions { + if {[llength $opt] == 1} { + set indexName "unflagged" + if {[llength $switchName] == 1} { regsub -all {\s} $switchName "" indexName } + switch -regexp $parseRqmt { + {b\wm} { + puts "Error: Boolean options cannot be multi-valued" + return -code error + } + {br\w} { + puts "Error: Boolean options cannot be required - useless" + return -code error + } + {bos} { + if {[string match "unflagged" $indexName]} { + puts "Error: Boolean options must be unflagged" + return -code error + } + } + {s\wm} { + if {[llength $switchName] == 1} { + puts "Error: \'som\' and \'srm\' do not support flagged options" + return -code error + } + } + } + lappend optInfo(var,$indexName) $opt + lappend optInfo(rqmt,$indexName) $parseRqmt + lappend optInfo(used,$indexName) 0 + lappend optInfo(help,$indexName) $helpString + continue + } + if {![regexp {^\s*(\-\w+)?\s*([dbsnf][orO][sm])(\(\S+\))?\s+(.*)} $opt match switchName parseRqmt objRqmt helpString]} { + puts "Error: Invalid parse requirement string" + eval ParseHelp + return -code error + } + } + + # probably needs to be removed and integrated into next parsing section + if {[regexp {(^|\s)\-(h|he|hel|help)($|\s)} $parseArgs]} { + eval UsageInfo [list $cmd] optInfo + return -2 + } + + set unflagCount 0 + if {[info exists optInfo(var,unflagged)]} { set unflagCount [llength $optInfo(var,unflagged)] } + set unflagIndex 0 + set argCount [llength $parseArgs] + # foreach foo [array names optInfo *] { puts "optInfo($foo) -> $optInfo($foo)" ; set ::optInfo($foo) $optInfo($foo); } + # Process flags and flag arguments + for {set i 0} {$i < $argCount} {incr i} { + set currentArg [lindex $parseArgs $i] + if {[regexp {\-} $currentArg]} { + set matchIndex [lsearch -regexp -all [array names optInfo var,*] $currentArg] + if { [llength $matchIndex] > 1 } { return -code error "Error: ambiguous flag \'$currentArg\' specified" } + if { [llength $matchIndex] == 1 } { regsub "var," [lindex [array names optInfo var,*] $matchIndex] "" currentArg } + } + # Identify and process flagged options + # llength [lsearch -regexp -all [array names optInfo var,*] $currentArg] + # info exists optInfo(var,$currentArg) + if { [info exists optInfo(var,$currentArg)] || [expr {$unflagCount != 0}] } { + set argVal {} + if {[info exists optInfo(var,$currentArg)]} { + upvar $optInfo(var,$currentArg) argVar + set argRqmt $optInfo(rqmt,$currentArg) + if {[regexp {b(o|O)s} $argRqmt]} { + set argVar 1 + set optInfo(used,$currentArg) 1 + continue + } + # If not flagged boolean, make sure there are additional arguments + # if not enough arguments, signal error + incr i + if { $i == $argCount } { + puts "Error: \'$currentArg\' requires a valid argument" + eval UsageInfo [list $cmd] optInfo + return -code error + } + set optInfo(used,$currentArg) 1 + set currentArg [lindex $parseArgs $i] + } else { + upvar [lindex $optInfo(var,unflagged) $unflagIndex] argVar + set argRqmt [lindex $optInfo(rqmt,unflagged) $unflagIndex] + lset optInfo(used,unflagged) $unflagIndex 1 + incr unflagCount -1 + incr unflagIndex + } + } + + if { ![info exists optInfo(var,$currentArg)] && + [expr {$unflagCount == 0}] && + [expr {[llength $argVal] != 0}] && + ![regexp {\w\wm} $argRqmt] } { + puts "Error: \'$currentArg\' is not a valid option" + eval UsageInfo [list $cmd] optInfo + return -code error + } + + if {![llength $argVal]} { + if {![eval IsValidArg $argRqmt [list $currentArg]]} { + eval UsageInfo [list $cmd] optInfo + return -code error + } + } + + lappend argVal $currentArg + + if {[regexp {\w\ws} $argRqmt]} { + set argVar [lindex $argVal 0] + } else { + set argVar $argVal + } + } + + # Check for missing 'required' arguments + foreach optUsed [array names optInfo used,*] { + regsub "used," $optUsed "rqmt," optRqmt + regsub "used," $optUsed "" unusedArg + for {set i 0} {$i < [llength $optInfo($optUsed)]} {incr i} { + if {![lindex $optInfo($optUsed) $i]} { + switch -regexp [lindex $optInfo($optRqmt) $i] { + {\wr\w} { + if {[regexp {unflagged} $unusedArg]} { set unusedArg "" } + eval UsageInfo [list $cmd] optInfo + return -code error + } + {b(o|O)s} { + upvar $optInfo(var,$unusedArg) argVar + set argVar 0 + } + {(d|s|n|f)(o|O)\w} { + upvar $optInfo(var,$unusedArg) argVar + if {![info exists argVar]} { set argVar {} } + } + } + } + } + } + return 1 + } + + proc IsValidArg {rqmt str} { + switch -regexp $rqmt { + {boolean$} { + if {![string is boolean $str]} { + puts "Error: \'$str\' is not of type booelan when boolean required" + return 0 + } + } + {(n\w\w|integer)$} { + if {![string is integer $str]} { + puts "Error: \'$str\' is not of type integer when integer required" + return 0 + } + } + {(f\w\w|floating point)$} { + if {![string is double $str]} { + puts "Error: \'$str\' is not of type float when float required" + return 0 + } + } + default { return 1 } + } + return 1 + } + } + + namespace eval $::ns(regress) { + variable buffer {} + variable delta 0.0 + variable delta_hi_margin 1.25 + variable delta_lo_margin 0.60 + variable delta_hi_margin_by_os + array set delta_hi_margin_by_os {AIX 5.0 SunOS 3.0} + variable ignore_no_echo 0 + variable count_levels 0 + + if {![llength [info commands ::assert]]} { namespace export assert } + if {![llength [info commands ::regress]]} { namespace export regress } + + # ------------------------------------------------------------------------- + # assert -- asserts that an expression evaluates to non-zero. + # Used in regression tests + proc assert {args} { + switch -- [parse_options [calling_proc] {} $args \ + "srs expression to test the assertion against - return zero will produce error" test_expr] { + -2 { return } + 0 { return -code error "Failed on assert" } + } + + if {[catch {uplevel expr [list $test_expr]} rsl] == 1} { return -code error "Failed on badly formed assert: $rsl" } + if {!$rsl} { return -code error "Failed on assert(\{$test_expr\})" } + return + } + + # ------------------------------------------------------------------------- + # regress + # Used in regression tests + proc regress {args} { + variable $::ns(regress)::buffer + variable $::ns(regress)::count_levels + variable $::ns(regress)::delta + variable $::ns(regress)::ignore_no_echo + + set help_str { + e.g. regress { + puts foo + } { + see "f" + see_no "x" + } + Supported regress commands are: + see - find a string in the output buffer and advance to the end of what matched + peek - find a string in the output buffer but don't advance + see_no - don't find a string in the output buffer + rsee - regular expression version of see + rpeek - regular expression version of peek + rsee_no - regular expression version of see_no + } + + switch -- [parse_options [calling_proc] {} $args \ + "-no_echo bos don't print anything in the log" no_echo \ + "srs code to check" script \ + "srs checking script \n$help_str" see_commands] { + -2 { return } + 0 { return -code error "Failed on regress" } + } + + set last_buffer "buffer" + set last_delta "delta" + + # lint + set rsl {} + + incr count_levels + if {$no_echo && !$ignore_no_echo} { + set script_ok 1 + ##nagelfar ignore E Bad option -mesg to redirect + redirect -mesg -variable buffer { + if {[catch {uplevel $script} rsl]} { + set script_ok 0 + } + } + if { $script_ok == 0 } { + puts $buffer + set buffer $last_buffer + return -code error "$rsl\nFailed on regress" + } + } else { + ##nagelfar ignore E Bad option -mesg to redirect + redirect -mesg -variable -tee "buffer" { + if {[catch {uplevel $script} rsl]} { + set buffer $last_buffer + return -code error "$rsl\nFailed on regress" + } + } + } + incr count_levels -1 + + ##nagelfar ignore Only braced + if {[catch {namespace eval $::ns(regress) $see_commands} eval_rsl]} { + if { $no_echo && !$ignore_no_echo } { + puts $buffer + } + if {! [regexp "Failed on" $eval_rsl]} { + set buffer $last_buffer + set delta $last_delta + return -code error "$eval_rsl\nFailed on regress" + } + return -code error $eval_rsl + } + + set buffer $last_buffer + set delta $last_delta + + return $rsl + } + + # Check for the given string in the current buffer, but leave + # the buffer alone + proc peek {string} { + variable $::ns(regress)::buffer + + set index [string first $string $buffer] + if {$index < 0} { + return -code error "Failed on \'regress peek\' [list $string]" + } + } + + # Check for the given string in the current buffer, and chop + # off everything in the buffer up through what matched + proc see {string} { + variable $::ns(regress)::buffer + + set index [string first $string $buffer] + if {$index < 0} { + return -code error "Failed on \'regress see\' [list $string]" + } + # move the current position after what we just matched + set index [expr {$index + [string length $string]}] + set buffer [string range $buffer $index end] + } + + # Check that the given string doesn't exist in the current + # buffer. + proc see_no {string} { + variable $::ns(regress)::buffer + + set index [string first $string $buffer] + if {$index >= 0} { + return -code error "Failed on \'regress see_no\' [list $string]" + } + } + + # Check that the given regular expression matches in the current + # buffer. + proc rpeek {regexp} { + variable $::ns(regress)::buffer + + if {! [regexp -- $regexp $buffer]} { + return -code error "Failed on \'regress rpeek\' [list $regexp]" + } + } + + # Check that the given regular expression matches in the current + # buffer and chop off everything in the buffer up through what + # matched. + proc rsee {regexp} { + variable $::ns(regress)::buffer + + if {! [regexp -- $regexp $buffer match]} { + return -code error "Failed on \'regress rsee\' [list $regexp]" + } + + # move the current position after what we just matched + set index [string first $match $buffer] + assert {$index >= 0} + set index [expr {$index + [string length $match]}] + set buffer [string range $buffer $index end] + } + + # Check that the given regular expression doesn't match in the current + # buffer. + proc rsee_no {regexp} { + variable $::ns(regress)::buffer + + if {[regexp -- $regexp $buffer]} { + return -code error "Failed on \'regress rsee_no\' [list $regexp]" + } + } + + } + + + namespace eval $::ns(redirect) { + if {![llength [info commands ::redirect]]} { namespace export redirect } + + proc write_gzip_file {filename} { + set gzip_com [exec which gzip] + if {[llength $gzip_com] == 0} { + return -code error \ + "Failed on 'write_gzip_file': unable to find gzip command" + } + if {[catch {open "|$gzip_com -c > $filename" w} file_id]} { + return -code error \ + "Failed on 'write_gzip_file': unable to open $filename" + } + return $file_id + } + + proc append_gzip_file {filename} { + set gzip_com [exec which gzip] + if {[llength $gzip_com] == 0} { + return -code error \ + "Failed on 'append_gzip_file': unable to find gzip command" + } + if {[catch {open "|$gzip_com -c >> $filename" a} file_id]} { + return -code error \ + "Failed on 'append_gzip_file': unable to open $filename" + } + return $file_id + } + + + if {! [llength [info commands ::tcl_puts]]} { + rename ::puts ::tcl_puts + } elseif {![llength [info commands $::ns(redirect)::file_puts]]} { + puts "Warning: \'puts\' could not be aliased to \'tcl_puts\'" + puts "\t\'tcl_puts\' already exists" + } + + # make puts refer to the new tcl_puts + interp alias {} ::puts {} ::tcl_puts + + # A replacement version of puts. All this layer does is to send puts + # commands that would have gone to stdout to the filehandle + # given in the file argument + proc file_puts {tee file args} { + switch [llength $args] { + 1 { + ::tcl_puts $file [lindex $args 0] + if {$tee} { + ::tcl_puts [lindex $args 0] + } + } + + 2 { + if {[lindex $args 0] eq "-nonewline"} { + ::tcl_puts -nonewline $file [lindex $args 1] + if {$tee} { + ::tcl_puts -nonewline [lindex $args 1] + } + } elseif {[lindex $args 0] eq "stdout"} { + ::tcl_puts $file [lindex $args 1] + if {$tee} { + ::tcl_puts [lindex $args 1] + } + } else { + ::tcl_puts [lindex $args 0] [lindex $args 1] + } + } + + 3 { + if {[lindex $args 1] eq "stdout"} { + ::tcl_puts [lindex $args 0] $file [lindex $args 2] + if {$tee} { + ::tcl_puts [lindex $args 0] [lindex $args 2] + } + } else { + ::tcl_puts [lindex $args 0] [lindex $args 1] [lindex $args 2] + } + } + + default { + eval {::tcl_puts $args} + } + } + } + + # A replacement version of puts. All this layer does is to send puts + # commands that would have gone to stdout to the variable given + # in the given level's stack frame + proc var_puts {tee args} { + variable result + + switch [llength $args] { + 1 { + append result [lindex $args 0] "\n" + if {$tee} { + ::tcl_puts [lindex $args 0] + } + } + + 2 { + if {[lindex $args 0] eq "-nonewline"} { + append result [lindex $args 1] + if {$tee} { + ::tcl_puts -nonewline [lindex $args 1] + } + } elseif {[lindex $args 0] eq "stdout"} { + append result [lindex $args 1] "\n" + if {$tee} { + ::tcl_puts [lindex $args 1] + } + } else { + ::tcl_puts [lindex $args 0] [lindex $args 1] + } + } + + 3 { + if {[lindex $args 1] eq "stdout"} { + append result [lindex $args 2] + if {$tee} { + ::tcl_puts [lindex $args 0] [lindex $args 2] + } + } else { + ::tcl_puts [lindex $args 0] [lindex $args 1] [lindex $args 2] + } + } + + default { + eval "::tcl_puts $args" + } + } + } + + proc redirect {args} { + switch -- [parse_options [calling_proc] {} $args \ + "-append bos appends to the file or variable" append \ + "-tee bos writes to stdout also" tee \ + "-mesg bos ignored for all other tools (for now)" mesg \ + "-variable bos writes to Tcl variable instead of a file" variable \ + "srs the file or variable name to write into" file_var_name \ + "srs the Tcl code to execute" script] { + -2 { return } + 0 { return -code error } + } + + if {([llength $file_var_name] != 1) && \ + ([string index $file_var_name 0] ne "|")} { + return -code error "$file_var_name doesn't look like a filename" + } + + if {$variable} { + # remember what the alias for puts is currently so we can restore it + set prev_alias [interp alias {} ::puts] + # override the current puts alias + interp alias {} ::puts {} $::ns(redirect)::var_puts $tee + + # remember the value of the redirect buffer so we can restore it + namespace eval $::ns(redirect) { + if {[info exists result]} { set prev_result $result } + set result {} + } + } else { + # open the file requested + if {[file extension $file_var_name] eq ".gz"} { + if {$append} { + set file [append_gzip_file $file_var_name] + } else { + set file [write_gzip_file $file_var_name] + } + } else { + if {$append} { + set file [open $file_var_name a] + } else { + set file [open $file_var_name w] + } + } + # remember what the alias for puts is currently so we can restore it + set prev_alias [interp alias {} ::puts] + + # override the current puts alias + interp alias {} ::puts {} [set ::ns(redirect)]::file_puts $tee $file + } + + # evaluate the given script + set error [catch {uplevel $script} rsl] + + # put the puts alias back where it was before + eval {interp alias {} ::puts {}} $prev_alias + + if {$variable} { + upvar $file_var_name my_variable + if {$append} { + append my_variable [namespace eval $::ns(redirect) { set result }] + } else { + set my_variable [namespace eval $::ns(redirect) { set result }] + } + if {[namespace eval $::ns(redirect) { info exists prev_result }]} { + if {$tee} { namespace eval $::ns(redirect) { append prev_result $result } } + namespace eval $::ns(redirect) { set result $prev_result } + } + } else { + # put the stdout handle back where it was before + close $file + } + + # return the results of the executed script + if {$error} { + return -code "error" $rsl + } + return $rsl + } + } + + # This section added to implement compatible attributes or dummies for compatibility purposes + namespace eval $::ns(compat) { + # This attribute is defined such that setting it in all tools does not cause any errors + # however, the attribute may not perform the intended tasks in all tools + catch { + define_attribute \ + -category compatibility \ + -data_type string \ + -obj_type root \ + -default_value "" \ + -help_string "Require all commands executed in the session to be echo'ed to the log." \ + source_verbose + } + + catch { + define_attribute \ + -category compatibility \ + -data_type boolean \ + -obj_type root \ + -default_value true \ + -help_string "do not echo CCL warning messages" \ + ccl_display_warnings + } + } + + if {![llength [info commands ::define_attribute]]} { + namespace import $::ns(compat)::define_attribute + } + + if {![llength [info commands ::set_attribute]]} { + namespace import $::ns(compat)::set_attribute + } + + if {![llength [info commands ::get_attribute]]} { + namespace import $::ns(compat)::get_attribute + } + + if {![llength [info commands ::dispatch_subcommand]]} { + namespace import $::ns(compat)::dispatch_subcommand + } + + if {![llength [info commands ::redirect]]} { + namespace import $::ns(redirect)::redirect + } + + if {![llength [info commands ::assert]]} { + namespace import $::ns(regress)::assert + } + + if {![llength [info commands ::regress]]} { + namespace import $::ns(regress)::regress + } + + if {![llength [info commands ::add_command_help]]} { + namespace import $::ns(compat)::add_command_help + } + + if {![llength [info commands ::calling_proc]]} { + namespace import $::ns(compat)::calling_proc + add_command_help calling_proc "Enable porting of RC ae-ware scripts" + } + + if {[llength [info commands $::ns(compat)::parse_options]]} { + if {![llength [info commands ::parse_options]]} { + namespace import $::ns(parse_opt)::parse_options + add_command_help parse_options "Enable porting of RC ae-ware scripts" + } + } + + add_command_help $::ns(compat)::define_attribute "Enable porting of RC ae-ware scripts" + add_command_help $::ns(compat)::get_attribute "Enable porting of RC ae-ware scripts" + add_command_help $::ns(redirect)::redirect "redirects stdout to a file or variable temporarily" + + regexp {\d+(\.\d+)+} {Revision: 1.35} pkgRev + package provide compatibility $pkgRev +} + +# parse_options bla {} "-a dd -b -c ff st1 st2" "-a srs a opt" aopt "-b bos b bool" bopt "-c srs c option" copt "srs unflagged 1" u1 "srs unflagged 2" u2 +# parse_options bla {} "-a dd" "-a srs a opt" aopt +# parse_options bla {} "-b" "-b bos b bool" bopt +# parse_options bla {} "st1" "srs unflagged 1" u1 +# parse_options bla {} "4 -fii" "nos unflagged 1" u1 +# parse_options test {} "-help" "-c srs cat" copt "-set_function sos sfunc" sopt +# parse_options test {} "-he" "-helper bos dummy" hbool +# parse_options bla {} {-c dskj -d jdskla -help_string "dsd djskal"} "-c srs cat" copt "-d srs dtype" dopt "-help_string sos hstring" hopt +# parse_options bla {} {-c dskj -d jdskla -help_string "dsd djskal"} "-c_1 srs cat" copt "-d_1 srs dtype" dopt "-help_string sos hstring" hopt +# parse_options bla {} {-c dskj } "-c_1 srs cat" copt +# parse_options bla {} "fieldInfo emac" "srm opt" aopt +# define_attribute -obj obj -data data -cat cat -def def -comp comp -help_s help bla + +#=========================================================================== +# +# Copyright 1997-2013 Cadence Design Systems, Inc. All rights reserved worldwide. +# +# The Tcl computer program and related information (collectively "Licensed Material") +# contained herein are protected by copyright law and international treaties. +# +# Cadence grants Recipient of the Licensed Material a nonexclusive right +# to use, copy, and modify the Licensed Material. Should Recipient +# desire to distribute any portion of the Licensed Material, Recipient +# must obtain Cadence's permission. In no event shall Recipient use the +# Licensed Material for benchmarking purposes against Cadence's products. +# +# The Licensed Material is provided to Recipient to use at Recipient's +# own risk. The Licensed Material may not be compatible with current or +# future versions of Cadence products, and Cadence will not provide any +# technical support for the Licensed Material, whether modified or not +# by the Recipient. THE LICENSED MATERIAL IS PROVIDED "AS IS" AND WITH +# NO WARRANTIES, INCLUDING WITHOUT LIMITATION ANY EXPRESS WARRANTIES OR +# IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. +# +# IN NO EVENT SHALL CADENCE BE LIABLE TO RECIPIENT OR ANY THIRD PARTY +# FOR ANY INCIDENTAL, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, OR ANY +# OTHER DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR +# LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS +# INFORMATION, OR OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OR +# INABILITY TO USE LICENSED MATERIAL, WHETHER OR NOT THE POSSIBILITY OR +# CAUSE OF SUCH DAMAGES WAS KNOWN TO CADENCE. +# +# Cadence Design Systems, Inc. +# 2655 Seely Avenue +# San Jose, CA 95134 +# +#=========================================================================== + + diff --git a/sky130_cds/pnr/buildinfra/bin/gen_manifest.tcl b/sky130_cds/pnr/buildinfra/bin/gen_manifest.tcl new file mode 100755 index 000000000..447c76cf6 --- /dev/null +++ b/sky130_cds/pnr/buildinfra/bin/gen_manifest.tcl @@ -0,0 +1,147 @@ +#!/usr/bin/tclsh + +set msgPrefix "[file tail $argv0]" + +proc flatten_list list {string map {\{ "" \} ""} $list} + +proc putsFile {file} { + set INP [open $file r] + while {[gets $INP line] != -1} { + puts $line + } + close $INP +} + +# Load Cadence Compatibility Layer when not in RTL Compiler +set isRTLCompiler [expr {[llength [info commands set_remove_assign_options]] && + [llength [info commands get_attribute]] && + [string equal [get_attribute program_short_name /] "rc"]}] + +if {!${isRTLCompiler}} { + if {[catch {package require compatibility} errMsg]} { + if {[file exists buildinfra/bin/compatibility.tcl]} { + source "buildinfra/bin/compatibility.tcl" + } else { + puts "Error: compatibility.tcl not found! \'compatibility.tcl\' is searched as follows:" + puts "\t1) based on existence and contents of pkgIndex.tcl" + puts "\t2) based on existence and contents of INFRA environment variable" + puts "\t3) based on existence of compatibility.tcl in ../buildinfra/" + return -code error + } + } +} + +if {![info exists ::ns(compat)]} { set ::ns(compat) "::aeware" } + +# Default for cvs +set bomFile "BOM.txt" +set cvsStatusFile "" +set flowInfoFile "" +set appInfoFile "" +set bomVersion "" +set cvsRootDir "" + +# Parse options (from compatibility layer) +switch -- [parse_options $msgPrefix {} $argv \ + "-cvs_status_file sos specifies the name of the cvs status file to analyze" cvsStatusFile \ + "-cvs_rpt_root_dir sos the root directory to use for manifest generation of cvs status reports" cvsRootDir \ + "-bom_file sos specifies the name of the BOM (manifest) file to write" bomFile \ + "-flow_info sos specifies a flow info file to use (and includes flow version info in the generated BOM)" flowInfoFile \ + "-app_info sos specifies an applet info file to use (and includes applet version info in the generated BOM)" appInfoFile \ + "-bom_version sos specifies a version to use for the BOM itself (i.e., a top level version)" bomVersion \ + "-debug bOs enable debug message output" debug ] { + -2 { return } + 0 { return -code error } +} + +file delete -force $bomFile +set OSTREAM [open $bomFile "w"] +puts $OSTREAM "#################################################################" +puts $OSTREAM "# Foundation Flow RTL->GDSII Implementation System" +puts $OSTREAM "# Copyright (c) 1997-[clock format [clock seconds] -format %Y] Cadence Design Systems, Inc. All Rights Reserved." +puts $OSTREAM "# Version : $bomVersion" +puts $OSTREAM "# Summary : Foundation Flow Kit Manifest" +puts $OSTREAM "# Description : List of kit contents. This includes" +puts $OSTREAM "# RC and EDI code generation packages, applets," +puts $OSTREAM "# flows, and/or component scripts." +puts $OSTREAM "# Created on : [exec date]" +puts $OSTREAM "#################################################################" +puts $OSTREAM "# Top level release content and versions:" +puts $OSTREAM "# EDIFF: $bomVersion" + +# +# Only print RCFF if flowInfo was provided +# (The presence of applets does not necessarily imply the presence of the RC Foundation Flow) +# +if {$flowInfoFile ne ""} { + puts $OSTREAM "\n# RCFF:" +} + +# +# Load/Print flow version info if $flowInfoFile provided +# +if {$flowInfoFile ne ""} { + puts $OSTREAM "# Flows:" + source $flowInfoFile + set flowsTmpList [array names flowInfo -regexp {,version}] + foreach flow $flowsTmpList { + regsub -all {::flows::(.*),version} $flow {\1} flow + lappend flowsList $flow + } + foreach flow [lsort -dictionary $flowsList] { + if {[info exists flowInfo(::flows::$flow,version)]} { + puts $OSTREAM "[format "# %-*s %-*s" 40 ${flow}: 20 $flowInfo(::flows::$flow,version)]" + } + } +} + +# +# Load/Print applet version info if $flowInfoFile provided +# +if {$appInfoFile ne ""} { + puts $OSTREAM "# Applets:" + catch {source $appInfoFile} + set appletsTmpList [array names appInfo -regexp {,version}] + foreach applet $appletsTmpList { + regsub -all {::applet::(.*),version} $applet {\1} applet + lappend appletsList $applet + } + foreach applet [lsort -dictionary $appletsList] { + if {[info exists appInfo(::applet::$applet,version)]} { + puts $OSTREAM "[format "# %-*s %-*s" 40 ${applet}: 20 $appInfo(::applet::$applet,version) ]" + } + } +} +# +# Analyze cvs status file and print versions if it was provided +# +if {$cvsStatusFile ne ""} { + set filelist "" + puts $OSTREAM "\n# Version Info For Component Scripts (For internal use only):" + puts $OSTREAM "# -----------------------------------------------------------------------+---------" + puts $OSTREAM "# File Name | Version " + puts $OSTREAM "# -----------------------------------------------------------------------+---------" + set IS [open $cvsStatusFile "r"] + array set lineArr "" + set lineno 1 + while {![eof $IS]} { + gets $IS lineArr($lineno) + if {[regexp {Repository revision:\s+(\S+)\s+(\S+),v$} $lineArr($lineno) full version fullFilePath]} { + set re ".*$cvsRootDir/(.*)\$" + if {$cvsRootDir ne "" && ![regexp $re $fullFilePath full File]} { + set File $fullFilePath + } + lappend filelist $File + set ${File}(version) $version + } + incr lineno + } + close $IS + + foreach File [lsort -dictionary $filelist] { + puts $OSTREAM [format "# %-*s | %-*s" 70 $File 8 [set ${File}(version)]] + } +} +puts $OSTREAM "#" +puts $OSTREAM "# END MANIFEST" +close $OSTREAM diff --git a/sky130_cds/pnr/commands.tcl b/sky130_cds/pnr/commands.tcl new file mode 100755 index 000000000..6895119d2 --- /dev/null +++ b/sky130_cds/pnr/commands.tcl @@ -0,0 +1,6 @@ +globalNetConnect VSS -type pgpin -pin gnd -inst * +globalNetConnect VDD -type pgpin -pin vdd -inst * +setAddRingMode -ring_target core_ring -extend_over_row 0 -ignore_rows 0 -avoid_short 0 -skip_crossing_trunks none -stacked_via_top_layer metal3 -stacked_via_bottom_layer metal1 -via_using_exact_crossover_size 1 -orthogonal_only true -skip_via_on_pin { standardcell } -skip_via_on_wire_shape { noshape } +addRing -nets {VDD VSS} -type core_rings -follow io -layer {top metal1 bottom metal1 left metal2 right metal2} -width {top 3.6 bottom 3.6 left 3.6 right 3.6} -spacing {top 1.8 bottom 1.8 left 1.8 right 1.8} -offset {top 1.8 bottom 1.8 left 1.8 right 1.8} -center 0 -extend_corner {} -threshold 0 -jog_distance 0 -snap_wire_center_to_grid None +setSrouteMode -viaConnectToShape { padring ring stripe blockring blockpin noshape blockwire corewire followpin iowire noshape } +sroute -connect { blockPin padPin padRing corePin floatingStripe } -layerChangeRange { metal1(1) metal3(3) } -blockPinTarget { nearestTarget } -padPinPortConnect { allPort oneGeom } -padPinTarget { nearestTarget } -corePinTarget { firstAfterRowEnd } -floatingStripeTarget { blockring padring ring stripe ringpin blockpin followpin } -allowJogging 1 -crossoverViaLayerRange { metal1(1) metal3(3) } -nets { VDD VSS } -allowLayerChange 1 -blockPin useLef -targetViaLayerRange { metal1(1) metal3(3) } diff --git a/sky130_cds/pnr/encounter.io b/sky130_cds/pnr/encounter.io new file mode 100755 index 000000000..4e8eefa93 --- /dev/null +++ b/sky130_cds/pnr/encounter.io @@ -0,0 +1,107 @@ +# This file specifies how the pads are placed +# The name of each pad here has to match the +# name in the verilog code +# The Mosis padframe has 4 corners and 40 pads + +# The four corners (PADFC) + +Orient: R0 +Pad: c01 NW +Orient: R270 +Pad: c02 NE +Orient: R180 +Pad: c03 SE +Orient: R90 +Pad: c04 SW + +# 10 Pads on the North-Side (top side) + +Orient: R0 +Pad: p39 N +Orient: R0 +Pad: p38 N +Orient: R0 +Pad: p37 N +Orient: R0 +Pad: p36 N +Orient: R0 +Pad: p35 N +Orient: R0 +Pad: p34 N +Orient: R0 +Pad: p33 N +Orient: R0 +Pad: p32 N +Orient: R0 +Pad: p31 N +Orient: R0 +Pad: p30 N + +# 10 Pads on the West-Side (left side) + +Orient: R90 +Pad: p29 W +Orient: R90 +Pad: p28 W +Orient: R90 +Pad: p27 W +Orient: R90 +Pad: p26 W +Orient: R90 +Pad: p25 W +Orient: R90 +Pad: p24 W +Orient: R90 +Pad: p23 W +Orient: R90 +Pad: p22 W +Orient: R90 +Pad: p21 W +Orient: R90 +Pad: p20 W + +# 10 Pads on the South-Side (bottom side) + +Orient: R180 +Pad: p19 S +Orient: R180 +Pad: p18 S +Orient: R180 +Pad: p17 S +Orient: R180 +Pad: p16 S +Orient: R180 +Pad: p15 S +Orient: R180 +Pad: p14 S +Orient: R180 +Pad: p13 S +Orient: R180 +Pad: p12 S +Orient: R180 +Pad: p11 S +Orient: R180 +Pad: p10 S + +# 10 Pads on the East-Side (right side) + +Orient: R270 +Pad: p09 E +Orient: R270 +Pad: p08 E +Orient: R270 +Pad: p07 E +Orient: R270 +Pad: p06 E +Orient: R270 +Pad: p05 E +Orient: R270 +Pad: p04 E +Orient: R270 +Pad: p03 E +Orient: R270 +Pad: p02 E +Orient: R270 +Pad: p01 E +Orient: R270 +Pad: p00 E diff --git a/sky130_cds/pnr/innovus_config.tcl b/sky130_cds/pnr/innovus_config.tcl new file mode 100755 index 000000000..73a53f70c --- /dev/null +++ b/sky130_cds/pnr/innovus_config.tcl @@ -0,0 +1,106 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE # +# September 2008 Cadence Design Systems, Inc. All rights reserved. # +# # +# This script is AEWare, provided as an example of how to perform specialized # +# tasks within SoC Encounter. It is not supported via the Cadence Hotline # +# nor the CCR system. # +# # +# This work may not be copied, re-published, uploaded, or distributed in any # +# way, in any medium, whether in whole or in part, without prior written # +# permission from Cadence. # +# # +# This work is Cadence intellectual property and may under no circumstances # +# be given to third parties, neither in original nor in modified versions, # +# without explicit written permission from Cadence # +# # +# The information contained herein is the proprietary and confidential # +# information of Cadence or its licensors, and is supplied subject to, and # +# may be used only by Cadence's customers in accordance with, a previously # +# executed license and maintenance agreement between Cadence and its # +# customer. # +############################################################################### + +global vars + +############################################################################### +# Optinally define output directories for databases and reports +############################################################################### + +# Design for Combinational PNR (uncomment if needed) +# set vars(steps) [list "init" "place" "route" "postroute" "signoff"] +# Design for Combinational+Sequential PNR (uncomment if needed) +set vars(steps) [list "init" "place" "cts" "postcts_hold" "route" "postroute" "signoff"] + +set vars(dbs_dir) DBS +set vars(rpt_dir) RPT + +############################################################################### +# Enable this variable if you want to abort when there are setup +# errors ... leave 0 to continue on error +############################################################################### +set vars(abort) 0 + +#set vars(mail,to) "james.stine@okstate.edu" + +#set vars(dbs_format) oa +set vars(enable_pac) true +set vars(tdsp_core,pac_mode) all +set vars(signoff_extraction_effort) medium +set vars(enable_ocv) false +set vars(enable_cppr) false +set vars(enable_ss) false +set vars(litho_driven_routing) false +#set vars(dont_use_list) "*CLK*" +set vars(tie_cells) "sky130_osu_sc_18T_ms__tiehi sky130_osu_sc_18T_ms__tielo" +set vars(filler_cells) "sky130_osu_sc_18T_ms__fill_1 sky130_osu_sc_18T_ms__fill_2 sky130_osu_sc_18T_ms__fill_4 sky130_osu_sc_18T_ms__fill_8 sky130_osu_sc_18T_ms__fill_16" +set vars(cts_inverter_cells) "sky130_osu_sc_18T_ms__inv_l sky130_osu_sc_18T_ms__inv_1 sky130_osu_sc_18T_ms__inv_2 sky130_osu_sc_18T_ms__inv_3 sky130_osu_sc_18T_ms__inv_4" +#set vars(cts_buffer_cells) "CLKBUFX1" +#set vars(delay_cells) "DLY1 DLY2 DLY3 DLY4" +set vars(place_io_pins) true + + +############################################################################### +# The following plugins are supported when needed ... +############################################################################### +#set vars(always_source_tcl) PLUG/INNOVUS/always_source.tcl +set vars(pre_init_tcl) PLUG/INNOVUS/pre_init.tcl +set vars(post_init_tcl) PLUG/INNOVUS/post_init.tcl +set vars(pre_place_tcl) PLUG/INNOVUS/pre_place.tcl +#set vars(place_tcl) PLUG/INNOVUS/place.tcl +#set vars(post_place_tcl) PLUG/INNOVUS/post_place.tcl +#set vars(pre_prects_tcl) PLUG/INNOVUS/pre_prects.tcl +#set vars(post_prects_tcl) PLUG/INNOVUS/post_prects.tcl +set vars(pre_cts_tcl) PLUG/INNOVUS/pre_cts.tcl +#set vars(cts_tcl) PLUG/INNOVUS/cts.tcl +set vars(post_cts_tcl) PLUG/INNOVUS/post_cts.tcl +#set vars(pre_postcts_tcl) PLUG/INNOVUS/pre_postcts.tcl +#set vars(post_postcts_tcl) PLUG/INNOVUS/post_postcts.tcl +#set vars(pre_route_tcl) PLUG/INNOVUS/pre_route.tcl +#set vars(post_route_tcl) PLUG/INNOVUS/post_route.tcl +#set vars(pre_postcts_hold_tcl) PLUG/INNOVUS/pre_postcts_hold.tcl +#set vars(post_postcts_hold_tcl) PLUG/INNOVUS/post_postcts_hold.tcl +#set vars(pre_postroute_tcl) PLUG/INNOVUS/pre_postroute.tcl +#set vars(post_postroute_tcl) PLUG/INNOVUS/post_postroute.tcl +#set vars(pre_postroute_hold_tcl) PLUG/INNOVUS/pre_postroute_hold.tcl +#set vars(post_postroute_hold_tcl) PLUG/INNOVUS/post_postroute_hold.tcl +#set vars(pre_postroute_si_tcl) PLUG/INNOVUS/pre_postroute_si.tcl +#set vars(post_postroute_si_tcl) PLUG/INNOVUS/post_postroute_si.tcl +#set vars(pre_postroute_si_hold_tcl) PLUG/INNOVUS/pre_postroute_si_hold.tcl +#set vars(post_postroute_si_hold_tcl) PLUG/INNOVUS/post_postroute_si_hold.tcl +#set vars(pre_signoff_tcl) PLUG/INNOVUS/pre_signoff.tcl +set vars(post_signoff_tcl) PLUG/INNOVUS/post_signoff.tcl +#set vars(pre_assemble_tcl) PLUG/INNOVUS/pre_assemble.tcl +#set vars(post_assemble_tcl) PLUG/INNOVUS/post_assemble.tcl +#set vars(pre_pac_tcl) PLUG/INNOVUS/pre_pac.tcl +#set vars(post_pac_tcl) PLUG/INNOVUS/post_pac.tcl + +####################################################################### +# To insert metal fill during the flow define the following two +# variables: +# - vars(metalfill) [pre_postroute, pre_postroute_si, pre_signoff] +# - vars(metalfill_tcl) +####################################################################### +#set vars(metalfill) pre_postroute_si +#set vars(metalfill_tcl) PLUG/INNOVUS/metal_fill.tcl +####################################################################### diff --git a/sky130_cds/pnr/mult_seq.gds b/sky130_cds/pnr/mult_seq.gds new file mode 100755 index 000000000..6d6263a97 Binary files /dev/null and b/sky130_cds/pnr/mult_seq.gds differ diff --git a/sky130_cds/pnr/mult_seq.pegasus.ascii b/sky130_cds/pnr/mult_seq.pegasus.ascii new file mode 100755 index 000000000..ab7178ca3 --- /dev/null +++ b/sky130_cds/pnr/mult_seq.pegasus.ascii @@ -0,0 +1,105 @@ +mult_seq 1000 +R0_nwell_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"nwell_X1: off 0.005 grid nwell vertex" +R1_diff_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"diff_X1: off 0.005 grid diff vertex" +R2_poly_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"poly_X1: off 0.005 grid poly vertex" +R3_li1_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"li1_X1: off 0.005 grid li1 vertex" +R4_mcon_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"mcon_X1: off 0.005 grid mcon vertex" +R5_met1_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"met1_X1: off 0.005 grid met1 vertex" +R6_via_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"via_X1: off 0.005 grid via vertex" +R7_met2_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"met2_X1: off 0.005 grid met2 vertex" +R8_via2_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"via2_X1: off 0.005 grid via2 vertex" +R9_met3_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"met3_X1: off 0.005 grid met3 vertex" +R10_via3_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"via3_X1: off 0.005 grid via3 vertex" +R11_met4_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"met4_X1: off 0.005 grid met4 vertex" +R12_via4_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"via4_X1: off 0.005 grid via4 vertex" +R13_met5_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"met5_X1: off 0.005 grid met5 vertex" +R14_pad_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"pad_X1: off 0.005 grid pad vertex" +R15_cap_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"cap_X1: off 0.005 grid capacitor vertex" +R16_ind_X1 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"ind_X1: off 0.005 grid inductor vertex" +R17_nwell_X2 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"nwell_X2: non-octagonal nwell edge" +R18_diff_X2 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"diff_X2: non-octagonal diff edge" +R19_met1_X2 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"met1_X2: non-octagonal met1 edge" +R20_met2_X2 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"met2_X2: non-octagonal met2 edge" +R21_met3_X2 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"met3_X2: non-octagonal met3 edge" +R22_met4_X2 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"met4_X2: non-octagonal met4 edge" +R23_met5_X2 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"met5_X2: non-octagonal met5 edge" +R24_cap_X2 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"cap_X2: non-octagonal capacitor edge" +R25_ind_X2 +0 0 2 Aug 3 11:44:14 2022 +Rule File Pathname: /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +"ind_X2: non-octagonal inductor edge" diff --git a/sky130_cds/pnr/mult_seq.pegasus.sum b/sky130_cds/pnr/mult_seq.pegasus.sum new file mode 100755 index 000000000..9b7bb0b7b --- /dev/null +++ b/sky130_cds/pnr/mult_seq.pegasus.sum @@ -0,0 +1,86 @@ +******************************************************************************** +*** Pegasus DRC SUMMARY +*** +Execute on Date/Time : Wed Aug 3 11:44:13 2022 +Pegasus VERSION : 20.40-p018 Fri Mar 12 21:11:23 PST 2021 +Rule Deck Path : /home/jstine/Desktop/sky130_cds/pnr/sky130_drcRules.pvl +Rule Deck Title : +Layout System : GDSII +Layout Path : /home/jstine/Desktop/sky130_cds/pnr/.pegasus_82054/mult_seq.gds.gz +Current Directory : /home/jstine/Desktop/sky130_cds/pnr/.pegasus_82054 +User Name : jstine +Maximum Results : 1000 +Maximum Result Vertices : 4096 +Layout Depth : ALL +Text Depth : 0 +Summary File : /home/jstine/Desktop/sky130_cds/pnr/mult_seq.pegasus.sum +Geometry Flagging : ACUTE = NO ANGLED = NO SKEW = NO OFFGRID = NO + NONSIMPLE POLYGON = NO NONSIMPLE PATH = NO +Keep Empty Checks : YES +Excluded Cells : +Layout Primary Cell : mult_seq +ASCII DRC Error Report : /home/jstine/Desktop/sky130_cds/pnr/mult_seq.pegasus.ascii +DRC Results Database : +-------------------------------------------------------------------------------- +--- RUNNING TIME WARNINGS +--- +-------------------------------------------------------------------------------- +--- ORIGINAL LAYER STATISTICS +--- +LAYER nwell ................................ Total Original Geometry: 25 ( 315) +LAYER diff ................................. Total Original Geometry: 48 ( 359) +LAYER poly ................................. Total Original Geometry: 299 ( 2602) +LAYER li1 .................................. Total Original Geometry: 376 ( 3369) +LAYER mcon ................................. Total Original Geometry: 218 ( 1865) +LAYER met1 ................................. Total Original Geometry: 986 ( 3843) +LAYER via .................................. Total Original Geometry: 0 ( 0) +LAYER met2 ................................. Total Original Geometry: 700 ( 1221) +LAYER via2 ................................. Total Original Geometry: 2 ( 105) +LAYER met3 ................................. Total Original Geometry: 129 ( 248) +LAYER via3 ................................. Total Original Geometry: 1 ( 17) +LAYER met4 ................................. Total Original Geometry: 21 ( 42) +LAYER via4 ................................. Total Original Geometry: 1 ( 6) +LAYER met5 ................................. Total Original Geometry: 4 ( 9) +LAYER pad .................................. Total Original Geometry: 0 ( 0) +LAYER capacitor ............................ Total Original Geometry: 0 ( 0) +LAYER inductor ............................. Total Original Geometry: 0 ( 0) +-------------------------------------------------------------------------------- +--- WARNINGS FROM FLAG STATEMENT +--- +-------------------------------------------------------------------------------- +--- RULECHECK RESULTS STATISTICS +--- +RULECHECK R0_nwell_X1 .................................. Total Result 0 ( 0) +RULECHECK R10_via3_X1 .................................. Total Result 0 ( 0) +RULECHECK R11_met4_X1 .................................. Total Result 0 ( 0) +RULECHECK R12_via4_X1 .................................. Total Result 0 ( 0) +RULECHECK R13_met5_X1 .................................. Total Result 0 ( 0) +RULECHECK R14_pad_X1 ................................... Total Result 0 ( 0) +RULECHECK R15_cap_X1 ................................... Total Result 0 ( 0) +RULECHECK R16_ind_X1 ................................... Total Result 0 ( 0) +RULECHECK R17_nwell_X2 ................................. Total Result 0 ( 0) +RULECHECK R18_diff_X2 .................................. Total Result 0 ( 0) +RULECHECK R19_met1_X2 .................................. Total Result 0 ( 0) +RULECHECK R1_diff_X1 ................................... Total Result 0 ( 0) +RULECHECK R20_met2_X2 .................................. Total Result 0 ( 0) +RULECHECK R21_met3_X2 .................................. Total Result 0 ( 0) +RULECHECK R22_met4_X2 .................................. Total Result 0 ( 0) +RULECHECK R23_met5_X2 .................................. Total Result 0 ( 0) +RULECHECK R24_cap_X2 ................................... Total Result 0 ( 0) +RULECHECK R25_ind_X2 ................................... Total Result 0 ( 0) +RULECHECK R2_poly_X1 ................................... Total Result 0 ( 0) +RULECHECK R3_li1_X1 .................................... Total Result 0 ( 0) +RULECHECK R4_mcon_X1 ................................... Total Result 0 ( 0) +RULECHECK R5_met1_X1 ................................... Total Result 0 ( 0) +RULECHECK R6_via_X1 .................................... Total Result 0 ( 0) +RULECHECK R7_met2_X1 ................................... Total Result 0 ( 0) +RULECHECK R8_via2_X1 ................................... Total Result 0 ( 0) +RULECHECK R9_met3_X1 ................................... Total Result 0 ( 0) +-------------------------------------------------------------------------------- +--- SUMMARY +--- +Total CPU Time : 1(s) +Total Real Time : 2(s) +Total Original Geometry : 2810 (14001) +Total DRC RuleChecks : 26 +Total DRC Results : 0 (0) diff --git a/sky130_cds/pnr/qrcTechFile b/sky130_cds/pnr/qrcTechFile new file mode 100755 index 000000000..e289c08c4 Binary files /dev/null and b/sky130_cds/pnr/qrcTechFile differ diff --git a/sky130_cds/pnr/rc_model.bin b/sky130_cds/pnr/rc_model.bin new file mode 100755 index 000000000..9815c0aeb Binary files /dev/null and b/sky130_cds/pnr/rc_model.bin differ diff --git a/sky130_cds/pnr/rc_typ.spef.gz b/sky130_cds/pnr/rc_typ.spef.gz new file mode 100755 index 000000000..08ebf3303 Binary files /dev/null and b/sky130_cds/pnr/rc_typ.spef.gz differ diff --git a/sky130_cds/pnr/setup.tcl b/sky130_cds/pnr/setup.tcl new file mode 100755 index 000000000..a4b97848b --- /dev/null +++ b/sky130_cds/pnr/setup.tcl @@ -0,0 +1,263 @@ +############################################################################### +# CADENCE COPYRIGHT NOTICE +# © 2008-2013 Cadence Design Systems, Inc. All rights reserved. +#------------------------------------------------------------------------------ +# +# This Foundation Flow is provided as an example of how to perform specialized +# tasks. +# +# This work may not be copied, re-published, uploaded, or distributed in any way, +# in any medium, whether in whole or in part, without prior written permission +# from Cadence. Notwithstanding any restrictions herein, subject to compliance +# with the terms and conditions of the Cadence software license agreement under +# which this material was provided, this material may be copied and internally +# distributed solely for internal purposes for use with Cadence tools. +# +# This work is Cadence intellectual property and may under no circumstances be +# given to third parties, neither in original nor in modified versions, without +# explicit written permission from Cadence. The information contained herein is +# the proprietary and confidential information of Cadence or its licensors, and +# is supplied subject to, and may be used only by Cadence's current customers +# in accordance with, a previously executed license agreement between Cadence +# and its customer. +# +#------------------------------------------------------------------------------ +# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL +# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +############################################################################### + +global vars + +############################################################################### +# Define some variables to point to data, libraries, and scripts +############################################################################### +set vars(design_root) [pwd]/../.. +set vars(data_root) "../synth/" +set vars(library_root) "../sky130_osu_sc_t18/18T_ms/" +set vars(script_root) [pwd]/SCRIPTS +#set init_io_file encounter.io + +############################################################################### +# The following variables define the design data +# -------------------------------------------------------------------- +# vars(design) REQUIRED +# vars(netlist) REQUIRED +# vars(cts_spec) REQUIRED +# -------------------------------------------------------------------- +# Either fp_file, def_files or both MUST be defined +# -------------------------------------------------------------------- +# vars(fp_file) +# vars(fp_file) +# vars(def_files) +# -------------------------------------------------------------------- +set vars(design) "mult_seq" +set vars(netlist) "$vars(data_root)/mult_seq.vh" +#set vars(fp_file) $vars(data_root)/dtmf_recvr_core.fp +#set vars(cts_spec) "$vars(data_root)/dtmf_recvr_core.ctstch" +#set vars(def_files) "$vars(data_root)/dtmf_recvr_core.scan.def.gz" +# -------------------------------------------------------------------- +# vars(cpf_file) +# -------------------------------------------------------------------- +#set vars(cpf_file) $vars(data_root)/dtmf_recvr_core.cpf + +############################################################################### +# The following are for the ILM based hierarchical flow +# vars(partition_list) ... REQUIRED +# vars(,cts_spec) +# vars(,latency_sdc) +# vars(,incr_cts_sdc) OPTIONAL +# vars(,post_cts_sdc) OPTIONAL +############################################################################### +#set vars(partition_list) "tdsp_core results_conv" +#set vars(dtmf_recvr_core,cts_spec) $vars(data_root)/dtmf_recvr_core.ctstch +#set vars(dtmf_recvr_core,latency_sdc) $vars(data_root)/dtmf_recvr_core.latency.sdc +#set vars(tdsp_core,cts_spec) $vars(data_root)/tdsp_core.ctstch +#set vars(tdsp_core,setup_func,latency_sdc) $vars(data_root)/tdsp_core.latency.sdc +#set vars(results_conv,cts_spec) $vars(data_root)/results_conv.ctstch +#set vars(results_conv,latency_sdc) $vars(data_root)/results_conv.latency.sdc + +############################################################################### +# The following are REQUIRED +# -------------------------------------------------------------------- +# vars(process) (65nm, 90nm, e.g.) +# vars(max_route_layers) +############################################################################### +set vars(process) 130nm +set vars(max_route_layer) 5 + +############################################################################### +# Define library sets ... +# -------------------------------------- +# set vars(library_sets) " ..." +# set vars(,timing) (REQUIRED) +# set vars(,si) (OPTIONAL) +############################################################################### +set vars(library_sets) "libs_tt" +set vars(libs_tt,timing) "../sky130_osu_sc_t18/18T_ms/lib/sky130_osu_sc_18T_ms_TT_1P8_25C.ccs.lib" +set vars(lef_files) "../sky130_osu_sc_t18/sky130_osu_sc_18T.tlef \ + ../sky130_osu_sc_t18/18T_ms/lef/sky130_osu_sc_18T_ms.lef " + +############################################################################### +# Define rc corners ... +# -------------------------------------- +# set vars(rc_corners) " ..." +# set vars(,T) +# set vars(,cap_table) +############################################################################### +# Optionally define QRC technology information +# -------------------------------------- +# set vars(,qx_tech_file) +# set vars(,qx_lib_file) +# set vars(,qx_conf_file) +############################################################################### +set vars(rc_corners) "rc_typ" +set vars(rc_typ,T) 25 +set vars(rc_typ,qx_tech_file) "./qrcTechFile" +#set vars(rc_max,cap_table) $vars(design_root)/LIBS/N45/capTbl/cln45lp_edram_1p08m_cworst.capTbl +#set vars(rc_min,cap_table) $vars(design_root)/LIBS/N45/capTbl/cln45lp_edram_1p08m_cbest.capTbl +#set vars(rc_max,qx_tech_file) $vars(design_root)/LIBS/N45/qrc/cln45lp_edram_1p08m_cworst/icecaps.tch +#set vars(rc_min,qx_tech_file) $vars(design_root)/LIBS/N45/qrc/cln45lp_edram_1p08m_cbest/icecaps.tch +#set vars(qx_layer_map_file) $vars(design_root)/LIBS/N45/qrc/layer.map +#set vars(signoff_extraction_engine) qrc + +############################################################################### +# Scale factors are also optional but are strongly encouraged for +# obtaining the best flow convergence and QoR. +# Scaling factors are applied per rc corner +# -------------------------------------------------------------------- +# set vars(,def_res_factor) +# set vars(,def_clk_res_factor) +# set vars(,det_res_factor) +# set vars(,det_clk_res_factor) +# set vars(,def_cap_factor) +# set vars(,def_clk_cap_factor) +# set vars(,det_cap_factor) +# set vars(,det_clk_cap_factor) +# set vars(,xcap_factor) +############################################################################### +set vars(rc_max,def_res_factor) 1.00 +set vars(rc_max,def_clk_res_factor) 1.00 +set vars(rc_max,det_res_factor) 1.00 +set vars(rc_max,det_clk_res_factor) 1.00 +set vars(rc_max,def_cap_factor) 1.09 +set vars(rc_max,def_clk_cap_factor) 1.00 +set vars(rc_max,det_cap_factor) 1.00 +set vars(rc_max,det_clk_cap_factor) 1.00 +set vars(rc_max,xcap_factor) 1.00 + +set vars(rc_min,def_res_factor) 1.00 +set vars(rc_min,det_res_factor) 1.00 +set vars(rc_min,def_cap_factor) 1.00 +set vars(rc_min,det_cap_factor) 1.00 +set vars(rc_min,xcap_factor) 1.00 + +############################################################################### +# Define operating conditions (optional) +# -------------------------------------------------------------------- +# set vars(opconds) " ..." +# set vars(,library_file) +# set vars(,process) +# set vars(,voltage) +# set vars(,temperature) +############################################################################### + +############################################################################### +# Define delay corners ... +# -------------------------------------------------------------------- +# set vars(delay_corners) " ..." +# set vars(,library_set) (previously defined) +# set vars(,opcond) (previously defined) (optional) +# set vars(,rc_corner) (previously defined) +############################################################################### +set vars(delay_corners) "corner_tt" +set vars(corner_tt,library_set) libs_tt +set vars(corner_tt,rc_corner) rc_typ + +############################################################################### +# Define constraints modes ... +# -------------------------------------------------------------------- +# set vars(constraint_modes) " ..." +# set vars(,pre_cts_sdc)
+# set vars(,post_cts_sdc)        (optional)
+###############################################################################
+
+set vars(constraint_modes) "setup_func_mode"
+set vars(setup_func_mode,pre_cts_sdc) "$vars(data_root)/mult_seq.sdc"
+
+#set vars(constraint_modes)             "setup_func_mode hold_func_mode"
+#set vars(setup_func_mode,pre_cts_sdc)  "$vars(data_root)/dtmf_recvr_core.sdc $vars(data_root)/prects.sdc"
+#set vars(setup_func_mode,post_cts_sdc) "$vars(data_root)/dtmf_recvr_core.sdc $vars(data_root)/postcts.sdc"
+#set vars(setup_func_mode,incr_cts_sdc)  $vars(data_root)/postcts.sdc
+
+#set vars(hold_func_mode,pre_cts_sdc)    $vars(setup_func_mode,pre_cts_sdc)
+#set vars(hold_func_mode,post_cts_sdc)   $vars(setup_func_mode,post_cts_sdc)
+
+###############################################################################
+# Define analysis views ...
+# --------------------------------------------------------------------
+# set vars(setup_analysis_views)    " "
+# set vars(hold_analysis_views)     " "
+# set vars(,delay_corner)     
+# set vars(,constraint_mode)  
+###############################################################################
+set vars(hold_analysis_views) "setup_func"
+set vars(setup_analysis_views) "hold_func"
+set vars(hold_func,delay_corner) corner_tt
+set vars(hold_func,constraint_mode) setup_func_mode
+set vars(setup_func,delay_corner) corner_tt
+set vars(setup_func,constraint_mode) setup_func_mode
+
+###############################################################################
+# Define active setup and hold views and denote which are default
+###############################################################################
+set vars(default_setup_view) "setup_func"
+set vars(default_hold_view)  "hold_func"
+set vars(active_setup_views) "setup_func"
+set vars(active_hold_views)  "hold_func"
+
+###############################################################################
+# Define derating factors for OCV here (clock and data). 
+# Derating factors are applied per delay corner
+###############################################################################
+set vars(slow_max,data_cell_late)   1.00
+set vars(slow_max,data_cell_early)  1.00
+set vars(slow_max,data_net_late)    1.00
+set vars(slow_max,data_net_early)   1.00
+set vars(slow_max,clock_cell_late)  1.00
+set vars(slow_max,clock_cell_early) 1.00
+set vars(slow_max,clock_net_late)   1.00
+set vars(slow_max,clock_net_early)  1.00
+
+set vars(fast_min,data_cell_late)   1.00
+set vars(fast_min,data_cell_early)  1.00
+set vars(fast_min,data_net_late)    1.00
+set vars(fast_min,data_net_early)   1.00
+set vars(fast_min,clock_cell_late)  1.00
+set vars(fast_min,clock_cell_early) 1.00
+set vars(fast_min,clock_net_late)   1.00
+set vars(fast_min,clock_net_early)  1.00
+
+###############################################################################
+# Define power/ground nets
+###############################################################################
+set vars(power_nets) "VDD"
+set vars(ground_nets) "VSS"
+
+#######################################################################
+# Distribution setup
+# lsf, rsh, local, or custom
+#######################################################################
+#set vars(distribute)           custom
+#set vars(custom,script)        {/grid/sfi/farm/bin/gridsub -W 72:00 -P SOC7.1 \
+#                                -R "SFIARCH==OPT64 && OSREL==EE40" -q lnx64}
+#set vars(local_cpus)           2
+#set vars(remote_hosts)         4
+#set vars(cpu_per_remote_host)  2
+
+Puts " Finished loading setup.tcl"
diff --git a/sky130_cds/pnr/sky130.ict b/sky130_cds/pnr/sky130.ict
new file mode 100755
index 000000000..ebbb58858
--- /dev/null
+++ b/sky130_cds/pnr/sky130.ict
@@ -0,0 +1,371 @@
+
+# 
+process sky130 { 
+   background_dielectric_constant 1.0
+   temp_reference 30
+} 
+# Well declarations 
+well NWELL {} 
+well PWELL {} 
+ 
+# Diffusion Layers 
+diffusion P_SOURCE_DRAIN {
+   thickness    	 0.12 
+   resistivity  	 15 
+} 
+ 
+diffusion N_SOURCE_DRAIN {
+   thickness    	 0.12 
+   resistivity  	 15 
+} 
+ 
+# Conducting Layers 
+conductor Poly {
+   min_spacing  	 0.21 
+   min_width    	 0.15 
+   height       	 0.3262 
+   thickness    	 0.180 
+   resistivity  	 48.2 
+   temp_tc1     	 0.0008916 
+   temp_tc2     	 8.443e-07 
+   gate_forming_layer  	 true 
+   wire_edge_enlargement_r { 
+     wee_widths       0.15 
+     wee_spacings     0.21 
+     wee_adjustments -0.0280  
+  } 
+   wire_edge_enlargement_c { 
+     wee_widths       0.15 
+     wee_spacings     0.21 
+     wee_adjustments  0.0  
+  } 
+} 
+ 
+conductor li1 {
+   min_spacing  	 0.17 
+   min_width    	 0.17 
+   height       	 0.9361 
+   thickness    	 0.100 
+   resistivity  	 12.8 
+   temp_tc1     	 0.0006045 
+   temp_tc2     	 -3.693e-07 
+   gate_forming_layer  	 false 
+   wire_edge_enlargement_r { 
+     wee_widths      0.17 
+     wee_spacings    0.17 
+     wee_adjustments 0.0085  
+  } 
+   wire_edge_enlargement_c { 
+     wee_widths      0.17 
+     wee_spacings    0.17 
+     wee_adjustments 0  
+  } 
+} 
+ 
+conductor met1 {
+   min_spacing  	 0.14 
+   min_width    	 0.14 
+   height       	 1.3761 
+   thickness    	 0.36 
+   resistivity  	 0.125 
+   temp_tc1     	 0.003179 
+   temp_tc2     	 3.094e-07 
+   gate_forming_layer  	 false 
+   wire_edge_enlargement_r { 
+     wee_widths       0.14 
+     wee_spacings     0.14 
+     wee_adjustments -0.0195  
+  } 
+   wire_edge_enlargement_c { 
+     wee_widths       0.14 
+     wee_spacings     0.14 
+     wee_adjustments  0 
+  } 
+} 
+ 
+conductor met2 {
+   min_spacing  	 0.14 
+   min_width    	 0.14 
+   height       	 2.0061 
+   thickness    	 0.360 
+   resistivity  	 0.125 
+   temp_tc1     	 0.003161 
+   temp_tc2     	 -7.272e-07 
+   gate_forming_layer  	 false 
+   wire_edge_enlargement_r { 
+     wee_widths       0.14 
+     wee_spacings     0.14 
+     wee_adjustments -0.0195  
+  } 
+   wire_edge_enlargement_c { 
+     wee_widths       0.14 
+     wee_spacings     0.14 
+     wee_adjustments  0  
+  } 
+} 
+ 
+conductor met3 {
+   min_spacing  	 0.30 
+   min_width    	 0.30 
+   height       	 2.7861 
+   thickness    	 0.845 
+   resistivity  	 0.047 
+   temp_tc1     	 0.003424 
+   temp_tc2     	 -7.739e-07 
+   gate_forming_layer  	 false 
+   wire_edge_enlargement_r { 
+     wee_widths       0.30 
+     wee_spacings     0.30 
+     wee_adjustments -0.0125  
+  } 
+   wire_edge_enlargement_c { 
+     wee_widths       0.30 
+     wee_spacings     0.30 
+     wee_adjustments 0  
+  } 
+} 
+ 
+conductor met4 {
+   min_spacing  	 0.30 
+   min_width    	 0.30 
+   height       	 4.0211 
+   thickness    	 0.845 
+   resistivity  	 0.047 
+   temp_tc1     	 0.003424 
+   temp_tc2     	 -7.739e-07 
+   gate_forming_layer  	 false 
+   wire_edge_enlargement_r { 
+     wee_widths       0.30 
+     wee_spacings     0.30 
+     wee_adjustments -0.0125  
+  } 
+   wire_edge_enlargement_c { 
+     wee_widths       0.30 
+     wee_spacings     0.30 
+     wee_adjustments 0  
+  } 
+} 
+ 
+conductor met5 {
+   min_spacing  	 1.60 
+   min_width    	 0.80 
+   height       	 5.3711 
+   thickness    	 1.260 
+   resistivity  	 0.0285 
+   temp_tc1     	 3.5e-3 
+   temp_tc2     	 -7.5e-07 
+   gate_forming_layer  	 false 
+   wire_edge_enlargement_r { 
+     wee_widths       0.80 
+     wee_spacings     1.60 
+     wee_adjustments -0.0450  
+  } 
+   wire_edge_enlargement_c { 
+     wee_widths       0.80 
+     wee_spacings     1.60 
+     wee_adjustments 0  
+  } 
+} 
+ 
+# dielectric Layers 
+dielectric   FOX {
+   conformal 		   FALSE 
+   height    		   0.0000 
+   thickness 		   0.3262 
+   dielectric_constant 	   3.9 
+} 
+ 
+dielectric   IOX {
+   conformal 		   TRUE 
+   expandedFrom 	   Poly
+   height    		   0.3262 
+   thickness 		   0.0000 
+   topThickness 	   0.0000 
+   sideExpand 		   0.0060 
+   dielectric_constant 	   3.9 
+} 
+ 
+dielectric   SPNIT {
+   conformal 		   TRUE 
+   expandedFrom 	   IOX
+   height    		   0.3262 
+   thickness 		   0.0000 
+   topThickness 	   0.1210 
+   sideExpand 		   0.0431 
+   dielectric_constant 	   7.5 
+} 
+ 
+dielectric   PSG {
+   conformal 		   FALSE 
+   height    		   0.3262 
+   thickness 		   0.6099 
+   dielectric_constant 	   3.9 
+} 
+ 
+dielectric   LINT {
+   conformal 		   TRUE 
+   expandedFrom 	   li1
+   height    		   0.9361 
+   thickness 		   0.0750 
+   topThickness 	   0.0750 
+   sideExpand 		   0.0610 
+   dielectric_constant 	   7.3 
+} 
+ 
+dielectric   NILD2 {
+   conformal 		   FALSE 
+   height    		   1.0111 
+   thickness 		   0.3650 
+   dielectric_constant 	   4.05 
+} 
+ 
+dielectric   NILD3_C {
+   conformal 		   TRUE 
+   expandedFrom 	   met1
+   height    		   1.3761 
+   thickness 		   0.0000 
+   topThickness 	   0.0000 
+   sideExpand 		   0.0300 
+   dielectric_constant 	   3.5 
+} 
+ 
+dielectric   NILD3 {
+   conformal 		   FALSE 
+   height    		   1.3761 
+   thickness 		   0.6300 
+   dielectric_constant 	   4.5 
+} 
+ 
+dielectric   NILD4_C {
+   conformal 		   TRUE 
+   expandedFrom 	   met2
+   height    		   2.0061 
+   thickness 		   0.0000 
+   topThickness 	   0.0000 
+   sideExpand 		   0.0300 
+   dielectric_constant 	   3.5 
+} 
+ 
+dielectric   NILD4 {
+   conformal 		   FALSE 
+   height    		   2.0061 
+   thickness 		   0.7800 
+   dielectric_constant 	   4.2 
+} 
+ 
+dielectric   NILD5 {
+   conformal 		   FALSE 
+   height    		   2.7861 
+   thickness 		   1.2350 
+   dielectric_constant 	   4.1 
+} 
+ 
+dielectric   NILD6 {
+   conformal 		   FALSE 
+   height    		   4.0211 
+   thickness 		   1.3500 
+   dielectric_constant 	   4.0 
+} 
+ 
+dielectric   TOPOX {
+   conformal 		   TRUE 
+   expandedFrom 	   met5
+   height    		   5.3711 
+   thickness 		   0.0000 
+   topThickness 	   0.0900 
+   sideExpand 		   0.0700 
+   dielectric_constant 	   3.9 
+} 
+ 
+dielectric   TOPNIT {
+   conformal 		   TRUE 
+   expandedFrom 	   TOPOX
+   height    		   5.3711 
+   thickness 		   0.3777 
+   topThickness 	   0.5400 
+   sideExpand 		   0.4223 
+   dielectric_constant 	   7.50 
+} 
+ 
+dielectric   PI1 {
+   conformal 		   FALSE 
+   height    		   5.7488 
+   thickness 		   6.1346 
+   dielectric_constant 	   2.94 
+} 
+ 
+dielectric   PI2 {
+   conformal 		   FALSE 
+   height    		  11.8834 
+   thickness 		   7.5000 
+   dielectric_constant 	   2.85 
+} 
+ 
+dielectric   MOLD {
+   conformal 		   FALSE 
+   height    		  19.3834 
+   thickness 		  40.0000 
+   dielectric_constant 	   3.6 
+} 
+ 
+# Connect Layers 
+via   CONT {
+   bottom_layer  	 P_SOURCE_DRAIN 
+   top_layer     	 li1 
+   contact_resistance  	 15 
+} 
+ 
+via   CONT {
+   bottom_layer  	 N_SOURCE_DRAIN 
+   top_layer     	 li1 
+   contact_resistance  	 15 
+} 
+
+via   via4 {
+   bottom_layer   	 met4 
+   top_layer      	 met5 
+   contact_resistance 0.38 
+   temp_tc1       	 0.00177 
+   temp_tc2       	 -1.6e-07 
+} 
+ 
+via   via3 {
+   bottom_layer   	 met3 
+   top_layer      	 met4 
+   contact_resistance 3.41 
+   temp_tc1       	 0.002366 
+   temp_tc2       	 -1.025e-05 
+} 
+ 
+via   via2 {
+   bottom_layer   	 met2 
+   top_layer      	 met3 
+   contact_resistance 3.41 
+   temp_tc1       	 0.002366 
+   temp_tc2       	 -1.025e-05 
+} 
+ 
+via   via {
+   bottom_layer   	 met1 
+   top_layer      	 met2 
+   contact_resistance 4.5 
+   temp_tc1       	 0.001081 
+   temp_tc2       	 -1.903e-07 
+} 
+ 
+via   mcon {
+   bottom_layer   	 li1 
+   top_layer      	 met1 
+   contact_resistance 9.3 
+   temp_tc1       	 0.001067 
+   temp_tc2       	 -5.324e-06 
+} 
+ 
+via   licon {
+   bottom_layer   	 Poly 
+   top_layer      	 li1 
+   contact_resistance 152 
+   temp_tc1       	 0.001249 
+   temp_tc2       	 -6.647e-06 
+} 
+ 
diff --git a/sky130_cds/pnr/sky130_drcRules.pvl b/sky130_cds/pnr/sky130_drcRules.pvl
new file mode 100755
index 000000000..fbe6504e0
--- /dev/null
+++ b/sky130_cds/pnr/sky130_drcRules.pvl
@@ -0,0 +1,420 @@
+
+incr_conn YES
+results_db -drc mult_seq.drc_errors.ascii -ascii
+
+/// Tolerance for round-off errors on skew edges
+tolerance 0.001
+
+/// Unused MaskLayers: (FOM DNM NWM HVTRM TUNM ONOM LVOM P1M NPCM LDNTM NSDM PSDM LICM1 LI1M CTM1 MM1 VIM MM2 VIM2 MM3 VIM3 MM4 VIM4 MM5 NSM PDM PBO RPM CU1M PMM2)
+layer_def nwell 1000
+layer_map 64 -datatype 20 1000 // nwell drawing
+
+layer_def diff 1001
+layer_map 65 -datatype 20 1001 // diff drawing
+
+layer_def poly 1008
+layer_map 66 -datatype 20 1008 // poly drawing
+
+layer_def licon1 1012
+layer_map 66 -datatype 44 1012 // licon1 drawing
+
+layer_def li1 1013
+layer_map 67 -datatype 20 1013 // li1 drawing
+
+layer_def mcon 1014
+layer_map 67 -datatype 44 1014 // mcon drawing
+
+layer_def met1 1015
+layer_map 68 -datatype 20 1015 // met1 drawing
+
+layer_def via 1016
+layer_map 68 -datatype 44 1016 // via drawing
+
+layer_def met2 1017
+layer_map 69 -datatype 20 1017 // met2 drawing
+
+layer_def via2 1019
+layer_map 69 -datatype 44 1019 // via2 drawing
+
+layer_def met3 1020
+layer_map 70 -datatype 20 1020 // met3 drawing
+
+layer_def via3 1021
+layer_map 70 -datatype 44 1021 // via3 drawing
+
+layer_def met4 1022
+layer_map 71 -datatype 20 1022 // met4 drawing
+
+layer_def via4 1023
+layer_map 71 -datatype 44 1023 // via4 drawing
+
+layer_def met5 1024
+layer_map 72 -datatype 20 1024 // met5 drawing
+
+layer_def pad 1026
+layer_map 76 -datatype 20 1026 // pad drawing
+
+layer_def capacitor 1031
+layer_map 82 -datatype 64 1031 // capacitor drawing
+
+layer_def inductor 1034
+layer_map 82 -datatype 24 1034 // inductor drawing
+
+layer_def polyGate 1074
+layer_map 66 -datatype 9 1074 // poly gate
+
+layer_def padText 1089
+layer_map 76 -texttype 5 1089 // pad label
+
+layer_def diffLabel 1090
+layer_map 65 -datatype 6 1090 // diff label
+
+layer_def nwellLabel 1092
+layer_map 64 -datatype 5 1092 // nwell label
+
+layer_def polyLabel 1093
+layer_map 66 -datatype 5 1093 // poly label
+
+layer_def met1Label 1094
+layer_map 68 -datatype 5 1094 // met1 label
+
+layer_def met2Label 1095
+layer_map 69 -datatype 5 1095 // met2 label
+
+layer_def met3Label 1096
+layer_map 70 -datatype 5 1096 // met3 label
+
+layer_def met4Label 1097
+layer_map 71 -datatype 5 1097 // met4 label
+
+layer_def met5Label 1098
+layer_map 72 -datatype 5 1098 // met5 label
+
+layer_def li1Block 1099
+layer_map 67 -datatype 10 1099 // li1 blockage
+
+layer_def met1Block 1100
+layer_map 68 -datatype 10 1100 // met1 blockage
+
+layer_def met2Block 1101
+layer_map 69 -datatype 10 1101 // met2 blockage
+
+layer_def met3Block 1102
+layer_map 70 -datatype 10 1102 // met3 blockage
+
+layer_def met4Block 1103
+layer_map 71 -datatype 10 1103 // met4 blockage
+
+layer_def met5Block 1104
+layer_map 72 -datatype 10 1104 // met5 blockage
+
+layer_def diffBndry 1106
+layer_map 65 -datatype 4 1106 // diff boundary
+
+layer_def mconBndry 1108
+layer_map 67 -datatype 60 1108 // mcon boundary
+
+layer_def polyBndry 1109
+layer_map 66 -datatype 4 1109 // poly boundary
+
+layer_def viaBndry 1110
+layer_map 68 -datatype 60 1110 // via boundary
+
+layer_def via2Bndry 1111
+layer_map 69 -datatype 60 1111 // via2 boundary
+
+layer_def via3Bndry 1112
+layer_map 70 -datatype 60 1112 // via3 boundary
+
+layer_def via4Bndry 1113
+layer_map 71 -datatype 60 1113 // via4 boundary
+
+layer_def li1tt 1114 1115 1116 1117
+layer_map 67 -texttype 20 1114 // li1 drawing
+layer_map 67 -texttype 5 1115 // li1 label
+layer_map 67 -texttype 23 1116 // li1 net
+layer_map 67 -texttype 16 1117 // li1 pin
+
+layer_def met1tt 1118 1119 1120 1121
+layer_map 68 -texttype 20 1118 // met1 drawing
+layer_map 68 -texttype 5 1119 // met1 label
+layer_map 68 -texttype 23 1120 // met1 net
+layer_map 68 -texttype 16 1121 // met1 pin
+
+layer_def met2tt 1122 1123 1124 1125
+layer_map 69 -texttype 20 1122 // met2 drawing
+layer_map 69 -texttype 5 1123 // met2 label
+layer_map 69 -texttype 23 1124 // met2 net
+layer_map 69 -texttype 16 1125 // met2 pin
+
+layer_def met3tt 1126 1127 1128 1129
+layer_map 70 -texttype 20 1126 // met3 drawing
+layer_map 70 -texttype 5 1127 // met3 label
+layer_map 70 -texttype 23 1128 // met3 net
+layer_map 70 -texttype 16 1129 // met3 pin
+
+layer_def met4tt 1130 1131 1132 1133
+layer_map 71 -texttype 20 1130 // met4 drawing
+layer_map 71 -texttype 5 1131 // met4 label
+layer_map 71 -texttype 23 1132 // met4 net
+layer_map 71 -texttype 16 1133 // met4 pin
+
+layer_def met5tt 1134 1135 1136 1137
+layer_map 72 -texttype 20 1134 // met5 drawing
+layer_map 72 -texttype 5 1135 // met5 label
+layer_map 72 -texttype 23 1136 // met5 net
+layer_map 72 -texttype 16 1137 // met5 pin
+
+layer_def polytt 1138 1139 1140 1141
+layer_map 66 -texttype 20 1138 // poly drawing
+layer_map 66 -texttype 5 1139 // poly label
+layer_map 66 -texttype 23 1140 // poly net
+layer_map 66 -texttype 16 1141 // poly pin
+
+layer_def difftt 1142 1143 1144 1145
+layer_map 65 -texttype 20 1142 // diff drawing
+layer_map 65 -texttype 6 1143 // diff label
+layer_map 65 -texttype 23 1144 // diff net
+layer_map 65 -texttype 16 1145 // diff pin
+
+layer_def poly_pin 1146
+layer_map 66 -datatype 16 1146 // poly pin
+
+layer_def li1_pin 1147
+layer_map 67 -datatype 16 1147 // li1 pin
+
+layer_def met1_pin 1148
+layer_map 68 -datatype 16 1148 // met1 pin
+
+layer_def met2_pin 1149
+layer_map 69 -datatype 16 1149 // met2 pin
+
+layer_def met3_pin 1150
+layer_map 70 -datatype 16 1150 // met3 pin
+
+layer_def met4_pin 1151
+layer_map 71 -datatype 16 1151 // met4 pin
+
+layer_def met5_pin 1152
+layer_map 72 -datatype 16 1152 // met5 pin
+
+layer_def nwellpt 1153
+layer_map 64 -texttype 16 1153 // nwell pin
+layer_map 64 -texttype 0 1153 // nwell pin
+
+layer_def polypt 1154
+layer_map 66 -texttype 16 1154 // poly pin
+layer_map 66 -texttype 0 1154 // poly pin
+
+layer_def li1pt 1155
+layer_map 67 -texttype 16 1155 // li1 pin
+layer_map 67 -texttype 0 1155 // li1 pin
+
+layer_def met1pt 1156
+layer_map 68 -texttype 16 1156 // met1 pin
+layer_map 68 -texttype 0 1156 // met1 pin
+
+layer_def met2pt 1157
+layer_map 69 -texttype 16 1157 // met2 pin
+layer_map 69 -texttype 0 1157 // met2 pin
+
+layer_def met3pt 1158
+layer_map 70 -texttype 16 1158 // met3 pin
+layer_map 70 -texttype 0 1158 // met3 pin
+
+layer_def met4pt 1159
+layer_map 71 -texttype 16 1159 // met4 pin
+layer_map 71 -texttype 0 1159 // met4 pin
+
+layer_def met5pt 1160
+layer_map 72 -texttype 16 1160 // met5 pin
+layer_map 72 -texttype 0 1160 // met5 pin
+
+layer_def padtt 1167 1089
+layer_map 76 -texttype 20 1167 // pad drawing
+   // 1089 -> pad label
+
+layer_def pad_pin 1168
+layer_map 76 -datatype 16 1168 // pad pin
+
+layer_def padpt 1169
+layer_map 76 -texttype 16 1169 // pad pin
+layer_map 76 -texttype 0 1169 // pad pin
+
+layer_def met5Pin 1152
+   // 1152 -> met5 pin
+
+layer_def met4Pin 1151
+   // 1151 -> met4 pin
+
+layer_def met3Pin 1150
+   // 1150 -> met3 pin
+
+layer_def met2Pin 1149
+   // 1149 -> met2 pin
+
+layer_def met1Pin 1148
+   // 1148 -> met1 pin
+
+layer_def li1Pin 1147
+   // 1147 -> li1 pin
+
+layer_def polyPin 1146
+   // 1146 -> poly pin
+
+layer_def diffPin 1222
+layer_map 65 -datatype 16 1222 // diff pin
+
+treat_non_baselayer_as_toplayer yes
+base_layer diff
+base_layer poly
+layer_def pwellLabel 1229
+layer_map 64 -datatype 59 1229 // pwell label
+
+layer_def pwelltt 1230
+layer_map 64 -texttype 59 1230 // pwell label
+
+layer_def pwell_pin 1231
+layer_map 122 -datatype 16 1231 // pwell pin
+
+layer_def pwellpt 1232
+layer_map 122 -texttype 16 1232 // pwell pin
+layer_map 122 -texttype 0 1232 // pwell pin
+
+copy inductor -outputlayer inductor_exempt
+and diff nwell -outputlayer PDIFF
+not diff nwell -outputlayer NDIFF
+not diff poly -outputlayer SRCDRN
+and poly diff -outputlayer POLYandDIFF
+copy POLYandDIFF -outputlayer GATE
+edge_boolean -inside GATE diff -outputlayer GATESIDE
+edge_boolean -coincident_only -inside GATE diff -outputlayer GATEEND
+//edge_boolean -coincident_only -outside diff tap -outputlayer diffTapEdge
+copy GATE -outputlayer MOSGATE
+copy MOSGATE -outputlayer EMOSGATE
+disconnect
+//and npc licon1 -outputlayer npccon
+//connect dnwell nwell
+//connect nwell tap -by NTAP
+//connect tap li1 -by licon1
+//connect poly li1 -by npccon
+connect li1 met1 -by mcon
+connect met1 met2 -by via
+connect met3 met2 -by via2
+connect met3 met4 -by via3
+connect met4 met5 -by via4
+connect met5 pad
+rule "R0_nwell_X1" {
+caption "nwell_X1: off 0.005 grid nwell vertex"
+offgrid nwell 5
+}
+rule "R1_diff_X1" {
+caption "diff_X1: off 0.005 grid diff vertex"
+offgrid diff 5
+}
+rule "R2_poly_X1" {
+caption "poly_X1: off 0.005 grid poly vertex"
+offgrid poly 5
+}
+rule "R3_li1_X1" {
+caption "li1_X1: off 0.005 grid li1 vertex"
+offgrid li1 5
+}
+rule "R4_mcon_X1" {
+caption "mcon_X1: off 0.005 grid mcon vertex"
+offgrid mcon 5
+}
+rule "R5_met1_X1" {
+caption "met1_X1: off 0.005 grid met1 vertex"
+offgrid met1 5
+}
+rule "R6_via_X1" {
+caption "via_X1: off 0.005 grid via vertex"
+offgrid via 5
+}
+rule "R7_met2_X1" {
+caption "met2_X1: off 0.005 grid met2 vertex"
+offgrid met2 5
+}
+rule "R8_via2_X1" {
+caption "via2_X1: off 0.005 grid via2 vertex"
+offgrid via2 5
+}
+rule "R9_met3_X1" {
+caption "met3_X1: off 0.005 grid met3 vertex"
+offgrid met3 5
+}
+rule "R10_via3_X1" {
+caption "via3_X1: off 0.005 grid via3 vertex"
+offgrid via3 5
+}
+rule "R11_met4_X1" {
+caption "met4_X1: off 0.005 grid met4 vertex"
+offgrid met4 5
+}
+rule "R12_via4_X1" {
+caption "via4_X1: off 0.005 grid via4 vertex"
+offgrid via4 5
+}
+rule "R13_met5_X1" {
+caption "met5_X1: off 0.005 grid met5 vertex"
+offgrid met5 5
+}
+rule "R14_pad_X1" {
+caption "pad_X1: off 0.005 grid pad vertex"
+offgrid pad 5
+}
+rule "R15_cap_X1" {
+caption "cap_X1: off 0.005 grid capacitor vertex"
+offgrid capacitor 5
+}
+rule "R16_ind_X1" {
+caption "ind_X1: off 0.005 grid inductor vertex"
+offgrid inductor 5
+}
+rule "R17_nwell_X2" {
+caption "nwell_X2: non-octagonal nwell edge"
+angle nwell -ltgt 0 45
+angle nwell -ltgt 45 90
+}
+rule "R18_diff_X2" {
+caption "diff_X2: non-octagonal diff edge"
+angle diff -ltgt 0 45
+angle diff -ltgt 45 90
+}
+rule "R19_met1_X2" {
+caption "met1_X2: non-octagonal met1 edge"
+angle met1 -ltgt 0 45
+angle met1 -ltgt 45 90
+}
+rule "R20_met2_X2" {
+caption "met2_X2: non-octagonal met2 edge"
+angle met2 -ltgt 0 45
+angle met2 -ltgt 45 90
+}
+rule "R21_met3_X2" {
+caption "met3_X2: non-octagonal met3 edge"
+angle met3 -ltgt 0 45
+angle met3 -ltgt 45 90
+}
+rule "R22_met4_X2" {
+caption "met4_X2: non-octagonal met4 edge"
+angle met4 -ltgt 0 45
+angle met4 -ltgt 45 90
+}
+rule "R23_met5_X2" {
+caption "met5_X2: non-octagonal met5 edge"
+angle met5 -ltgt 0 45
+angle met5 -ltgt 45 90
+}
+rule "R24_cap_X2" {
+caption "cap_X2: non-octagonal capacitor edge"
+angle capacitor -ltgt 0 45
+angle capacitor -ltgt 45 90
+}
+rule "R25_ind_X2" {
+caption "ind_X2: non-octagonal inductor edge"
+angle inductor -ltgt 0 45
+angle inductor -ltgt 45 90
+}
+
diff --git a/sky130_cds/pnr/sourceme b/sky130_cds/pnr/sourceme
new file mode 100755
index 000000000..4ca751513
--- /dev/null
+++ b/sky130_cds/pnr/sourceme
@@ -0,0 +1 @@
+source ../../scripts/cadence.cshrc
diff --git a/sky130_cds/pnr/streamOut.map b/sky130_cds/pnr/streamOut.map
new file mode 100755
index 000000000..23c4b83a2
--- /dev/null
+++ b/sky130_cds/pnr/streamOut.map
@@ -0,0 +1,70 @@
+li1		NET		67		20
+li1		SPNET		67		20
+li1		PIN		67		20
+li1		FILL		67		20
+li1		VIA		67		20
+li1		VIAFILL		67		20
+NAME		li1/PIN		67 		20
+NAME		li1/SPNET	67 		20
+
+met1		NET		68		20
+met1		SPNET		68		20
+met1		PIN		68		20
+met1		FILL		68		20
+met1		VIA		68		20
+met1		VIAFILL		68		20
+NAME		met1/PIN	68 		20
+NAME		met1/SPNET	68 		20
+
+met2		NET		69		20
+met2		SPNET		69		20
+met2		PIN		69		20
+met2		FILL		69		20
+met2		VIA		69		20
+met2		VIAFILL		69		20
+NAME		met2/PIN	69 		20
+NAME		met2/SPNET	69 		20
+
+met3		NET		70		20
+met3		SPNET		70		20
+met3		PIN		70		20
+met3		FILL		70		20
+met3		VIA		70		20
+met3		VIAFILL		70		20
+NAME		met3/PIN	70 		20
+NAME		met3/SPNET	70 		20
+
+met4		NET		71		20
+met4		SPNET		71		20
+met4		PIN		71		20
+met4		FILL		71		20
+met4		VIA		71		20
+met4		VIAFILL		71		20
+NAME		met4/PIN	71 		20
+NAME		met4/SPNET	71 		20
+
+met5		NET		72		20
+met5		SPNET		72		20
+met5		PIN		72		20
+met5		FILL		72		20
+met5		VIA		72		20
+met5		VIAFILL		72		20
+NAME		met5/PIN	72 		20
+NAME		met5/SPNET	72 		20
+
+mcon 		VIA		67		44
+mcon		VIAFILL		67		44
+
+via1 		VIA		68		44
+via1 		VIAFILL		68		44
+
+via2 		VIA		69		44
+via2 		VIAFILL		69		44
+
+via3 		VIA		70		44
+via3 		VIAFILL		70		44
+
+via4 		VIA		71		44
+via4 		VIAFILL		71		44
+
+
diff --git a/sky130_cds/pnr/tapeout.tcl b/sky130_cds/pnr/tapeout.tcl
new file mode 100755
index 000000000..b34517e4a
--- /dev/null
+++ b/sky130_cds/pnr/tapeout.tcl
@@ -0,0 +1,7 @@
+# Output GDSII
+streamOut final.gds -mapFile streamOut.map -stripes 1 -units 1000 -mode ALL
+saveNetlist -excludeLeafCell final.v
+
+# Run DRC and Connection checks
+verifyGeometry
+verifyConnectivity -type all -noAntenna
diff --git a/sky130_cds/synth/.rs_jstine.tstamp b/sky130_cds/synth/.rs_jstine.tstamp
new file mode 100755
index 000000000..9a20476c5
--- /dev/null
+++ b/sky130_cds/synth/.rs_jstine.tstamp
@@ -0,0 +1,5 @@
+array set allMetrics {-1,wall 1659624532}
+
+array set allMetrics {pbs_debug:9,date { 9:49:16 (Aug04)} pbs_debug:7,fieldInfo {{Memory {270.6 MB}} {Date { 9:49:16 (Aug04)}} {{Thread Count} 8} {{System Load} 4.12}} pbs_debug:6,name {PBS_TechMap-Datapath Postmap Operations} pbs_debug:0,multiInfo {{{Total Time} {{clock 00:00:05} {lthread 00:00:09}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0}}}} pbs_debug:0,all 9.0 pbs_debug:10,all 32.0 pbs_debug:3,pmem {275.7 MB} pbs_debug:2,thread 16.228966 pbs_debug:4,multiInfo {{{Total Time} {{clock 00:00:12} {lthread 00:00:16}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0}}}} pbs_debug:1,parent 17.0 pbs_debug:2,all 17.0 pbs_debug:7,tcount 8 pbs_debug:6,date { 9:49:15 (Aug04)} pbs_debug:3,name PBS_TechMap-Start pbs_debug:4,all 17.0 pbs_debug:0,sum 18.0 pbs_debug:1,status {} pbs_debug:10,sum 59.635121 pbs_debug:8,multiInfo {{{Total Time} {{clock 00:00:24} {lthread 00:00:27}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0}}}} pbs_debug:7,wall 24 pbs_debug:6,all 32.0 pbs_debug:2,sum 33.228966 pbs_debug:0,pmem {241.9 MB} pbs_debug:0,fieldInfo {{Memory {241.9 MB}} {Date { 9:48:57 (Aug04)}} {{Thread Count} 8} {{System Load} 3.46}} pbs_debug:10,cpuload 4.12 pbs_debug:8,all 32.0 pbs_debug:4,sum 33.228966 pbs_debug:3,date { 9:49:04 (Aug04)} pbs_debug:0,name PBS_Generic-Start pbs_debug:1,thread 16.228966 pbs_debug:0,parent 9.0 pbs_debug:0,multiInfoDetail {{{Total Time} {{clock 00:00:05} {lthread 00:00:09} {threads 00:00:09} {non-thread 00:00:09}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency } {Utilization } {{Lazy Time} }}}} pbs_debug:9,parent 32.0 pbs_debug:6,tcount 8 pbs_debug:6,sum 59.669524 pbs_debug:1,multiInfoDetail {{{Total Time} {{clock 00:00:12} {lthread 00:00:16} {threads 00:00:17} {non-thread 00:00:17}}} {{Stage Time} {{clock 00:00:07} {lthread 00:00:07} {threads 00:00:08} {non-thread 00:00:08}}} {{% Time} {{clock { 36.8}} {lthread 38.79216024408965} {threads 34.78260869565217} {non-thread 34.78260869565217}}} {{ST Metrics} {{Efficiency -0.0} {Utilization -0.10665896063143743} {{Lazy Time} -0.032709428571428445}}}} pbs_debug:4,fieldInfo {{Memory {275.7 MB}} {Date { 9:49:04 (Aug04)}} {{Thread Count} 8} {{System Load} 3.62}} pbs_debug:4,wall 12 pbs_debug:2,multiInfoDetail {{{Total Time} {{clock 00:00:12} {lthread 00:00:16} {threads 00:00:17} {non-thread 00:00:17}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency } {Utilization } {{Lazy Time} }}}} pbs_debug:0,status {} pbs_debug:9,status {} pbs_debug:8,sum 59.656776 pbs_debug:3,multiInfoDetail {{{Total Time} {{clock 00:00:12} {lthread 00:00:16} {threads 00:00:17} {non-thread 00:00:17}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency } {Utilization } {{Lazy Time} }}}} pbs_debug:10,tcount 8 pbs_debug:4,multiInfoDetail {{{Total Time} {{clock 00:00:12} {lthread 00:00:16} {threads 00:00:17} {non-thread 00:00:17}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency } {Utilization } {{Lazy Time} }}}} pbs_debug:0,date { 9:48:57 (Aug04)} pbs_debug:8,pmem {275.7 MB} pbs_debug:5,multiInfoDetail {{{Total Time} {{clock 00:00:22} {lthread 00:00:25} {threads 00:00:30} {non-thread 00:00:30}}} {{Stage Time} {{clock 00:00:10} {lthread 00:00:09} {threads 00:00:13} {non-thread 00:00:13}}} {{% Time} {{clock { 52.6}} {lthread 50.72745167579004} {threads 56.52173913043478} {non-thread 56.52173913043478}}} {{ST Metrics} {{Efficiency -0.0} {Utilization -0.3752070479995919} {{Lazy Time} 0.05468779999999995}}}} pbs_debug:0,mem {241.9 MB} pbs_debug:10,pmem {275.7 MB} pbs_debug:10,mem {270.6 MB} pbs_debug:8,fieldInfo {{Memory {270.6 MB}} {Date { 9:49:16 (Aug04)}} {{Thread Count} 8} {{System Load} 4.12}} pbs_debug:6,multiInfoDetail {{{Total Time} {{clock 00:00:23} {lthread 00:00:27} {threads 00:00:32} {non-thread 00:00:32}}} {{Stage Time} {{clock 00:00:01} {lthread 00:00:01} {threads 00:00:02} {non-thread 00:00:02}}} {{% Time} {{clock {  5.3}} {lthread 10.665001853221144} {threads 8.695652173913043} {non-thread 8.695652173913043}}} {{ST Metrics} {{Efficiency -0.0} {Utilization -0.006321713001071538} {{Lazy Time} -0.9874360000000024}}}} pbs_debug:0,thread 9.0 pbs_debug:1,multiInfo {{{Total Time} {{clock 00:00:12} {lthread 00:00:16}}} {{Stage Time} {{clock 00:00:07} {lthread 00:00:07}}} {{% Time} {{clock { 36.8}} {lthread 38.79216024408965}}}} pbs_debug:9,thread 27.635120999999998 pbs_debug:8,name {PBS_TechMap-Postmap Clock Gating} pbs_debug:7,multiInfoDetail {{{Total Time} {{clock 00:00:24} {lthread 00:00:27} {threads 00:00:32} {non-thread 00:00:32}}} {{Stage Time} {{clock 00:00:01} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  5.3}} {lthread -0.06840846378192007} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency -0.0} {Utilization 1.0} {{Lazy Time} 1.012748000000002}}}} pbs_debug:2,mem {275.7 MB} pbs_debug:1,wall 12 pbs_debug:10,name PBS_Techmap-Post_MBCI pbs_debug:8,multiInfoDetail {{{Total Time} {{clock 00:00:24} {lthread 00:00:27} {threads 00:00:32} {non-thread 00:00:32}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency } {Utilization } {{Lazy Time} }}}} pbs_debug:8,parent 32.0 pbs_debug:5,tcount 8 pbs_debug:9,multiInfoDetail {{{Total Time} {{clock 00:00:24} {lthread 00:00:27} {threads 00:00:32} {non-thread 00:00:32}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread -0.11620530931890727} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency -0.0} {Utilization 1.0} {{Lazy Time} }}}} pbs_debug:4,mem {275.7 MB} pbs_debug:8,status {} pbs_debug:5,multiInfo {{{Total Time} {{clock 00:00:22} {lthread 00:00:25}}} {{Stage Time} {{clock 00:00:10} {lthread 00:00:09}}} {{% Time} {{clock { 52.6}} {lthread 50.72745167579004}}}} pbs_debug:5,pmem {275.7 MB} pbs_debug:6,mem {270.6 MB} pbs_debug:8,date { 9:49:16 (Aug04)} pbs_debug:5,name {PBS_Techmap-Global Mapping} pbs_debug:10,date { 9:49:16 (Aug04)} pbs_debug:8,mem {270.6 MB} pbs_debug:9,multiInfo {{{Total Time} {{clock 00:00:24} {lthread 00:00:27}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread -0.11620530931890727}}}} pbs_debug:8,thread 27.656776 pbs_debug:9,wall 24 pbs_debug:7,parent 32.0 pbs_debug:4,tcount 8 pbs_debug:2,pmem {275.7 MB} pbs_debug:1,fieldInfo {{Memory {275.7 MB}} {Date { 9:49:04 (Aug04)}} {{Thread Count} 8} {{System Load} 3.62}} pbs_debug:7,status {} pbs_debug:5,date { 9:49:14 (Aug04)} pbs_debug:2,name {PBS_Generic-Postgen HBO Optimizations} pbs_debug:5,fieldInfo {{Memory {270.6 MB}} {Date { 9:49:14 (Aug04)}} {{Thread Count} 8} {{System Load} 4.12}} pbs_debug:6,wall 23 pbs_debug:7,thread 27.656776 pbs_debug:6,parent 32.0 pbs_debug:3,tcount 8 pbs_debug:2,date { 9:49:04 (Aug04)} pbs_debug:9,fieldInfo {{Memory {270.6 MB}} {Date { 9:49:16 (Aug04)}} {{Thread Count} 8} {{System Load} 4.12}} pbs_debug:2,multiInfo {{{Total Time} {{clock 00:00:12} {lthread 00:00:16}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0}}}} pbs_debug:6,status {} pbs_debug:1,all 17.0 pbs_debug:10,parent 32.0 pbs_debug:3,wall 12 pbs_debug:3,all 17.0 pbs_debug:10,status {} pbs_debug:6,multiInfo {{{Total Time} {{clock 00:00:23} {lthread 00:00:27}}} {{Stage Time} {{clock 00:00:01} {lthread 00:00:01}}} {{% Time} {{clock {  5.3}} {lthread 10.665001853221144}}}} pbs_debug:7,pmem {275.7 MB} pbs_debug:6,thread 27.669524000000003 pbs_debug:5,all 30.0 pbs_debug:1,sum 33.228966 pbs_debug:5,parent 30.0 pbs_debug:2,tcount 8 pbs_debug:7,all 32.0 pbs_debug:7,name {PBS_TechMap-Postmap HBO Optimizations} pbs_debug:3,sum 33.228966 pbs_debug:0,wall 5 pbs_debug:0,cpuload 3.46 pbs_debug:10,thread 27.635120999999998 pbs_debug:5,status {} pbs_debug:1,cpuload 3.62 pbs_debug:9,all 32.0 pbs_debug:5,sum 55.682088 pbs_debug:2,fieldInfo {{Memory {275.7 MB}} {Date { 9:49:04 (Aug04)}} {{Thread Count} 8} {{System Load} 3.62}} pbs_debug:2,cpuload 3.62 pbs_debug:10,multiInfoDetail {{{Total Time} {{clock 00:00:24} {lthread 00:00:27} {threads 00:00:32} {non-thread 00:00:32}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency } {Utilization } {{Lazy Time} }}}} pbs_debug:4,pmem {275.7 MB} pbs_debug:3,cpuload 3.62 pbs_debug:7,sum 59.656776 pbs_debug:4,cpuload 3.62 pbs_debug:7,date { 9:49:16 (Aug04)} pbs_debug:5,cpuload 4.12 pbs_debug:5,thread 25.682088 pbs_debug:4,name {PBS_TechMap-Premap HBO Optimizations} pbs_debug:9,sum 59.635121 pbs_debug:6,fieldInfo {{Memory {270.6 MB}} {Date { 9:49:15 (Aug04)}} {{Thread Count} 8} {{System Load} 4.12}} pbs_debug:6,cpuload 4.12 pbs_debug:4,parent 17.0 pbs_debug:1,tcount 8 pbs_debug:7,cpuload 4.12 pbs_debug:10,multiInfo {{{Total Time} {{clock 00:00:24} {lthread 00:00:27}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0}}}} pbs_debug:8,cpuload 4.12 pbs_debug:8,wall 24 pbs_debug:4,status {} pbs_debug:1,mem {275.7 MB} pbs_debug:1,pmem {275.7 MB} pbs_debug:10,wall 24 pbs_debug:9,cpuload 4.12 pbs_debug:4,date { 9:49:04 (Aug04)} pbs_debug:3,multiInfo {{{Total Time} {{clock 00:00:12} {lthread 00:00:16}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0}}}} pbs_debug:3,mem {275.7 MB} pbs_debug:1,name PBS_Generic_Opt-Post pbs_debug:5,mem {270.6 MB} pbs_debug:4,thread 16.228966 pbs_debug:5,wall 22 pbs_debug:3,parent 17.0 pbs_debug:0,tcount 8 pbs_debug:9,tcount 8 pbs_debug:7,multiInfo {{{Total Time} {{clock 00:00:24} {lthread 00:00:27}}} {{Stage Time} {{clock 00:00:01} {lthread 00:00:00}}} {{% Time} {{clock {  5.3}} {lthread -0.06840846378192007}}}} pbs_debug:7,mem {270.6 MB} pbs_debug:3,status {} pbs_debug:1,date { 9:49:04 (Aug04)} pbs_debug:9,pmem {275.7 MB} pbs_debug:9,mem {270.6 MB} pbs_debug:10,fieldInfo {{Memory {270.6 MB}} {Date { 9:49:16 (Aug04)}} {{Thread Count} 8} {{System Load} 4.12}} pbs_debug:9,name {PBS_TechMap-Postmap Cleanup} pbs_debug:2,wall 12 pbs_debug:3,fieldInfo {{Memory {275.7 MB}} {Date { 9:49:04 (Aug04)}} {{Thread Count} 8} {{System Load} 3.62}} pbs_debug:3,thread 16.228966 pbs_debug:2,parent 17.0 pbs_debug:8,tcount 8 pbs_debug:6,pmem {275.7 MB} pbs_debug:2,status {}}
+
+array set allMetrics {default:0,wall 0 default:0,parent 5.0 default:0,status {} default:0,thread 5.0 default:0,all 5.0 default:0,sum 10.0 default:0,mem {112.0 MB} default:0,pmem {112.0 MB} default:0,name init default:0,date { 9:48:52 (Aug04)} default:0,tcount 8 default:0,cpuload 3.42}
diff --git a/sky130_cds/synth/.rs_rerra.tstamp b/sky130_cds/synth/.rs_rerra.tstamp
new file mode 100755
index 000000000..0c2f354e4
--- /dev/null
+++ b/sky130_cds/synth/.rs_rerra.tstamp
@@ -0,0 +1,5 @@
+array set allMetrics {-1,wall 1659807166}
+
+array set allMetrics {pbs_debug:9,date {12:33:07 (Aug06)} pbs_debug:7,fieldInfo {{Memory {571.3 MB}} {Date {12:33:07 (Aug06)}} {{Thread Count} 8} {{System Load} 0.59}} pbs_debug:6,name {PBS_TechMap-Datapath Postmap Operations} pbs_debug:0,multiInfo {{{Total Time} {{clock 00:00:03} {lthread 00:00:06}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0}}}} pbs_debug:0,all 6.0 pbs_debug:10,all 26.0 pbs_debug:3,pmem {573.9 MB} pbs_debug:2,thread 17.543434 pbs_debug:4,multiInfo {{{Total Time} {{clock 00:00:14} {lthread 00:00:17}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0}}}} pbs_debug:1,parent 18.0 pbs_debug:2,all 18.0 pbs_debug:7,tcount 8 pbs_debug:6,date {12:33:07 (Aug06)} pbs_debug:3,name PBS_TechMap-Start pbs_debug:4,all 18.0 pbs_debug:0,sum 12.0 pbs_debug:1,status {} pbs_debug:10,sum 49.378641 pbs_debug:8,multiInfo {{{Total Time} {{clock 00:00:21} {lthread 00:00:23}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0}}}} pbs_debug:7,wall 21 pbs_debug:6,all 26.0 pbs_debug:2,sum 35.543434000000005 pbs_debug:0,pmem {292.0 MB} pbs_debug:0,fieldInfo {{Memory {292.0 MB}} {Date {12:32:49 (Aug06)}} {{Thread Count} 8} {{System Load} 0.57}} pbs_debug:10,cpuload 0.59 pbs_debug:8,all 26.0 pbs_debug:4,sum 35.543434000000005 pbs_debug:3,date {12:33:00 (Aug06)} pbs_debug:0,name PBS_Generic-Start pbs_debug:1,thread 17.543434 pbs_debug:0,parent 6.0 pbs_debug:0,multiInfoDetail {{{Total Time} {{clock 00:00:03} {lthread 00:00:06} {threads 00:00:06} {non-thread 00:00:06}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency } {Utilization } {{Lazy Time} }}}} pbs_debug:9,parent 26.0 pbs_debug:6,tcount 8 pbs_debug:6,sum 49.387472 pbs_debug:1,multiInfoDetail {{{Total Time} {{clock 00:00:14} {lthread 00:00:17} {threads 00:00:18} {non-thread 00:00:18}}} {{Stage Time} {{clock 00:00:11} {lthread 00:00:11} {threads 00:00:12} {non-thread 00:00:12}}} {{% Time} {{clock { 61.1}} {lthread 66.42311099009412} {threads 60.0} {non-thread 60.0}}} {{ST Metrics} {{Efficiency -0.0} {Utilization -0.03955200852709839} {{Lazy Time} -0.04940309090909101}}}} pbs_debug:4,fieldInfo {{Memory {573.9 MB}} {Date {12:33:00 (Aug06)}} {{Thread Count} 8} {{System Load} 0.56}} pbs_debug:4,wall 14 pbs_debug:2,multiInfoDetail {{{Total Time} {{clock 00:00:14} {lthread 00:00:17} {threads 00:00:18} {non-thread 00:00:18}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency } {Utilization } {{Lazy Time} }}}} pbs_debug:0,status {} pbs_debug:9,status {} pbs_debug:8,sum 49.383464000000004 pbs_debug:3,multiInfoDetail {{{Total Time} {{clock 00:00:14} {lthread 00:00:17} {threads 00:00:18} {non-thread 00:00:18}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency } {Utilization } {{Lazy Time} }}}} pbs_debug:10,tcount 8 pbs_debug:4,multiInfoDetail {{{Total Time} {{clock 00:00:14} {lthread 00:00:17} {threads 00:00:18} {non-thread 00:00:18}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency } {Utilization } {{Lazy Time} }}}} pbs_debug:0,date {12:32:49 (Aug06)} pbs_debug:8,pmem {573.9 MB} pbs_debug:5,multiInfoDetail {{{Total Time} {{clock 00:00:20} {lthread 00:00:22} {threads 00:00:25} {non-thread 00:00:25}}} {{Stage Time} {{clock 00:00:06} {lthread 00:00:04} {threads 00:00:07} {non-thread 00:00:07}}} {{% Time} {{clock { 33.3}} {lthread 27.900887071664577} {threads 35.0} {non-thread 35.0}}} {{ST Metrics} {{Efficiency -0.0} {Utilization -0.4436576510246364} {{Lazy Time} 0.1918675000000002}}}} pbs_debug:0,mem {292.0 MB} pbs_debug:10,pmem {573.9 MB} pbs_debug:10,mem {571.3 MB} pbs_debug:8,fieldInfo {{Memory {571.3 MB}} {Date {12:33:07 (Aug06)}} {{Thread Count} 8} {{System Load} 0.59}} pbs_debug:6,multiInfoDetail {{{Total Time} {{clock 00:00:21} {lthread 00:00:23} {threads 00:00:26} {non-thread 00:00:26}}} {{Stage Time} {{clock 00:00:01} {lthread 00:00:00} {threads 00:00:01} {non-thread 00:00:01}}} {{% Time} {{clock {  5.6}} {lthread 5.726817188985023} {threads 5.0} {non-thread 5.0}}} {{ST Metrics} {{Efficiency -0.0} {Utilization -0.004779737209908985} {{Lazy Time} 0.0047570000000014545}}}} pbs_debug:0,thread 6.0 pbs_debug:1,multiInfo {{{Total Time} {{clock 00:00:14} {lthread 00:00:17}}} {{Stage Time} {{clock 00:00:11} {lthread 00:00:11}}} {{% Time} {{clock { 61.1}} {lthread 66.42311099009412}}}} pbs_debug:9,thread 23.378641 pbs_debug:8,name {PBS_TechMap-Postmap Clock Gating} pbs_debug:7,multiInfoDetail {{{Total Time} {{clock 00:00:21} {lthread 00:00:23} {threads 00:00:26} {non-thread 00:00:26}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread -0.023062792999745504} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency -0.0} {Utilization 1.0} {{Lazy Time} }}}} pbs_debug:2,mem {573.9 MB} pbs_debug:1,wall 14 pbs_debug:10,name PBS_Techmap-Post_MBCI pbs_debug:8,multiInfoDetail {{{Total Time} {{clock 00:00:21} {lthread 00:00:23} {threads 00:00:26} {non-thread 00:00:26}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency } {Utilization } {{Lazy Time} }}}} pbs_debug:8,parent 26.0 pbs_debug:5,tcount 8 pbs_debug:9,multiInfoDetail {{{Total Time} {{clock 00:00:21} {lthread 00:00:23} {threads 00:00:26} {non-thread 00:00:26}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread -0.027752457743973183} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency -0.0} {Utilization 1.0} {{Lazy Time} }}}} pbs_debug:4,mem {573.9 MB} pbs_debug:8,status {} pbs_debug:5,multiInfo {{{Total Time} {{clock 00:00:20} {lthread 00:00:22}}} {{Stage Time} {{clock 00:00:06} {lthread 00:00:04}}} {{% Time} {{clock { 33.3}} {lthread 27.900887071664577}}}} pbs_debug:5,pmem {573.9 MB} pbs_debug:6,mem {571.3 MB} pbs_debug:8,date {12:33:07 (Aug06)} pbs_debug:5,name {PBS_Techmap-Global Mapping} pbs_debug:10,date {12:33:07 (Aug06)} pbs_debug:8,mem {571.3 MB} pbs_debug:9,multiInfo {{{Total Time} {{clock 00:00:21} {lthread 00:00:23}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread -0.027752457743973183}}}} pbs_debug:8,thread 23.383464 pbs_debug:9,wall 21 pbs_debug:7,parent 26.0 pbs_debug:4,tcount 8 pbs_debug:2,pmem {573.9 MB} pbs_debug:1,fieldInfo {{Memory {573.9 MB}} {Date {12:33:00 (Aug06)}} {{Thread Count} 8} {{System Load} 0.56}} pbs_debug:7,status {} pbs_debug:5,date {12:33:06 (Aug06)} pbs_debug:2,name {PBS_Generic-Postgen HBO Optimizations} pbs_debug:5,fieldInfo {{Memory {571.3 MB}} {Date {12:33:06 (Aug06)}} {{Thread Count} 8} {{System Load} 0.59}} pbs_debug:6,wall 21 pbs_debug:7,thread 23.383464 pbs_debug:6,parent 26.0 pbs_debug:3,tcount 8 pbs_debug:2,date {12:33:00 (Aug06)} pbs_debug:9,fieldInfo {{Memory {571.3 MB}} {Date {12:33:07 (Aug06)}} {{Thread Count} 8} {{System Load} 0.59}} pbs_debug:2,multiInfo {{{Total Time} {{clock 00:00:14} {lthread 00:00:17}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0}}}} pbs_debug:6,status {} pbs_debug:1,all 18.0 pbs_debug:10,parent 26.0 pbs_debug:3,wall 14 pbs_debug:3,all 18.0 pbs_debug:10,status {} pbs_debug:6,multiInfo {{{Total Time} {{clock 00:00:21} {lthread 00:00:23}}} {{Stage Time} {{clock 00:00:01} {lthread 00:00:00}}} {{% Time} {{clock {  5.6}} {lthread 5.726817188985023}}}} pbs_debug:7,pmem {573.9 MB} pbs_debug:6,thread 23.387472 pbs_debug:5,all 25.0 pbs_debug:1,sum 35.543434000000005 pbs_debug:5,parent 25.0 pbs_debug:2,tcount 8 pbs_debug:7,all 26.0 pbs_debug:7,name {PBS_TechMap-Postmap HBO Optimizations} pbs_debug:3,sum 35.543434000000005 pbs_debug:0,wall 3 pbs_debug:0,cpuload 0.57 pbs_debug:10,thread 23.378641 pbs_debug:5,status {} pbs_debug:1,cpuload 0.56 pbs_debug:9,all 26.0 pbs_debug:5,sum 47.392229 pbs_debug:2,fieldInfo {{Memory {573.9 MB}} {Date {12:33:00 (Aug06)}} {{Thread Count} 8} {{System Load} 0.56}} pbs_debug:2,cpuload 0.56 pbs_debug:10,multiInfoDetail {{{Total Time} {{clock 00:00:21} {lthread 00:00:23} {threads 00:00:26} {non-thread 00:00:26}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00} {threads 00:00:00} {non-thread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0} {threads 0.0} {non-thread 0.0}}} {{ST Metrics} {{Efficiency } {Utilization } {{Lazy Time} }}}} pbs_debug:4,pmem {573.9 MB} pbs_debug:3,cpuload 0.56 pbs_debug:7,sum 49.383464000000004 pbs_debug:4,cpuload 0.56 pbs_debug:7,date {12:33:07 (Aug06)} pbs_debug:5,cpuload 0.59 pbs_debug:5,thread 22.392229 pbs_debug:4,name {PBS_TechMap-Premap HBO Optimizations} pbs_debug:9,sum 49.378641 pbs_debug:6,fieldInfo {{Memory {571.3 MB}} {Date {12:33:07 (Aug06)}} {{Thread Count} 8} {{System Load} 0.59}} pbs_debug:6,cpuload 0.59 pbs_debug:4,parent 18.0 pbs_debug:1,tcount 8 pbs_debug:7,cpuload 0.59 pbs_debug:10,multiInfo {{{Total Time} {{clock 00:00:21} {lthread 00:00:23}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0}}}} pbs_debug:8,cpuload 0.59 pbs_debug:8,wall 21 pbs_debug:4,status {} pbs_debug:1,mem {573.9 MB} pbs_debug:1,pmem {573.9 MB} pbs_debug:10,wall 21 pbs_debug:9,cpuload 0.59 pbs_debug:4,date {12:33:00 (Aug06)} pbs_debug:3,multiInfo {{{Total Time} {{clock 00:00:14} {lthread 00:00:17}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread 0.0}}}} pbs_debug:3,mem {573.9 MB} pbs_debug:1,name PBS_Generic_Opt-Post pbs_debug:5,mem {571.3 MB} pbs_debug:4,thread 17.543434 pbs_debug:5,wall 20 pbs_debug:3,parent 18.0 pbs_debug:0,tcount 8 pbs_debug:9,tcount 8 pbs_debug:7,multiInfo {{{Total Time} {{clock 00:00:21} {lthread 00:00:23}}} {{Stage Time} {{clock 00:00:00} {lthread 00:00:00}}} {{% Time} {{clock {  0.0}} {lthread -0.023062792999745504}}}} pbs_debug:7,mem {571.3 MB} pbs_debug:3,status {} pbs_debug:1,date {12:33:00 (Aug06)} pbs_debug:9,pmem {573.9 MB} pbs_debug:9,mem {571.3 MB} pbs_debug:10,fieldInfo {{Memory {571.3 MB}} {Date {12:33:07 (Aug06)}} {{Thread Count} 8} {{System Load} 0.59}} pbs_debug:9,name {PBS_TechMap-Postmap Cleanup} pbs_debug:2,wall 14 pbs_debug:3,fieldInfo {{Memory {573.9 MB}} {Date {12:33:00 (Aug06)}} {{Thread Count} 8} {{System Load} 0.56}} pbs_debug:3,thread 17.543434 pbs_debug:2,parent 18.0 pbs_debug:8,tcount 8 pbs_debug:6,pmem {573.9 MB} pbs_debug:2,status {}}
+
+array set allMetrics {default:0,wall 0 default:0,parent 3.0 default:0,status {} default:0,thread 3.0 default:0,all 3.0 default:0,sum 6.0 default:0,mem {142.9 MB} default:0,pmem {142.9 MB} default:0,name init default:0,date {12:32:46 (Aug06)} default:0,tcount 8 default:0,cpuload 0.45}
diff --git a/sky130_cds/synth/Makefile b/sky130_cds/synth/Makefile
new file mode 100755
index 000000000..fe02e6b9a
--- /dev/null
+++ b/sky130_cds/synth/Makefile
@@ -0,0 +1,28 @@
+#  
+#  Oklahoma State University
+#  Makefile for synthesis
+# 
+NAME := synth
+
+VARIANT := 18T_ms
+
+default:
+	@echo "Basic synthesis procedure for SKY130:"
+	@echo
+
+synth:
+	@sed -i 's/18T_ms/${VARIANT}/g' genus_script.tcl
+	@sed -i 's/18T_ms/${VARIANT}/g' constraints_top.sdc
+	@echo "Synthesizing using Cadence Genus"
+	@mkdir -p reports
+	genus -f genus_script.tcl|tee synth.log 
+
+clean:
+	rm -rf reports genus.log
+	rm -f genus.cmd*
+	rm -f genus.log*
+	rm -f filenames*.log
+
+   
+
+
diff --git a/sky130_cds/synth/README.md b/sky130_cds/synth/README.md
new file mode 100755
index 000000000..caac74e44
--- /dev/null
+++ b/sky130_cds/synth/README.md
@@ -0,0 +1,5 @@
+This is the synthesis example for Cadence Design Systems Genus.  To
+run, just type:
+
+genus -f genus_script.tcl | tee synth.log
+
diff --git a/sky130_cds/synth/constraints_top.sdc b/sky130_cds/synth/constraints_top.sdc
new file mode 100755
index 000000000..3e63e6934
--- /dev/null
+++ b/sky130_cds/synth/constraints_top.sdc
@@ -0,0 +1,6 @@
+create_clock -name clk -period $my_period [get_ports $my_clk]
+set_clock_uncertainty $my_uncertainty [get_clocks $my_clk]
+set_input_delay -max 0.0 [get_ports $all_in_ex_clk] -clock [get_clocks $my_clk]
+set_output_delay -max 0.0 [get_ports $all_out] -clock [get_clocks $my_clk]
+set_load [expr [load_of sky130_osu_sc_18T_ms_TT_1P8_25C.ccs/sky130_osu_sc_18T_ms__dff_1/D] * 1] [all_outputs]
+set_driving_cell  -lib_cell sky130_osu_sc_18T_ms__dff_1 -pin Q $all_in_ex_clk
diff --git a/sky130_cds/synth/final.rpt b/sky130_cds/synth/final.rpt
new file mode 100755
index 000000000..e69de29bb
diff --git a/sky130_cds/synth/fv/mult_seq/fv_map.fv.json b/sky130_cds/synth/fv/mult_seq/fv_map.fv.json
new file mode 100755
index 000000000..c2d25310c
--- /dev/null
+++ b/sky130_cds/synth/fv/mult_seq/fv_map.fv.json
@@ -0,0 +1,404 @@
+[
+{"bit_blasted_port_style":"%s_%d",
+"boundary_optimize_invert_hier_pins":"false",
+"boundary_optimize_invert_hier_pins_renaming_extension":"_BAR",
+"delete_unloaded_insts":"true",
+"delete_unloaded_seqs":"true",
+"dpopt_retain_datapath_connections":"false",
+"driver_for_unloaded_hier_pins":"Z",
+"fv_retain_carrysave_connections":"",
+"has_resized_timing_model":"false",
+"hdl_allow_inout_const_port_connect":"false",
+"hdl_allow_instance_name_conflict":"false",
+"hdl_append_generic_ports":"true",
+"hdl_array_naming_style":"%s[%d]",
+"hdl_async_set_reset":"",
+"hdl_auto_async_set_reset":"false",
+"hdl_auto_exec_sdc_scripts":"true",
+"hdl_auto_sync_set_reset":"true",
+"hdl_bidirectional_assign":"false",
+"hdl_bidirectional_wand_wor_assign":"false",
+"hdl_bus_wire_naming_style":"%s[%d]",
+"hdl_case_mux_threshold":"2",
+"hdl_case_sensitive_instances":"none",
+"hdl_convert_onebit_vector_to_scalar":"false",
+"hdl_create_label_for_unlabeled_generate":"true",
+"hdl_cse_for_registers":"false",
+"hdl_decimal_parameter_name":"false",
+"hdl_delete_transparent_latch":"true",
+"hdl_enable_proc_name":"false",
+"hdl_ff_keep_explicit_feedback":"true",
+"hdl_ff_keep_feedback":"false",
+"hdl_flatten_complex_port":"false",
+"hdl_generate_index_style":"%s[%d]",
+"hdl_generate_separator":".",
+"hdl_ignore_pragma_names":"coverage",
+"hdl_index_mux_threshold":"8",
+"hdl_infer_unresolved_from_logic_abstract":"true",
+"hdl_instance_array_naming_style":"%s[%d]",
+"hdl_interface_separator":"_",
+"hdl_keep_first_module_definition":"false",
+"hdl_language":"v2001",
+"hdl_latch_keep_feedback":"false",
+"hdl_link_from_any_lib":"true",
+"hdl_max_loop_limit":"4096",
+"hdl_max_map_to_mux_control_width":"10",
+"hdl_max_memory_address_range":"16384",
+"hdl_max_recursion_limit":"1024",
+"hdl_nc_compatible_module_linking":"true",
+"hdl_overwrite_command_line_macros":"true",
+"hdl_parameter_naming_style":"_%s%d",
+"hdl_preserve_async_sr_priority_logic":"false",
+"hdl_preserve_dangling_output_nets":"true",
+"hdl_preserve_supply_nets":"true",
+"hdl_preserve_sync_ctrl_logic":"false",
+"hdl_preserve_sync_set_reset":"false",
+"hdl_preserve_unused_flop":"false",
+"hdl_preserve_unused_latch":"false",
+"hdl_preserve_unused_registers":"false",
+"hdl_primitive_input_multibit":"false",
+"hdl_record_naming_style":"%s[%s]",
+"hdl_reg_naming_style":"%s_reg%s",
+"hdl_rename_cdn_flop_pins":"",
+"hdl_report_case_info":"false",
+"hdl_resolve_instance_with_libcell":"false",
+"hdl_resolve_parameterized_instance_with_structural_module":"false",
+"hdl_sv_module_wrapper":"false",
+"hdl_sync_set_reset":"",
+"hdl_track_filename_row_col":"false",
+"hdl_track_module_elab_memory_and_runtime":"false",
+"hdl_unconnected_input_port_value":"0",
+"hdl_unconnected_marking_done":"true",
+"hdl_unconnected_value":"0",
+"hdl_unconnected_value":"0",
+"hdl_undriven_output_port_value":"0",
+"hdl_undriven_signal_value":"0",
+"hdl_use_block_prefix":"true",
+"hdl_use_current_dir_before_hdl_search_path":"false",
+"hdl_use_cw_first":"false",
+"hdl_use_default_parameter_values_in_design_name":"false",
+"hdl_use_default_parameter_values_in_name":"false",
+"hdl_use_for_generate_prefix":"true",
+"hdl_use_if_generate_prefix":"true",
+"hdl_use_parameterized_module_by_name":"false",
+"hdl_use_params_in_cell_search":"true",
+"hdl_use_port_default_value":"true",
+"hdl_verilog_defines":"SYNTHESIS",
+"hdl_vhdl_assign_width_mismatch":"false",
+"hdl_vhdl_case":"original",
+"hdl_vhdl_environment":"common",
+"hdl_vhdl_lrm_compliance":"false",
+"hdl_vhdl_preferred_architecture":"",
+"hdl_vhdl_range_opto":"false",
+"hdl_vhdl_read_version":"1993",
+"hdl_vname_hier_separator":"/",
+"hdl_zero_replicate_is_null":"true",
+"init_hdl_search_path":"./ ../sky130_osu_sc_t18/18T_ms/lib ./hdl",
+"init_lib_search_path":"../sky130_osu_sc_t18/18T_ms/lib",
+"iopt_sequential_duplication":"false",
+"iopt_sequential_resynthesis":"true",
+"iopt_sequential_resynthesis_min_effort":"high",
+"lbr_seq_in_out_phase_opto":"false",
+"lef_library":"",
+"lib_search_path":"../sky130_osu_sc_t18/18T_ms/lib",
+"lp_clock_gating_auto_control":"none",
+"lp_insert_clock_gating":"false",
+"multibit_allow_unused_bits":"true",
+"multibit_auto_exclude_registers_with_exceptions":"false",
+"multibit_cells_from_different_busses":"true",
+"multibit_predefined_allow_unused_bits":"false",
+"multibit_prefix_string":"CDN_MBIT_",
+"multibit_preserve_inferred_instances":"false",
+"multibit_preserved_net_check":"false",
+"multibit_seqs_instance_naming_style":"concat",
+"multibit_seqs_members_naming_style":"%s%d %s%d_reg %s_%d_ %s_%d_reg {%s[%d]} {%s[%d]_reg}",
+"multibit_seqs_name_concat_string":"_MB_",
+"multibit_short_prefix_string":"_CDN_CPX_",
+"multibit_split_string":"_split_",
+"multibit_unused_input_value":"0",
+"one_pass_formal_verification":"false",
+"optimize_constant_0_flops":"true",
+"optimize_constant_1_flops":"true",
+"optimize_constant_feedback_seqs":"true",
+"optimize_constant_latches":"true",
+"optimize_merge_flops":"true",
+"optimize_merge_latches":"true",
+"optimize_seq_x_to":"0",
+"program_name":"Genus(TM) Synthesis Solution",
+"program_version":"20.11-s111_1",
+"ungroup_separator":"_",
+"use_abstract_models":"false",
+"wlec_add_golden_driver_info":"true",
+"wlec_add_noblack_box_retime_subdesign":"true",
+"wlec_alias_flow":"true",
+"wlec_analyze_abort":"false",
+"wlec_analyze_dp_flowgraph":"true",
+"wlec_analyze_module_partial_sum":"false",
+"wlec_analyze_setup":"false",
+"wlec_auto_analyze":"true",
+"wlec_cg_declone_hier_compare":"true",
+"wlec_checkpoint":"",
+"wlec_checkpoint_equations_only":"false",
+"wlec_compare_threads":"4",
+"wlec_composite_compare":"true",
+"wlec_cut_point":"none",
+"wlec_dft_constraint_file":"",
+"wlec_flatten_model_lib_latch_fold":"false",
+"wlec_flatten_model_lib_seq_redundant":"false",
+"wlec_g1_has_iso_inserted":"false",
+"wlec_gzip_fv_json":"false",
+"wlec_hier_comp_threshold":"50",
+"wlec_ignore_ovf":"false",
+"wlec_keep_top_level_constraints":"false",
+"wlec_lib_statetable":"true",
+"wlec_low_power_analysis":"false",
+"wlec_mapping_file_flow":"true",
+"wlec_multithread_license_list":"",
+"wlec_name_for_alias_flow":"original_name",
+"wlec_ncprotect_keydb":"true",
+"wlec_no_exit":"false",
+"wlec_old_lp_ec_flow":"false",
+"wlec_one_hot_mux":"false",
+"wlec_parallel_threads":"4",
+"wlec_post_add_notranslate_modules":"",
+"wlec_pre_compare":"",
+"wlec_pre_design_read":"",
+"wlec_pre_exit":"",
+"wlec_pre_read":"",
+"wlec_retime_module_uniquify":"true",
+"wlec_rtl_name_mapping_flow":"false",
+"wlec_rtl_names_flow":"false",
+"wlec_rtl_top":"",
+"wlec_run_hier_check_noneq":"false",
+"wlec_set_cdn_synth_root":"false",
+"wlec_skip_iso_check_hier_compare":"false",
+"wlec_skip_lvl_check_hier_compare":"false",
+"wlec_stop_after_syn_eqn_mismatch":"false",
+"wlec_uniquify":"true",
+"wlec_use_analyze_results":"true",
+"wlec_use_check_equation":"false",
+"wlec_use_constant_function_timing_model":"true",
+"wlec_use_cpf_for_library":"true",
+"wlec_use_extconst":"false",
+"wlec_use_io_pad":"true",
+"wlec_use_lec_model":"true",
+"wlec_use_smart_lec":"false",
+"wlec_verbose":"false",
+"wlec_write_cpf_lp_ec_flow":"true",
+"wlec_write_lec_flow_auto_submit":"false",
+"wlec_write_name_mapping_file":"false",
+"write_vlog_bit_blast_mapped_ports":"false",
+"write_vlog_convert_onebit_vector_to_scalar":"false",
+"write_vlog_empty_module_for_black_box":"false",
+"write_vlog_no_negative_index":"false",
+"object":"/",
+"type":"root"},
+{"commit_cpf_done":"false",
+"hdl_filelist":"{default -sv {SYNTHESIS} {hdl/adder.sv hdl/flopenr.sv hdl/mult_seq.sv} {./ ../sky130_osu_sc_t18/18T_ms/lib ./hdl} {}}",
+"hdl_parameters":"{WIDTH 16 0 1}",
+"hdl_user_name":"mult_seq",
+"is_retimed":"false",
+"lp_clock_gating_style":"latch",
+"pi_commit_done":"false",
+"state":"mapped",
+"obsolete_state":"mapped",
+"verification_directory":"fv/mult_seq",
+"has_dp_shared_gint":"false",
+"has_dp_rewrite_gint":"true",
+"object":"/designs/mult_seq",
+"type":"design"},
+{"checkpoint_equation":"\"  assign out_0 = ( ( in_0 * in_1 )  + in_2 ) ;     \"",
+"logical_hier":"false",
+"instances":"/designs/mult_seq/instances_hier/csa_tree_add1_add_30_16_groupi",
+"has_dp_shared_gint":"false",
+"has_dp_rewrite_gint":"false",
+"sub_arch":"non_booth",
+"object":"/designs/mult_seq/subdesigns/csa_tree_add1_add_30_16_group_2",
+"type":"subdesign"},
+{"logical_hier":"true",
+"instances":"/designs/mult_seq/instances_hier/reg1",
+"has_dp_shared_gint":"false",
+"has_dp_rewrite_gint":"false",
+"object":"/designs/mult_seq/subdesigns/flopenr_WIDTH32",
+"type":"subdesign"},
+{"files":"/home/rerra/sky130_cds/synth/../sky130_osu_sc_t18/18T_ms/lib/sky130_osu_sc_18T_ms_TT_1P8_25C.ccs.lib",
+"object":"/libraries/sky130_osu_sc_18T_ms_TT_1P8_25C.ccs",
+"type":"library"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[22]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[1]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[11]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[12]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[13]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[14]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[15]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[16]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[17]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[2]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[18]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[19]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[20]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[3]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[21]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[0]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[10]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[23]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[5]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[6]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[24]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[25]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[26]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[7]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[27]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[28]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[29]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[30]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[8]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[9]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[31]",
+"type":"instance"},
+{"sequential":"true",
+"gint_phase_inversion":"false",
+"latch":"false",
+"object":"/designs/mult_seq/instances_hier/reg1/instances_seq/q_reg[4]",
+"type":"instance"},
+{"index": "1", 
+ "date": "Sat Aug 06 17:33:07 UTC 2022",
+ "seconds": 1659807187.27239,
+ "netlist": "fv/mult_seq/fv_map.v.gz", 
+ "netlist_exists": "1", 
+ "netlist_normalize": "/home/rerra/sky130_cds/synth/fv/mult_seq/fv_map.v.gz", 
+ "netlist_mtime": "1659807186", 
+ "netlist_timestamp": "Sat Aug 06 17:33:06 UTC 2022", 
+ "netlist_size": "23231", 
+ "netlist_cksum": "327593541", 
+ "design_name": "mult_seq", 
+ "synth_workdir": "/home/rerra/sky130_cds/synth", 
+ "synthesis_command":"",
+ "current_label": "fv_map", 
+ "previous_label": "rtl", 
+ "write_verif_file_runtime": 0.7186549999999999 
+ }
+]
diff --git a/sky130_cds/synth/fv/mult_seq/fv_map.map.do b/sky130_cds/synth/fv/mult_seq/fv_map.map.do
new file mode 100755
index 000000000..556edfb0f
--- /dev/null
+++ b/sky130_cds/synth/fv/mult_seq/fv_map.map.do
@@ -0,0 +1,150 @@
+
+//input ports
+add mapped point a[15] a[15] -type PI PI
+add mapped point a[14] a[14] -type PI PI
+add mapped point a[13] a[13] -type PI PI
+add mapped point a[12] a[12] -type PI PI
+add mapped point a[11] a[11] -type PI PI
+add mapped point a[10] a[10] -type PI PI
+add mapped point a[9] a[9] -type PI PI
+add mapped point a[8] a[8] -type PI PI
+add mapped point a[7] a[7] -type PI PI
+add mapped point a[6] a[6] -type PI PI
+add mapped point a[5] a[5] -type PI PI
+add mapped point a[4] a[4] -type PI PI
+add mapped point a[3] a[3] -type PI PI
+add mapped point a[2] a[2] -type PI PI
+add mapped point a[1] a[1] -type PI PI
+add mapped point a[0] a[0] -type PI PI
+add mapped point b[15] b[15] -type PI PI
+add mapped point b[14] b[14] -type PI PI
+add mapped point b[13] b[13] -type PI PI
+add mapped point b[12] b[12] -type PI PI
+add mapped point b[11] b[11] -type PI PI
+add mapped point b[10] b[10] -type PI PI
+add mapped point b[9] b[9] -type PI PI
+add mapped point b[8] b[8] -type PI PI
+add mapped point b[7] b[7] -type PI PI
+add mapped point b[6] b[6] -type PI PI
+add mapped point b[5] b[5] -type PI PI
+add mapped point b[4] b[4] -type PI PI
+add mapped point b[3] b[3] -type PI PI
+add mapped point b[2] b[2] -type PI PI
+add mapped point b[1] b[1] -type PI PI
+add mapped point b[0] b[0] -type PI PI
+add mapped point clk clk -type PI PI
+add mapped point reset reset -type PI PI
+add mapped point en en -type PI PI
+
+//output ports
+add mapped point sum_q[31] sum_q[31] -type PO PO
+add mapped point sum_q[30] sum_q[30] -type PO PO
+add mapped point sum_q[29] sum_q[29] -type PO PO
+add mapped point sum_q[28] sum_q[28] -type PO PO
+add mapped point sum_q[27] sum_q[27] -type PO PO
+add mapped point sum_q[26] sum_q[26] -type PO PO
+add mapped point sum_q[25] sum_q[25] -type PO PO
+add mapped point sum_q[24] sum_q[24] -type PO PO
+add mapped point sum_q[23] sum_q[23] -type PO PO
+add mapped point sum_q[22] sum_q[22] -type PO PO
+add mapped point sum_q[21] sum_q[21] -type PO PO
+add mapped point sum_q[20] sum_q[20] -type PO PO
+add mapped point sum_q[19] sum_q[19] -type PO PO
+add mapped point sum_q[18] sum_q[18] -type PO PO
+add mapped point sum_q[17] sum_q[17] -type PO PO
+add mapped point sum_q[16] sum_q[16] -type PO PO
+add mapped point sum_q[15] sum_q[15] -type PO PO
+add mapped point sum_q[14] sum_q[14] -type PO PO
+add mapped point sum_q[13] sum_q[13] -type PO PO
+add mapped point sum_q[12] sum_q[12] -type PO PO
+add mapped point sum_q[11] sum_q[11] -type PO PO
+add mapped point sum_q[10] sum_q[10] -type PO PO
+add mapped point sum_q[9] sum_q[9] -type PO PO
+add mapped point sum_q[8] sum_q[8] -type PO PO
+add mapped point sum_q[7] sum_q[7] -type PO PO
+add mapped point sum_q[6] sum_q[6] -type PO PO
+add mapped point sum_q[5] sum_q[5] -type PO PO
+add mapped point sum_q[4] sum_q[4] -type PO PO
+add mapped point sum_q[3] sum_q[3] -type PO PO
+add mapped point sum_q[2] sum_q[2] -type PO PO
+add mapped point sum_q[1] sum_q[1] -type PO PO
+add mapped point sum_q[0] sum_q[0] -type PO PO
+
+//inout ports
+
+
+
+
+//Sequential Pins
+add mapped point reg1/q[22]/q reg1/q_reg[22]/Q  -type DFF DFF
+add mapped point reg1/q[22]/q reg1/q_reg[22]/QN  -type DFF DFF
+add mapped point reg1/q[1]/q reg1/q_reg[1]/Q  -type DFF DFF
+add mapped point reg1/q[1]/q reg1/q_reg[1]/QN  -type DFF DFF
+add mapped point reg1/q[11]/q reg1/q_reg[11]/Q  -type DFF DFF
+add mapped point reg1/q[11]/q reg1/q_reg[11]/QN  -type DFF DFF
+add mapped point reg1/q[12]/q reg1/q_reg[12]/Q  -type DFF DFF
+add mapped point reg1/q[12]/q reg1/q_reg[12]/QN  -type DFF DFF
+add mapped point reg1/q[13]/q reg1/q_reg[13]/Q  -type DFF DFF
+add mapped point reg1/q[13]/q reg1/q_reg[13]/QN  -type DFF DFF
+add mapped point reg1/q[14]/q reg1/q_reg[14]/Q  -type DFF DFF
+add mapped point reg1/q[14]/q reg1/q_reg[14]/QN  -type DFF DFF
+add mapped point reg1/q[15]/q reg1/q_reg[15]/Q  -type DFF DFF
+add mapped point reg1/q[15]/q reg1/q_reg[15]/QN  -type DFF DFF
+add mapped point reg1/q[16]/q reg1/q_reg[16]/Q  -type DFF DFF
+add mapped point reg1/q[16]/q reg1/q_reg[16]/QN  -type DFF DFF
+add mapped point reg1/q[17]/q reg1/q_reg[17]/Q  -type DFF DFF
+add mapped point reg1/q[17]/q reg1/q_reg[17]/QN  -type DFF DFF
+add mapped point reg1/q[2]/q reg1/q_reg[2]/Q  -type DFF DFF
+add mapped point reg1/q[2]/q reg1/q_reg[2]/QN  -type DFF DFF
+add mapped point reg1/q[18]/q reg1/q_reg[18]/Q  -type DFF DFF
+add mapped point reg1/q[18]/q reg1/q_reg[18]/QN  -type DFF DFF
+add mapped point reg1/q[19]/q reg1/q_reg[19]/Q  -type DFF DFF
+add mapped point reg1/q[19]/q reg1/q_reg[19]/QN  -type DFF DFF
+add mapped point reg1/q[20]/q reg1/q_reg[20]/Q  -type DFF DFF
+add mapped point reg1/q[20]/q reg1/q_reg[20]/QN  -type DFF DFF
+add mapped point reg1/q[3]/q reg1/q_reg[3]/Q  -type DFF DFF
+add mapped point reg1/q[3]/q reg1/q_reg[3]/QN  -type DFF DFF
+add mapped point reg1/q[21]/q reg1/q_reg[21]/Q  -type DFF DFF
+add mapped point reg1/q[21]/q reg1/q_reg[21]/QN  -type DFF DFF
+add mapped point reg1/q[0]/q reg1/q_reg[0]/Q  -type DFF DFF
+add mapped point reg1/q[0]/q reg1/q_reg[0]/QN  -type DFF DFF
+add mapped point reg1/q[10]/q reg1/q_reg[10]/Q  -type DFF DFF
+add mapped point reg1/q[10]/q reg1/q_reg[10]/QN  -type DFF DFF
+add mapped point reg1/q[23]/q reg1/q_reg[23]/Q  -type DFF DFF
+add mapped point reg1/q[23]/q reg1/q_reg[23]/QN  -type DFF DFF
+add mapped point reg1/q[5]/q reg1/q_reg[5]/Q  -type DFF DFF
+add mapped point reg1/q[5]/q reg1/q_reg[5]/QN  -type DFF DFF
+add mapped point reg1/q[6]/q reg1/q_reg[6]/Q  -type DFF DFF
+add mapped point reg1/q[6]/q reg1/q_reg[6]/QN  -type DFF DFF
+add mapped point reg1/q[24]/q reg1/q_reg[24]/Q  -type DFF DFF
+add mapped point reg1/q[24]/q reg1/q_reg[24]/QN  -type DFF DFF
+add mapped point reg1/q[25]/q reg1/q_reg[25]/Q  -type DFF DFF
+add mapped point reg1/q[25]/q reg1/q_reg[25]/QN  -type DFF DFF
+add mapped point reg1/q[26]/q reg1/q_reg[26]/Q  -type DFF DFF
+add mapped point reg1/q[26]/q reg1/q_reg[26]/QN  -type DFF DFF
+add mapped point reg1/q[7]/q reg1/q_reg[7]/Q  -type DFF DFF
+add mapped point reg1/q[7]/q reg1/q_reg[7]/QN  -type DFF DFF
+add mapped point reg1/q[27]/q reg1/q_reg[27]/Q  -type DFF DFF
+add mapped point reg1/q[27]/q reg1/q_reg[27]/QN  -type DFF DFF
+add mapped point reg1/q[28]/q reg1/q_reg[28]/Q  -type DFF DFF
+add mapped point reg1/q[28]/q reg1/q_reg[28]/QN  -type DFF DFF
+add mapped point reg1/q[29]/q reg1/q_reg[29]/Q  -type DFF DFF
+add mapped point reg1/q[29]/q reg1/q_reg[29]/QN  -type DFF DFF
+add mapped point reg1/q[30]/q reg1/q_reg[30]/Q  -type DFF DFF
+add mapped point reg1/q[30]/q reg1/q_reg[30]/QN  -type DFF DFF
+add mapped point reg1/q[8]/q reg1/q_reg[8]/Q  -type DFF DFF
+add mapped point reg1/q[8]/q reg1/q_reg[8]/QN  -type DFF DFF
+add mapped point reg1/q[9]/q reg1/q_reg[9]/Q  -type DFF DFF
+add mapped point reg1/q[9]/q reg1/q_reg[9]/QN  -type DFF DFF
+add mapped point reg1/q[31]/q reg1/q_reg[31]/Q  -type DFF DFF
+add mapped point reg1/q[31]/q reg1/q_reg[31]/QN  -type DFF DFF
+add mapped point reg1/q[4]/q reg1/q_reg[4]/Q  -type DFF DFF
+add mapped point reg1/q[4]/q reg1/q_reg[4]/QN  -type DFF DFF
+
+
+
+//Black Boxes
+
+
+
+//Empty Modules as Blackboxes
diff --git a/sky130_cds/synth/fv/mult_seq/fv_map.singlebit.original_name.alias.json.gz b/sky130_cds/synth/fv/mult_seq/fv_map.singlebit.original_name.alias.json.gz
new file mode 100755
index 000000000..7ec258a39
Binary files /dev/null and b/sky130_cds/synth/fv/mult_seq/fv_map.singlebit.original_name.alias.json.gz differ
diff --git a/sky130_cds/synth/fv/mult_seq/fv_map.v.gz b/sky130_cds/synth/fv/mult_seq/fv_map.v.gz
new file mode 100755
index 000000000..699aa1df3
Binary files /dev/null and b/sky130_cds/synth/fv/mult_seq/fv_map.v.gz differ
diff --git a/sky130_cds/synth/fv/mult_seq/read_libs.tcl b/sky130_cds/synth/fv/mult_seq/read_libs.tcl
new file mode 100755
index 000000000..35995eb23
--- /dev/null
+++ b/sky130_cds/synth/fv/mult_seq/read_libs.tcl
@@ -0,0 +1,3 @@
+add_search_path ../sky130_osu_sc_t18/18T_ms/lib -library -both
+read_library -liberty -both /home/rerra/sky130_cds/synth/../sky130_osu_sc_t18/18T_ms/lib/sky130_osu_sc_18T_ms_TT_1P8_25C.ccs.lib /home/rerra/sky130_cds/synth/../sky130_osu_sc_t18/18T_ms/lib/sky130_osu_sc_18T_ms_TT_1P8_25C.ccs.lib
+
diff --git a/sky130_cds/synth/fv/mult_seq/rtl_to_fv_map.do b/sky130_cds/synth/fv/mult_seq/rtl_to_fv_map.do
new file mode 100755
index 000000000..c098f44d9
--- /dev/null
+++ b/sky130_cds/synth/fv/mult_seq/rtl_to_fv_map.do
@@ -0,0 +1,173 @@
+tclmode
+
+# Generated by Genus(TM) Synthesis Solution 20.11-s111_1, revision 1.483c0
+# Generated on: Sat Aug 06 12:33:07 CDT 2022 (Sat Aug 06 17:33:07 UTC 2022)
+
+set_screen_display -noprogress
+set_dofile_abort exit
+
+### Alias mapping flow is enabled. ###
+# Root attribute 'wlec_rtl_name_mapping_flow' was 'false'.
+# Root attribute 'alias_flow'                 was 'true'.
+
+set lec_version [regsub {(-)[A-Za-z]} $env(LEC_VERSION) ""]
+
+# Turns on the flowgraph datapath solver.
+set wlec_analyze_dp_flowgraph true
+# Indicates that resource sharing datapath optimization is present.
+set share_dp_analysis         true
+
+# The flowgraph solver is recommended for datapath analysis in LEC 19.1 or newer.
+set lec_version_required "19.10100"
+if {$lec_version >= $lec_version_required &&
+    $wlec_analyze_dp_flowgraph} {
+    set DATAPATH_SOLVER_OPTION "-flowgraph"
+} elseif {$share_dp_analysis} {
+    set DATAPATH_SOLVER_OPTION "-share"
+} else {
+    set DATAPATH_SOLVER_OPTION ""
+}
+
+tcl_set_command_name_echo on
+
+set_log_file fv/mult_seq/rtl_to_fv_map.log -replace
+
+usage -auto -elapse
+
+set_verification_information rtl_fv_map_db
+
+read_implementation_information fv/mult_seq -revised fv_map
+
+# Root attribute 'wlec_multithread_license_list' can be used to specify a license list
+# for multithreaded processing. The default list is used otherwise.
+set_parallel_option -threads 1,4 -norelease_license
+set_compare_options -threads 1,4
+
+set env(RC_VERSION)     "20.11-s111_1"
+set env(CDN_SYNTH_ROOT) "/import/programs/cadence/GENUS/current/tools.lnx86"
+set CDN_SYNTH_ROOT      "/import/programs/cadence/GENUS/current/tools.lnx86"
+set env(CW_DIR) "/import/programs/cadence/GENUS/current/tools.lnx86/lib/chipware"
+set CW_DIR      "/import/programs/cadence/GENUS/current/tools.lnx86/lib/chipware"
+
+# default is to error out when module definitions are missing
+set_undefined_cell black_box -noascend -both
+
+add_search_path ../sky130_osu_sc_t18/18T_ms/lib -library -both
+read_library -liberty -both /home/rerra/sky130_cds/synth/../sky130_osu_sc_t18/18T_ms/lib/sky130_osu_sc_18T_ms_TT_1P8_25C.ccs.lib /home/rerra/sky130_cds/synth/../sky130_osu_sc_t18/18T_ms/lib/sky130_osu_sc_18T_ms_TT_1P8_25C.ccs.lib
+
+set_undriven_signal 0 -golden
+set lec_version_required "16.20100"
+if {$lec_version >= $lec_version_required} {
+    set_naming_style genus -golden
+} else {
+    set_naming_style rc -golden
+}
+set_naming_rule "%s\[%d\]" -instance_array -golden
+set_naming_rule "%s_reg" -register -golden
+set_naming_rule "%L.%s" "%L\[%d\].%s" "%s" -instance -golden
+set_naming_rule "%L.%s" "%L\[%d\].%s" "%s" -variable -golden
+set lec_version_required "17.10200"
+if {$lec_version >= $lec_version_required} {
+    set_naming_rule -ungroup_separator {_} -golden
+}
+
+# Align LEC's treatment of mismatched port widths with constant
+# connections with Genus's. Genus message CDFG-467 and LEC message
+# HRC3.6 may indicate the presence of this issue.
+# This option is only available with LEC 17.20-d301 or later.
+set lec_version_required "17.20301"
+if {$lec_version >= $lec_version_required} {
+    set_hdl_options -const_port_extend
+}
+
+set_hdl_options -VERILOG_INCLUDE_DIR "sep:src:cwd"
+delete_search_path -all -design -golden
+add_search_path ./ ../sky130_osu_sc_t18/18T_ms/lib ./hdl -design -golden
+read_design -enumconstraint -define SYNTHESIS  -merge bbox -golden -lastmod -noelab -sv09  hdl/adder.sv hdl/flopenr.sv hdl/mult_seq.sv
+elaborate_design -golden -root {mult_seq} -rootonly -rootonly  
+
+read_design -verilog95   -revised -lastmod -noelab fv/mult_seq/fv_map.v.gz
+elaborate_design -revised -root {mult_seq}
+
+uniquify -all -nolib -golden
+
+report_design_data
+report_black_box
+
+set_flatten_model -seq_constant
+set_flatten_model -seq_constant_x_to 0
+set_flatten_model -nodff_to_dlat_zero
+set_flatten_model -nodff_to_dlat_feedback
+set_flatten_model -hier_seq_merge
+
+set_flatten_model -balanced_modeling
+
+#add_name_alias fv/mult_seq/fv_map.singlebit.original_name.alias.json.gz -revised
+#set_mapping_method -alias -revised
+#add_renaming_rule r1alias _reg((\\\[%w\\\])*(/U\\\$%d)*)$ @1 -type dff dlat -both
+
+# Reports the quality of the implementation information.
+# This command is only available with LEC 20.10-p100 or later.
+set lec_version_required "20.10100"
+if {$lec_version >= $lec_version_required} {
+    check_verification_information
+}
+
+set_analyze_option -auto -report_map
+
+write_hier_compare_dofile hier_tmp1.lec.do -verbose -noexact_pin_match -constraint -usage \
+-replace -balanced_extraction -input_output_pin_equivalence \
+-prepend_string "report_design_data; report_unmapped_points -summary; report_unmapped_points -notmapped; analyze_datapath -module -verbose; eval analyze_datapath $DATAPATH_SOLVER_OPTION -verbose"
+run_hier_compare hier_tmp1.lec.do -dynamic_hierarchy
+
+report_hier_compare_result -dynamicflattened
+
+report_verification -hier -verbose
+
+write_verification_information
+report_verification_information
+
+# Reports how effective the implementation information was.
+# This command is only available with LEC 18.20-d330 or later.
+set lec_version_required "18.20330"
+if {$lec_version >= $lec_version_required} {
+    report_implementation_information
+}
+
+set_system_mode lec
+
+puts "No of compare points = [get_compare_points -count]"
+puts "No of diff points    = [get_compare_points -NONequivalent -count]"
+puts "No of abort points   = [get_compare_points -abort -count]"
+puts "No of unknown points = [get_compare_points -unknown -count]"
+if {[get_compare_points -count] == 0} {
+    puts "---------------------------------"
+    puts "ERROR: No compare points detected"
+    puts "---------------------------------"
+}
+if {[get_compare_points -NONequivalent -count] > 0} {
+    puts "------------------------------------"
+    puts "ERROR: Different Key Points detected"
+    puts "------------------------------------"
+}
+if {[get_compare_points -abort -count] > 0} {
+    puts "-----------------------------"
+    puts "ERROR: Abort Points detected "
+    puts "-----------------------------"
+}
+if {[get_compare_points -unknown -count] > 0} {
+    puts "----------------------------------"
+    puts "ERROR: Unknown Key Points detected"
+    puts "----------------------------------"
+}
+
+# Generate a detailed summary of the run.
+# This command is available with LEC 19.10-p100 or later.
+set lec_version_required "19.10100"
+if {$lec_version >= $lec_version_required} {
+analyze_results -logfiles fv/mult_seq/rtl_to_fv_map.log
+}
+
+vpxmode
+
+exit -f
diff --git a/sky130_cds/synth/fv/mult_seq/rtl_to_fv_map.do~ b/sky130_cds/synth/fv/mult_seq/rtl_to_fv_map.do~
new file mode 100755
index 000000000..bfb2c79d8
--- /dev/null
+++ b/sky130_cds/synth/fv/mult_seq/rtl_to_fv_map.do~
@@ -0,0 +1,137 @@
+tclmode
+
+# Generated by Genus(TM) Synthesis Solution 19.12-s121_1, revision 1.385c
+# Generated on: Thu Aug 04 09:49:15 CDT 2022 (Thu Aug 04 14:49:15 GMT 2022)
+
+set_screen_display -noprogress
+set_dofile_abort exit
+
+set lec_version [regsub {(-)[A-Za-z]} $env(LEC_VERSION) ""]
+
+tcl_set_command_name_echo on
+
+set_log_file fv/mult_seq/rtl_to_fv_map.log -replace
+
+usage -auto -elapse
+
+set_verification_information rtl_fv_map_db
+
+read_implementation_information fv/mult_seq -revised fv_map
+
+# Root attribute 'wlec_multithread_license_list' can be used to specify a license list
+# for multithreaded processing. The default list is used otherwise.
+set_parallel_option -threads 1,4 -norelease_license
+set_compare_options -threads 1,4
+
+set env(RC_VERSION)     "19.12-s121_1"
+set env(CDN_SYNTH_ROOT) "/programs/cadence/GENUS/current/tools.lnx86"
+set CDN_SYNTH_ROOT      "/programs/cadence/GENUS/current/tools.lnx86"
+set env(CW_DIR) "/programs/cadence/GENUS/current/tools.lnx86/lib/chipware"
+set CW_DIR      "/programs/cadence/GENUS/current/tools.lnx86/lib/chipware"
+
+# default is to error out when module definitions are missing
+set_undefined_cell black_box -noascend -both
+
+add_search_path ../sky130_osu_sc_t18/18T_ms/lib -library -both
+read_library -liberty -both /home/jstine/Desktop/sky130_cds/synth/../sky130_osu_sc_t18/18T_ms/lib/sky130_osu_sc_18T_ms_TT_1P8_25C.ccs.lib /home/jstine/Desktop/sky130_cds/synth/../sky130_osu_sc_t18/18T_ms/lib/sky130_osu_sc_18T_ms_TT_1P8_25C.ccs.lib
+
+set_undriven_signal 0 -golden
+set_naming_style rc -golden
+set_naming_rule "%s\[%d\]" -instance_array -golden
+set_naming_rule "%s_reg" -register -golden
+set_naming_rule "%L.%s" "%L\[%d\].%s" "%s" -instance -golden
+set_naming_rule "%L.%s" "%L\[%d\].%s" "%s" -variable -golden
+
+# Align LEC's treatment of mismatched port widths with constant
+# connections with Genus's. Genus message CDFG-467 and LEC message
+# HRC3.6 may indicate the presence of this issue. This option is
+# only available with LEC 17.20-d301 or later.
+set lec_version_required "17.20301"
+if {$lec_version >= $lec_version_required} {
+    set_hdl_options -const_port_extend
+}
+set_hdl_options -VERILOG_INCLUDE_DIR "incdir:sep:src:cwd"
+
+delete_search_path -all -design -golden
+add_search_path ./ ../sky130_osu_sc_t18/18T_ms/lib ./hdl -design -golden
+read_design -enumconstraint -define SYNTHESIS  -merge bbox -golden -lastmod -noelab -sv09  hdl/adder.sv hdl/flopenr.sv hdl/mult_seq.sv
+elaborate_design -golden -root {mult_seq} -rootonly -rootonly  
+
+read_design -verilog95   -revised -lastmod -noelab fv/mult_seq/fv_map.v.gz
+elaborate_design -revised -root {mult_seq}
+
+uniquify -all -nolib -golden
+
+report_design_data
+report_black_box
+
+set_flatten_model -seq_constant
+set_flatten_model -seq_constant_x_to 0
+set_flatten_model -nodff_to_dlat_zero
+set_flatten_model -nodff_to_dlat_feedback
+set_flatten_model -hier_seq_merge
+
+set_flatten_model -balanced_modeling
+
+#add_name_alias fv/mult_seq/fv_map.singlebit.original_name.alias.json.gz -revised
+#set_mapping_method -alias -revised
+#add_renaming_rule r1alias _reg((\\\[%w\\\])*(/U\\\$%d)*)$ @1 -type dff dlat -both
+
+set_analyze_option -auto -report_map
+
+write_hier_compare_dofile hier_tmp1.lec.do -noexact_pin_match -constraint -usage \
+-replace -balanced_extraction -input_output_pin_equivalence \
+-prepend_string "report_design_data; report_unmapped_points -summary; report_unmapped_points -notmapped; analyze_datapath -module -verbose ; analyze_datapath -share -verbose"
+run_hier_compare hier_tmp1.lec.do -dynamic_hierarchy
+
+report_hier_compare_result -dynamicflattened
+
+report_verification -hier -verbose
+
+write_verification_information
+report_verification_information
+
+# Reports how effective the implementation information was.
+# This command is only available with LEC 18.20-d330 or later.
+set lec_version_required "18.20330"
+if {$lec_version >= $lec_version_required} {
+    report_implementation_information
+}
+
+set_system_mode lec
+
+puts "No of compare points = [get_compare_points -count]"
+puts "No of diff points    = [get_compare_points -NONequivalent -count]"
+puts "No of abort points   = [get_compare_points -abort -count]"
+puts "No of unknown points = [get_compare_points -unknown -count]"
+if {[get_compare_points -count] == 0} {
+    puts "---------------------------------"
+    puts "ERROR: No compare points detected"
+    puts "---------------------------------"
+}
+if {[get_compare_points -NONequivalent -count] > 0} {
+    puts "------------------------------------"
+    puts "ERROR: Different Key Points detected"
+    puts "------------------------------------"
+}
+if {[get_compare_points -abort -count] > 0} {
+    puts "-----------------------------"
+    puts "ERROR: Abort Points detected "
+    puts "-----------------------------"
+}
+if {[get_compare_points -unknown -count] > 0} {
+    puts "----------------------------------"
+    puts "ERROR: Unknown Key Points detected"
+    puts "----------------------------------"
+}
+
+# Generate a detailed summary of the run.
+# This command is available with LEC 19.10-p100 or later.
+set lec_version_required "19.10100"
+if {$lec_version >= $lec_version_required} {
+    analyze_results -logfiles fv/mult_seq/rtl_to_fv_map.log
+}
+
+vpxmode
+
+exit -f
diff --git a/sky130_cds/synth/genus.cmd b/sky130_cds/synth/genus.cmd
new file mode 100755
index 000000000..6b9a8d424
--- /dev/null
+++ b/sky130_cds/synth/genus.cmd
@@ -0,0 +1,9 @@
+# Cadence Genus(TM) Synthesis Solution, Version 20.11-s111_1, built Apr 26 2021 14:57:38
+
+# Date: Sat Aug 06 12:29:30 2022
+# Host: sakuya.ecen.okstate.edu (x86_64 w/Linux 3.10.0-1160.71.1.el7.x86_64) (16cores*32cpus*1physical cpu*AMD Ryzen 9 3950X 16-Core Processor 512KB)
+# OS:   Red Hat Enterprise Linux Server release 7.9 (Maipo)
+
+source genus_script.tcl
+rxit
+exit
diff --git a/sky130_cds/synth/genus.cmd1 b/sky130_cds/synth/genus.cmd1
new file mode 100755
index 000000000..de7046274
--- /dev/null
+++ b/sky130_cds/synth/genus.cmd1
@@ -0,0 +1,7 @@
+# Cadence Genus(TM) Synthesis Solution, Version 20.11-s111_1, built Apr 26 2021 14:57:38
+
+# Date: Sat Aug 06 12:32:43 2022
+# Host: sakuya.ecen.okstate.edu (x86_64 w/Linux 3.10.0-1160.71.1.el7.x86_64) (16cores*32cpus*1physical cpu*AMD Ryzen 9 3950X 16-Core Processor 512KB)
+# OS:   Red Hat Enterprise Linux Server release 7.9 (Maipo)
+
+source genus_script.tcl
diff --git a/sky130_cds/synth/genus.log1 b/sky130_cds/synth/genus.log1
new file mode 100755
index 000000000..9fd303569
--- /dev/null
+++ b/sky130_cds/synth/genus.log1
@@ -0,0 +1,1180 @@
+Cadence Genus(TM) Synthesis Solution.
+Copyright 2021 Cadence Design Systems, Inc. All rights reserved worldwide.
+Cadence and the Cadence logo are registered trademarks and Genus is a trademark
+of Cadence Design Systems, Inc. in the United States and other countries.
+
+Version: 20.11-s111_1, built Mon Apr 26 12:57:38 PDT 2021
+Options: -files genus_script.tcl 
+Date:    Sat Aug 06 12:32:43 2022
+Host:    sakuya.ecen.okstate.edu (x86_64 w/Linux 3.10.0-1160.71.1.el7.x86_64) (16cores*32cpus*1physical cpu*AMD Ryzen 9 3950X 16-Core Processor 512KB) (131831340KB)
+PID:     9399
+OS:      Red Hat Enterprise Linux Server release 7.9 (Maipo)
+
+Checking out license: Genus_Synthesis
+
+
+***********************************************************************************************************
+***********************************************************************************************************
+
+
+
+Loading tool scripts...
+Finished loading tool scripts (6 seconds elapsed).
+
+#@ Processing -files option
+@genus 1> source genus_script.tcl
+#@ Begin verbose source ./genus_script.tcl
+@file(genus_script.tcl) 1: set s8lib ../sky130_osu_sc_t18/18T_ms/lib
+@file(genus_script.tcl) 3: set_db init_lib_search_path $s8lib
+  Setting attribute of root '/': 'init_lib_search_path' = ../sky130_osu_sc_t18/18T_ms/lib
+@file(genus_script.tcl) 4: set search_path [list "./" ]
+@file(genus_script.tcl) 5: lappend search_path $s8lib
+@file(genus_script.tcl) 6: lappend search_path "./hdl"
+@file(genus_script.tcl) 8: set_db init_hdl_search_path $search_path
+  Setting attribute of root '/': 'init_hdl_search_path' = ./ ../sky130_osu_sc_t18/18T_ms/lib ./hdl
+@file(genus_script.tcl) 9: read_libs sky130_osu_sc_18T_ms_TT_1P8_25C.ccs.lib 
+
+Threads Configured:3
+Info    : Created nominal operating condition. [LBR-412]
+        : Operating condition '_nominal_' was created for the PVT values (1.000000, 1.800000, 25.000000) in library 'sky130_osu_sc_18T_ms_TT_1P8_25C.ccs.lib'.
+        : The nominal operating condition is represented, either by the nominal PVT values specified in the library source (via nom_process,nom_voltage and nom_temperature respectively), or by the default PVT values (1.0,1.0,1.0).
+Warning : Library cell has no output pins defined. [LBR-9]
+        : Library cell 'sky130_osu_sc_18T_ms__ant' must have an output pin.
+        : Add the missing output pin(s), then reload the library. Else the library cell will be marked as timing model i.e. unusable. Timing_model means that the cell does not have any defined function. If there is no output pin, Genus will mark library cell as unusable i.e. the attribute 'usable' will be marked to 'false' on the libcell. Therefore, the cell is not used for mapping and it will not be picked up from the library for synthesis. If you query the attribute 'unusable_reason' on the libcell; result will be: 'Library cell has no output pins.'Note: The message LBR-9 is only for the logical pins and not for the power_ground pins. Genus will depend upon the output function defined in the pin group (output pin) of the cell, to use it for mapping. The pg_pin will not have any function defined.
+Warning : Library cell has no output pins defined. [LBR-9]
+        : Library cell 'sky130_osu_sc_18T_ms__ant' must have an output pin.
+@file(genus_script.tcl) 11: set my_verilog_files [list adder.sv flopenr.sv flop.sv mult_seq.sv]
+@file(genus_script.tcl) 13: set my_toplevel "mult_seq"
+@file(genus_script.tcl) 15: read_hdl -language sv $my_verilog_files
+@file(genus_script.tcl) 16: elaborate $my_toplevel
+Warning : Libcell will be treated as a timing model. [LBR-158]
+        : Lib_pin 'sky130_osu_sc_18T_ms__buf_6/Y' has no incoming arcs.
+        : Ensure that the relevant timing arcs are defined in the Liberty model of the libcell.
+  Library has 45 usable logic and 8 usable sequential lib-cells.
+Info    : Elaborating Design. [ELAB-1]
+        : Elaborating top-level block 'mult_seq' from file './hdl/mult_seq.sv'.
+Warning : Using default parameter value for module elaboration. [CDFG-818]
+        : Elaborating block 'mult_seq' with default parameters value.
+Info    : Done Elaborating Design. [ELAB-3]
+        : Done elaborating 'mult_seq'.
+Checking for analog nets...
+Check completed for analog nets.
+Checking for source RTL...
+Check completed for source RTL.
+Running Unified Mux Engine Tricks...
+Completed Unified Mux Engine Tricks
+--------------------------------------------------------
+| Trick             | Accepts | Rejects | Runtime (ms) | 
+--------------------------------------------------------
+| ume_constant_bmux |       0 |       0 |         0.00 | 
+--------------------------------------------------------
+Starting clip mux common data inputs [v1.0] (stage: post_elab, startdef: mult_seq, recur: true)
+Completed clip mux common data inputs (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting clip the non-user hierarchies [v2.0] (stage: post_elab, startdef: mult_seq, recur: true)
+Completed clip the non-user hierarchies (accepts: 0, rejects: 0, runtime: 0.001s)
+UM:   flow.cputime  flow.realtime  timing.setup.tns  timing.setup.wns  snapshot
+UM:*                                                                   elaborate
+@file(genus_script.tcl) 19: set my_clock_pin "clk"
+@file(genus_script.tcl) 20: set my_clk_freq_MHz 100
+@file(genus_script.tcl) 21: set my_period [expr 1000 / $my_clk_freq_MHz]
+@file(genus_script.tcl) 22: set my_uncertainty [expr .1 * $my_period]
+@file(genus_script.tcl) 25: set find_clock $my_clock_pin
+@file(genus_script.tcl) 26: if {  $find_clock != [list] } {
+    echo "Found clock!"
+    set my_clk $my_clock_pin
+} 
+Found clock!
+@file(genus_script.tcl) 30: set all_in_ex_clk [remove_from_collection [all_inputs] [get_ports "clk"]]
+@file(genus_script.tcl) 31: set all_out [all_outputs]
+@file(genus_script.tcl) 33: read_sdc constraints_top.sdc
+Statistics for commands executed by read_sdc:
+ "all_outputs"              - successful      1 , failed      0 (runtime  0.00)
+ "create_clock"             - successful      1 , failed      0 (runtime  0.00)
+ "get_clocks"               - successful      3 , failed      0 (runtime  0.00)
+ "get_ports"                - successful      3 , failed      0 (runtime  0.00)
+ "load_of"                  - successful      1 , failed      0 (runtime  0.00)
+ "set_clock_uncertainty"    - successful      1 , failed      0 (runtime  0.00)
+ "set_driving_cell"         - successful      1 , failed      0 (runtime  0.00)
+ "set_input_delay"          - successful      1 , failed      0 (runtime  0.00)
+ "set_load"                 - successful      1 , failed      0 (runtime  0.00)
+ "set_output_delay"         - successful      1 , failed      0 (runtime  0.00)
+read_sdc completed in 00:00:00 (hh:mm:ss)
+@file(genus_script.tcl) 35: set_db syn_generic_effort medium
+  Setting attribute of root '/': 'syn_generic_effort' = medium
+@file(genus_script.tcl) 36: set_db syn_map_effort medium
+  Setting attribute of root '/': 'syn_map_effort' = medium
+@file(genus_script.tcl) 37: set_db syn_opt_effort medium
+  Setting attribute of root '/': 'syn_opt_effort' = medium
+@file(genus_script.tcl) 39: syn_generic
+##Generic Timing Info for library domain: _default_ typical gate delay: 340.3 ps std_slew: 54.9 ps std_load: 58.0 fF
+Starting mux data reorder optimization [v1.0] (stage: pre_to_gen_setup, startdef: mult_seq, recur: true)
+Completed mux data reorder optimization (accepts: 0, rejects: 0, runtime: 0.000s)
+Info    : Synthesizing. [SYNTH-1]
+        : Synthesizing 'mult_seq' to generic gates using 'medium' effort.
+PBS_Generic-Start - Elapsed_Time 0, CPU_Time 0.0
+stamp 'PBS_Generic-Start' being created for table 'pbs_debug'
+
+  Total Time (Wall) |  Stage Time (Wall)  |   % (Wall)   |    Date - Time     |  Memory   | Stage
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:06(00:00:03) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:32:49 (Aug06) |  292.0 MB | PBS_Generic-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+Number of threads: 8 * 1   (id: pbs_debug, time_info v1.57)
+Info: (*N*) indicates data that was populated from previously saved time_info database
+Info: CPU time includes time of parent + longest thread
+TNS Restructuring config: no_value at stage: generic applied.
+Info    : Partition Based Synthesis execution skipped. [PHYS-752]
+        : Design size is less than the partition size '100000' for distributed generic optimization to kick in.
+Starting mux data reorder optimization [v1.0] (stage: pre_to_gen_setup, startdef: mult_seq, recur: true)
+Completed mux data reorder optimization (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting mux data reorder optimization [v1.0] (stage: post_to_gen_setup, startdef: mult_seq, recur: true)
+Completed mux data reorder optimization (accepts: 0, rejects: 0, runtime: 0.000s)
+Running Unified Mux Engine Tricks...
+Completed Unified Mux Engine Tricks
+--------------------------------------------
+| Trick | Accepts | Rejects | Runtime (ms) | 
+--------------------------------------------
+--------------------------------------------
+Starting infer macro optimization [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed infer macro optimization (accepts: 0, rejects: 0, runtime: 0.001s)
+Starting decode mux sandwich optimization [v2.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed decode mux sandwich optimization (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting decode mux optimization [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed decode mux optimization (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting chop wide muxes [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed chop wide muxes (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting common data mux cascade opt [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed common data mux cascade opt (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting mux input consolidation [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed mux input consolidation (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting priority mux optimization [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed priority mux optimization (accepts: 0, rejects: 0, runtime: 0.033s)
+Starting constant-data mux optimization [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed constant-data mux optimization (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting chain-to-tree inequality transform [v2.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed chain-to-tree inequality transform (accepts: 0, rejects: 0, runtime: 0.002s)
+Starting reconvergence optimization [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed reconvergence optimization (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting logic restructure optimization [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed logic restructure optimization (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting common select mux optimization [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed common select mux optimization (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting identity transform [v3.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed identity transform (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting reduce operator chain [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed reduce operator chain (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting common data mux cascade opt [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed common data mux cascade opt (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting mux input consolidation [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed mux input consolidation (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting optimize datapath elements [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed optimize datapath elements (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting clip mux common data inputs [v1.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed clip mux common data inputs (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting clip the non-user hierarchies [v2.0] (stage: pre_rtlopt, startdef: mult_seq, recur: true)
+Completed clip the non-user hierarchies (accepts: 0, rejects: 0, runtime: 0.000s)
+Running Unified Mux Engine Tricks...
+Completed Unified Mux Engine Tricks
+--------------------------------------------
+| Trick | Accepts | Rejects | Runtime (ms) | 
+--------------------------------------------
+--------------------------------------------
+Number of big hc bmuxes before = 0
+Info    : Pre-processed datapath logic. [DPOPT-6]
+        : No pre-processing optimizations applied to datapath logic in 'mult_seq'.
+Info    : Optimizing datapath logic. [DPOPT-1]
+        : Optimizing datapath logic in 'mult_seq'.
+Info    : Implementing datapath configurations. [DPOPT-3]
+        : Implementing datapath configurations for 'CDN_DP_region_1_0'
+CSAGen Prep Share:0 Re-Write:0 Speculation: 0
+MaxCSA: Successfully built Maximal CSA Expression Expr0
+CDN_DP_region_1_0 level = 0 loads = 0 drivers = 0
+CDN_DP_region_1_0_c0 in mult_seq: area: 43293608800 ,dp = 2 mux = 0 sg = slow         worst_clk_period: 0.0000 
+    wns: 201  norm_wns:  0.0000 
+    fail_endp: 0 
+    tns:  603  tns_per_endp:  0.0000   norm_tns_per_endp:  0.0000 
+    tns_sense_max:  0.0000  tns_sense_avg:  0.0000   tns_sense_num: 0
+ skipped
+CDN_DP_region_1_0_c1 in mult_seq: area: 39809626080 ,dp = 1 mux = 0 sg = fast         worst_clk_period: 0.0000 
+    wns: 0  norm_wns:  0.0000 
+    fail_endp: 0 
+    tns:  0  tns_per_endp:  0.0000   norm_tns_per_endp:  0.0000 
+    tns_sense_max:  0.0000  tns_sense_avg:  0.0000   tns_sense_num: 0
+ is current best
+CDN_DP_region_1_0_c2 in mult_seq: area: 39809626080 ,dp = 1 mux = 0 sg = very_slow    worst_clk_period: 0.0000 
+    wns: 0  norm_wns:  0.0000 
+    fail_endp: 0 
+    tns:  0  tns_per_endp:  0.0000   norm_tns_per_endp:  0.0000 
+    tns_sense_max:  0.0000  tns_sense_avg:  2.0000   tns_sense_num: 0
+ is current best
+CDN_DP_region_1_0_c3 in mult_seq: area: 39809626080 ,dp = 1 mux = 0 sg = very_fast    worst_clk_period: 0.0000 
+    wns: 0  norm_wns:  0.0000 
+    fail_endp: 0 
+    tns:  0  tns_per_endp:  0.0000   norm_tns_per_endp:  0.0000 
+    tns_sense_max:  0.0000  tns_sense_avg:  0.0000   tns_sense_num: 0
+ is current best
+CDN_DP_region_1_0_c4 in mult_seq: area: 39809626080 ,dp = 1 mux = 0 sg = very_fast    worst_clk_period: 0.0000 
+    wns: 0  norm_wns:  0.0000 
+    fail_endp: 0 
+    tns:  0  tns_per_endp:  0.0000   norm_tns_per_endp:  0.0000 
+    tns_sense_max:  0.0000  tns_sense_avg:  0.0000   tns_sense_num: 0
+ is current best
+CDN_DP_region_1_0_c5 in mult_seq: area: 39809626080 ,dp = 1 mux = 0 sg = very_fast    worst_clk_period: 0.0000 
+    wns: 0  norm_wns:  0.0000 
+    fail_endp: 0 
+    tns:  0  tns_per_endp:  0.0000   norm_tns_per_endp:  0.0000 
+    tns_sense_max:  0.0000  tns_sense_avg:  0.0000   tns_sense_num: 0
+ is current best
+CDN_DP_region_1_0_c6 in mult_seq: area: 39809626080 ,dp = 1 mux = 0 sg = very_fast    worst_clk_period: 0.0000 
+    wns: 0  norm_wns:  0.0000 
+    fail_endp: 0 
+    tns:  0  tns_per_endp:  0.0000   norm_tns_per_endp:  0.0000 
+    tns_sense_max:  0.0000  tns_sense_avg:  -4592024818112433113055924603578228318651716124256742338751951980258966042238682008328026490274505403588076146579749829674463417221587339140951942891348252576336617666282264024448754698538468265274983540509300229088506558789349756896355470694762073915775119587644729501520232448.0000   tns_sense_num: 0
+ is current best
+CDN_DP_region_1_0_c7 in mult_seq: area: 40526916640 ,dp = 1 mux = 0 sg = very_fast    worst_clk_period: 0.0000 
+    wns: 0  norm_wns:  0.0000 
+    fail_endp: 0 
+    tns:  0  tns_per_endp:  0.0000   norm_tns_per_endp:  0.0000 
+    tns_sense_max:  0.0000  tns_sense_avg:  0.0000   tns_sense_num: 0
+
+Best config: CDN_DP_region_1_0_c6 in mult_seq: area: 39809626080 ,dp = 1 mux = 0 sg = very_fast    worst_clk_period: 0.0000 
+    wns: 0  norm_wns:  0.0000 
+    fail_endp: 0 
+    tns:  0  tns_per_endp:  0.0000   norm_tns_per_endp:  0.0000 
+    tns_sense_max:  0.0000  tns_sense_avg:  -4592024818112433113055924603578228318651716124256742338751951980258966042238682008328026490274505403588076146579749829674463417221587339140951942891348252576336617666282264024448754698538468265274983540509300229088506558789349756896355470694762073915775119587644729501520232448.0000   tns_sense_num: 0
+  Smallest config area : 39809626080.  Fastest config wns;  0
+##>+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
+##>Summary table of configs (Best config is CDN_DP_region_1_0_c6)
+##>+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
+##>                     0                  1                  2                  3                  4                  5                  6                  7            
+##>+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
+##>           Area      43293608800        39809626080        39809626080        39809626080        39809626080        39809626080        39809626080        40526916640  
+##>            WNS           -20.10           +1924.50           +1924.50           +1924.50           +1924.50           +1924.50           +1924.50           +1924.50  
+##>            TNS              603                  0                  0                  0                  0                  0                  0                  0  
+##>    Num Rewrite                0                  1                  1                  1                  1                  1                  1                  0  
+##>     Num Factor                0                  0                  0                  0                  0                  0                  0                  0  
+##>      Num Share                0                  0                  0                  0                  0                  0                  0                  0  
+##>   Num CmultCse                0                  0                  0                  0                  0                  0                  0                  0  
+##>   Num Downsize                0                  0                  0                  0                  0                  0                  0                  0  
+##>  Num Speculate                0                  0                  0                  0                  0                  0                  0                  0  
+##>     Runtime(s)                0                  0                  0                  0                  0                  0                  0                  5  
++----------------------------------------------------------------------------------------------------------------------------------------------------------------+
+##>
+##>
+##>+------------------------------------------------------------------------------------------------------------------------------------------------------------+
+##>Optimization Step DEBUG Table for config CDN_DP_region_1_0_c6
+##>
+##>                          Step                        Area   ( % Chg)        WNS (Change)        TNS (Change)          Runtime (s)        Comment                   
+##>+------------------------------------------------------------------------------------------------------------------------------------------------------------+
+##>createMaxCarrySave              START            43293608800 (      )    107374162.30 (        )             0 (        )              
+##> datapath_rewrite_one_def       START            43293608800 ( +0.00)    107374162.30 (   +0.00)             0 (       0)              
+##>  fast_cse_elim                 START            43293608800 ( +0.00)    107374162.30 (   +0.00)             0 (       0)              
+##>                                  END            43293608800 ( +0.00)    107374162.30 (   +0.00)             0 (       0)           0  
+##>  fast_cse_elim                 START            43293608800 ( +0.00)    107374162.30 (   +0.00)             0 (       0)              
+##>                                  END            43293608800 ( +0.00)    107374162.30 (   +0.00)             0 (       0)           0  
+##>                                  END            43293608800 ( +0.00)    107374162.30 (   +0.00)             0 (       0)           0  
+##> dpopt_share_one_def            START            43293608800 ( +0.00)    107374162.30 (   +0.00)             0 (       0)              
+##>                                  END            43293608800 ( +0.00)    107374162.30 (   +0.00)             0 (       0)           0  
+##> csa_opto                       START            43293608800 ( +0.00)    214748364.70 (+107374202.40)             0 (       0)              
+##>                                  END            39891602144 ( -7.86)    214748364.70 (   +0.00)             0 (       0)           0  
+##>                                  END            39891602144 ( -7.86)    214748364.70 (+107374202.40)             0 (       0)           0  
+##>canonicalize_by_names           START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##>datapath_rewrite_post_csa_one_  START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##>datapath_csa_factoring_one_gde  START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##>dpopt_share_one_def             START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##>datapath_rewrite_post_share     START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##>dp_combine_const_mult_with_com  START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##>dp_operator_level_decompositio  START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##>selective_flatten_dp_config     START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##>createMaxCarrySave              START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##> datapath_rewrite_one_def       START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>  fast_cse_elim                 START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##>  fast_cse_elim                 START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##>  rewrite                       START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              (a,ar) add_ci --> add_and_inc 
+##>                                  END            39809626080 ( -0.21)    214748364.70 (   +0.00)             0 (       0)           0  
+##>                                  END            39809626080 ( -0.21)    214748364.70 (   +0.00)             0 (       0)           0  
+##> dpopt_share_one_def            START            39809626080 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39809626080 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##> csa_opto                       START            39809626080 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39891602144 ( +0.21)    214748364.70 (   +0.00)             0 (       0)           0  
+##>                                  END            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##>context_based_simplify          START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##>group_csa_final_adder_dp        START            39891602144 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39809626080 ( -0.21)    214748364.70 (   +0.00)             0 (       0)           0  
+##>dpopt_flatten_critical_muxes_i  START            39809626080 ( +0.00)    214748364.70 (   +0.00)             0 (       0)              
+##>                                  END            39809626080 ( +0.00)    214748364.70 (   +0.00)             0 (       0)           0  
+##>create_score                    START            39809626080 ( +0.00)     1924.50 (-214746440.20)             0 (       0)              
+##>                                  END            39809626080 ( +0.00)     1924.50 (   +0.00)             0 (       0)           0  
+##>+------------------------------------------------------------------------------------------------------------------------------------------------------------+
+Committed config: CDN_DP_region_1_0_c6
+Info    : Done implementing datapath configurations. [DPOPT-4]
+        : Selected 'very_fast' configuration 6 for module 'CDN_DP_region_1_0'.
+          Optimizations applied to 'very_fast' configuration:
+            rewriting(1), factoring(0), sharing(0), cmultcse(0), downsizing(0), speculation(0)
+Info    : Done optimizing datapath logic. [DPOPT-2]
+        : Done optimizing datapath logic in 'mult_seq'.
+Number of big hc bmuxes after = 0
+Starting logic reduction [v1.0] (stage: post_rtlopt, startdef: mult_seq, recur: true)
+Completed logic reduction (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting mux data reorder optimization [v1.0] (stage: post_rtlopt, startdef: mult_seq, recur: true)
+Completed mux data reorder optimization (accepts: 0, rejects: 0, runtime: 0.000s)
+Starting mux speculation [v1.0] (stage: post_muxopt, startdef: mult_seq, recur: true)
+Starting speculation optimization
+Completed speculation optimization (accepts:0)
+Completed mux speculation (accepts: 0, rejects: 0, runtime: 0.029s)
+==================================
+Stage : to_generic 
+==================================
+  =================
+   Message Summary
+  =================
+--------------------------------------------------------------------------------
+|    Id     |  Sev   |Count |                  Message Text                    |
+--------------------------------------------------------------------------------
+| CDFG-372  |Info    |    1 |Bitwidth mismatch in assignment.                  |
+|           |        |      |Review and make sure the mismatch is              |
+|           |        |      | unintentional. Genus can possibly issue bitwidth |
+|           |        |      | mismatch warning for explicit assignments        |
+|           |        |      | present in RTL as-well-as for implicit           |
+|           |        |      | assignments inferred by the tool. For example,   |
+|           |        |      | in case of enum declaration without value, the   |
+|           |        |      | tool will implicitly assign value to the enum    |
+|           |        |      | variables. It also issues the warning for any    |
+|           |        |      | bitwidth mismatch that appears in this implicit  |
+|           |        |      | assignment.                                      |
+| CDFG-818  |Warning |    1 |Using default parameter value for module          |
+|           |        |      | elaboration.                                     |
+| CWD-19    |Info    |   30 |An implementation was inferred.                   |
+| DPOPT-1   |Info    |    1 |Optimizing datapath logic.                        |
+| DPOPT-2   |Info    |    1 |Done optimizing datapath logic.                   |
+| DPOPT-3   |Info    |    1 |Implementing datapath configurations.             |
+| DPOPT-4   |Info    |    1 |Done implementing datapath configurations.        |
+| DPOPT-6   |Info    |    1 |Pre-processed datapath logic.                     |
+| ELAB-1    |Info    |    1 |Elaborating Design.                               |
+| ELAB-2    |Info    |    2 |Elaborating Subdesign.                            |
+| ELAB-3    |Info    |    1 |Done Elaborating Design.                          |
+| GLO-51    |Info    |    1 |Hierarchical instance automatically ungrouped.    |
+|           |        |      |Hierarchical instances can be automatically       |
+|           |        |      | ungrouped to allow for better area or timing     |
+|           |        |      | optimization. To prevent this ungroup, set the   |
+|           |        |      | root-level attribute 'auto_ungroup' to 'none'.   |
+|           |        |      | You can also prevent individual ungroup with     |
+|           |        |      | setting the attribute 'ungroup_ok' of instances  |
+|           |        |      | or modules to 'false'.                           |
+| LBR-9     |Warning |    2 |Library cell has no output pins defined.          |
+|           |        |      |Add the missing output pin(s)                     |
+|           |        |      | , then reload the library. Else the library cell |
+|           |        |      | will be marked as timing model i.e. unusable.    |
+|           |        |      | Timing_model means that the cell does not have   |
+|           |        |      | any defined function. If there is no output pin, |
+|           |        |      | Genus will mark library cell as unusable i.e.    |
+|           |        |      | the attribute 'usable' will be marked to 'false' |
+|           |        |      | on the libcell. Therefore, the cell is not used  |
+|           |        |      | for mapping and it will not be picked up from    |
+|           |        |      | the library for synthesis. If you query the      |
+|           |        |      | attribute 'unusable_reason' on the libcell;      |
+|           |        |      | result will be: 'Library cell has no output      |
+|           |        |      | pins.'Note: The message LBR-9 is only for the    |
+|           |        |      | logical pins and not for the power_ground pins.  |
+|           |        |      | Genus will depend upon the output function       |
+|           |        |      | defined in the pin group (output pin)            |
+|           |        |      | of the cell, to use it for mapping. The pg_pin   |
+|           |        |      | will not have any function defined.              |
+| LBR-155   |Info    |    2 |Mismatch in unateness between 'timing_sense'      |
+|           |        |      | attribute and the function.                      |
+|           |        |      |The 'timing_sense' attribute will be respected.   |
+| LBR-158   |Warning |    1 |Libcell will be treated as a timing model.        |
+|           |        |      |Ensure that the relevant timing arcs are defined  |
+|           |        |      | in the Liberty model of the libcell.             |
+| LBR-162   |Info    |   19 |Both 'pos_unate' and 'neg_unate' timing_sense     |
+|           |        |      | arcs have been processed.                        |
+|           |        |      |Setting the 'timing_sense' to non_unate.          |
+| LBR-412   |Info    |    1 |Created nominal operating condition.              |
+|           |        |      |The nominal operating condition is represented,   |
+|           |        |      | either by the nominal PVT values specified in    |
+|           |        |      | the library source                               |
+|           |        |      | (via nom_process,nom_voltage and nom_temperature |
+|           |        |      | respectively)                                    |
+|           |        |      | , or by the default PVT values (1.0,1.0,1.0).    |
+| PHYS-752  |Info    |    1 |Partition Based Synthesis execution skipped.      |
+| RTLOPT-40 |Info    |    6 |Transformed datapath macro.                       |
+| SYNTH-1   |Info    |    1 |Synthesizing.                                     |
+| TIM-1000  |Info    |    1 |Multimode clock gating check is disabled.         |
+--------------------------------------------------------------------------------
+Mapper: Libraries have:
+	domain _default_: 45 combo usable cells and 8 sequential usable cells
+Multi-threaded constant propagation [1|0] ...
+Multi-threaded Virtual Mapping    (8 threads per ST process, 8 of 32 CPUs usable)
+Warning : The database contains a field that the reader does not support. [DATABASE-103]
+        : Unsupported data skipped.
+Warning : The database contains a field that the reader does not support. [DATABASE-103]
+        : Unsupported data skipped.
+==================================
+Stage : first_condense 
+==================================
+  =================
+   Message Summary
+  =================
+--------------------------------------------------------------------------------
+|      Id      |  Sev   |Count |                 Message Text                  |
+--------------------------------------------------------------------------------
+| DATABASE-103 |Warning |    2 |The database contains a field that the reader  |
+|              |        |      | does not support.                             |
+--------------------------------------------------------------------------------
+ 
+Global mapping target info
+==========================
+Cost Group 'clk' target slack:   266 ps
+Target path end-point (Pin: reg1/q_reg[31]/d)
+
+
+State Retention Synthesis Status
+================================
+
+Category                        Flops   Percentage
+--------------------------------------------------
+Total instances                    32        100.0
+Excluded from State Retention      32        100.0
+    - Will not convert             32        100.0
+      - Preserved                   0          0.0
+      - Power intent excluded      32        100.0
+    - Could not convert             0          0.0
+      - Scan type                   0          0.0
+      - No suitable cell            0          0.0
+State Retention instances           0          0.0
+--------------------------------------------------
+
+PBS_Generic_Opt-Post - Elapsed_Time 11, CPU_Time 11.543434000000001
+stamp 'PBS_Generic_Opt-Post' being created for table 'pbs_debug'
+
+  Total Time (Wall) |  Stage Time (Wall)  |   % (Wall)   |    Date - Time     |  Memory   | Stage
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:06(00:00:03) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:32:49 (Aug06) |  292.0 MB | PBS_Generic-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:11(00:00:11) | 100.0(100.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic_Opt-Post
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+Number of threads: 8 * 1   (id: pbs_debug, time_info v1.57)
+Info: (*N*) indicates data that was populated from previously saved time_info database
+Info: CPU time includes time of parent + longest thread
+PBS_Generic-Postgen HBO Optimizations - Elapsed_Time 0, CPU_Time 0.0
+stamp 'PBS_Generic-Postgen HBO Optimizations' being created for table 'pbs_debug'
+
+  Total Time (Wall) |  Stage Time (Wall)  |   % (Wall)   |    Date - Time     |  Memory   | Stage
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:06(00:00:03) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:32:49 (Aug06) |  292.0 MB | PBS_Generic-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:11(00:00:11) | 100.0(100.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic_Opt-Post
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic-Postgen HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+Number of threads: 8 * 1   (id: pbs_debug, time_info v1.57)
+Info: (*N*) indicates data that was populated from previously saved time_info database
+Info: CPU time includes time of parent + longest thread
+##>=================== Cadence Confidential (Generic-Logical) ===================
+##>=================== Cadence Confidential (Generic-Logical) ===================
+##>Main Thread Summary:
+##>----------------------------------------------------------------------------------------
+##>STEP                           Elapsed       WNS       TNS     Insts      Area    Memory
+##>----------------------------------------------------------------------------------------
+##>G:Initial                            0         -         -      2222     45732       292
+##>G:Setup                              0         -         -         -         -         -
+##>G:Launch ST                          0         -         -         -         -         -
+##>G:Design Partition                   0         -         -         -         -         -
+##>G:Create Partition Netlists          0         -         -         -         -         -
+##>G:Init Power                         0         -         -         -         -         -
+##>G:Budgeting                          0         -         -         -         -         -
+##>G:Derenv-DB                          0         -         -         -         -         -
+##>G:Debug Outputs                      0         -         -         -         -         -
+##>G:ST loading                         0         -         -         -         -         -
+##>G:Distributed                        0         -         -         -         -         -
+##>G:Timer                              0         -         -         -         -         -
+##>G:Assembly                           0         -         -         -         -         -
+##>G:DFT                                0         -         -         -         -         -
+##>G:Const Prop                         0         -         -      2686     56686       573
+##>G:Misc                              11
+##>----------------------------------------------------------------------------------------
+##>Total Elapsed                       11
+##>========================================================================================
+Info    : Done synthesizing. [SYNTH-2]
+        : Done synthesizing 'mult_seq' to generic gates.
+      flow.cputime  flow.realtime  timing.setup.tns  timing.setup.wns  snapshot
+UM:*                                                                   syn_gen
+@file(genus_script.tcl) 40: syn_map
+##Generic Timing Info for library domain: _default_ typical gate delay: 340.3 ps std_slew: 54.9 ps std_load: 58.0 fF
+Info    : Mapping. [SYNTH-4]
+        : Mapping 'mult_seq' using 'medium' effort.
+Mapper: Libraries have:
+	domain _default_: 45 combo usable cells and 8 sequential usable cells
+Configuring mapper costing (none)
+TNS Restructuring config: no_value at stage: map applied.
+PBS_TechMap-Start - Elapsed_Time 0, CPU_Time 0.0
+stamp 'PBS_TechMap-Start' being created for table 'pbs_debug'
+
+  Total Time (Wall) |  Stage Time (Wall)  |   % (Wall)   |    Date - Time     |  Memory   | Stage
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:06(00:00:03) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:32:49 (Aug06) |  292.0 MB | PBS_Generic-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:11(00:00:11) | 100.0(100.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic_Opt-Post
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic-Postgen HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+Number of threads: 8 * 1   (id: pbs_debug, time_info v1.57)
+Info: (*N*) indicates data that was populated from previously saved time_info database
+Info: CPU time includes time of parent + longest thread
+PBS_TechMap-Premap HBO Optimizations - Elapsed_Time 0, CPU_Time 0.0
+stamp 'PBS_TechMap-Premap HBO Optimizations' being created for table 'pbs_debug'
+
+  Total Time (Wall) |  Stage Time (Wall)  |   % (Wall)   |    Date - Time     |  Memory   | Stage
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:06(00:00:03) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:32:49 (Aug06) |  292.0 MB | PBS_Generic-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:11(00:00:11) | 100.0(100.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic_Opt-Post
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic-Postgen HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Premap HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+Number of threads: 8 * 1   (id: pbs_debug, time_info v1.57)
+Info: (*N*) indicates data that was populated from previously saved time_info database
+Info: CPU time includes time of parent + longest thread
+Info    : Partition Based Synthesis execution skipped. [PHYS-752]
+        : Design size is less than the partition size '100000' for distributed mapping optimization to kick in.
+Mapper: Libraries have:
+	domain _default_: 45 combo usable cells and 8 sequential usable cells
+Multi-threaded Virtual Mapping    (8 threads per ST process, 8 of 32 CPUs usable)
+Warning : The database contains a field that the reader does not support. [DATABASE-103]
+        : Unsupported data skipped.
+Warning : The database contains a field that the reader does not support. [DATABASE-103]
+        : Unsupported data skipped.
+==================================
+Stage : first_condense 
+==================================
+  =================
+   Message Summary
+  =================
+--------------------------------------------------------------------------------
+|      Id      |  Sev   |Count |                 Message Text                  |
+--------------------------------------------------------------------------------
+| DATABASE-103 |Warning |    2 |The database contains a field that the reader  |
+|              |        |      | does not support.                             |
+| PHYS-752     |Info    |    1 |Partition Based Synthesis execution skipped.   |
+| SYNTH-2      |Info    |    1 |Done synthesizing.                             |
+| SYNTH-4      |Info    |    1 |Mapping.                                       |
+--------------------------------------------------------------------------------
+ 
+Global mapping target info
+==========================
+Cost Group 'clk' target slack:   266 ps
+Target path end-point (Pin: reg1/q_reg[31]/d)
+
+Multi-threaded Technology Mapping (8 threads per ST process, 8 of 32 CPUs usable)
+Warning : The database contains a field that the reader does not support. [DATABASE-103]
+        : Unsupported data skipped.
+ 
+Global mapping status
+=====================
+                                   Group   
+                                  Tot Wrst 
+                           Total  Weighted 
+Operation                   Area   Slacks  
+ global_map                23189     -241 
+            Worst cost_group: clk, WNS: -241.5
+            Path: b[1] --> reg1/q_reg[31]/D
+
+    Cost Group            Target    Slack    Diff.  Constr.
+-----------------------------------------------------------
+           clk               266     -242      -5%    10000 
+
+ 
+Global incremental target info
+==============================
+Cost Group 'clk' target slack:  -232 ps
+Target path end-point (Pin: reg1/q_reg[31]/D (sky130_osu_sc_18T_ms__dff_1/D))
+
+Warning : The database contains a field that the reader does not support. [DATABASE-103]
+        : Unsupported data skipped.
+Warning : The database contains a field that the reader does not support. [DATABASE-103]
+        : Unsupported data skipped.
+==================================
+Stage : global_incr_map 
+==================================
+  =================
+   Message Summary
+  =================
+--------------------------------------------------------------------------------
+|      Id      |  Sev   |Count |                 Message Text                  |
+--------------------------------------------------------------------------------
+| DATABASE-103 |Warning |    3 |The database contains a field that the reader  |
+|              |        |      | does not support.                             |
+| PA-7         |Info    |    4 |Resetting power analysis results.              |
+|              |        |      |All computed switching activities are removed. |
+--------------------------------------------------------------------------------
+ 
+Global incremental optimization status
+======================================
+                                   Group   
+                                  Tot Wrst 
+                           Total  Weighted 
+Operation                   Area   Slacks  
+ global_incr               21654     -239 
+            Worst cost_group: clk, WNS: -239.5
+            Path: b[9] --> reg1/q_reg[31]/D
+
+    Cost Group            Target    Slack    Diff.  Constr.
+-----------------------------------------------------------
+           clk              -232     -240      +0%    10000 
+
+
+State Retention Synthesis Status
+================================
+
+Category                        Flops   Percentage
+--------------------------------------------------
+Total instances                    32        100.0
+Excluded from State Retention      32        100.0
+    - Will not convert             32        100.0
+      - Preserved                   0          0.0
+      - Power intent excluded      32        100.0
+    - Could not convert             0          0.0
+      - Scan type                   0          0.0
+      - No suitable cell            0          0.0
+State Retention instances           0          0.0
+--------------------------------------------------
+
+INFO: skipping constant propagation
+PBS_Techmap-Global Mapping - Elapsed_Time 6, CPU_Time 4.848794999999999
+stamp 'PBS_Techmap-Global Mapping' being created for table 'pbs_debug'
+
+  Total Time (Wall) |  Stage Time (Wall)  |   % (Wall)   |    Date - Time     |  Memory   | Stage
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:06(00:00:03) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:32:49 (Aug06) |  292.0 MB | PBS_Generic-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:11(00:00:11) |  70.4( 64.7) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic_Opt-Post
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic-Postgen HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Premap HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:22(00:00:20) |  00:00:04(00:00:06) |  29.6( 35.3) |   12:33:06 (Aug06) |  571.3 MB | PBS_Techmap-Global Mapping
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+Number of threads: 8 * 1   (id: pbs_debug, time_info v1.57)
+Info: (*N*) indicates data that was populated from previously saved time_info database
+Info: CPU time includes time of parent + longest thread
+Info    : Command 'commit_power_intent' cannot proceed as there is no power intent loaded. [CPI-506]
+        : Command 'commit_power_intent' requires a valid power_intent to be loaded.
+Info    : Wrote formal verification information. [CFM-5]
+        : Wrote 'fv/mult_seq/fv_map.fv.json' for netlist 'fv/mult_seq/fv_map.v.gz'.
+Info    : Existing dofile found. Copied as fv/mult_seq/rtl_to_fv_map.do~.
+Info    : Wrote dofile. [CFM-1]
+        : Dofile is 'fv/mult_seq/rtl_to_fv_map.do'.
+        : Alias mapping flow is enabled.
+PBS_TechMap-Datapath Postmap Operations - Elapsed_Time 1, CPU_Time 0.9952429999999985
+stamp 'PBS_TechMap-Datapath Postmap Operations' being created for table 'pbs_debug'
+
+  Total Time (Wall) |  Stage Time (Wall)  |   % (Wall)   |    Date - Time     |  Memory   | Stage
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:06(00:00:03) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:32:49 (Aug06) |  292.0 MB | PBS_Generic-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:11(00:00:11) |  66.4( 61.1) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic_Opt-Post
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic-Postgen HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Premap HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:22(00:00:20) |  00:00:04(00:00:06) |  27.9( 33.3) |   12:33:06 (Aug06) |  571.3 MB | PBS_Techmap-Global Mapping
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:01) |   5.7(  5.6) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Datapath Postmap Operations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+Number of threads: 8 * 1   (id: pbs_debug, time_info v1.57)
+Info: (*N*) indicates data that was populated from previously saved time_info database
+Info: CPU time includes time of parent + longest thread
+PBS_TechMap-Postmap HBO Optimizations - Elapsed_Time 0, CPU_Time -0.004007999999998901
+stamp 'PBS_TechMap-Postmap HBO Optimizations' being created for table 'pbs_debug'
+
+  Total Time (Wall) |  Stage Time (Wall)  |   % (Wall)   |    Date - Time     |  Memory   | Stage
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:06(00:00:03) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:32:49 (Aug06) |  292.0 MB | PBS_Generic-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:11(00:00:11) |  66.4( 61.1) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic_Opt-Post
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic-Postgen HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Premap HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:22(00:00:20) |  00:00:04(00:00:06) |  27.9( 33.3) |   12:33:06 (Aug06) |  571.3 MB | PBS_Techmap-Global Mapping
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:01) |   5.7(  5.6) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Datapath Postmap Operations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:00) |  -0.0(  0.0) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Postmap HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+Number of threads: 8 * 1   (id: pbs_debug, time_info v1.57)
+Info: (*N*) indicates data that was populated from previously saved time_info database
+Info: CPU time includes time of parent + longest thread
+ Doing ConstProp on design:mult_seq ... 
+
+IOPT-REDREM: Performing redundancy removal: Detected 9 redundant wires. CPU time 0.007 seconds.
+
+PBS_TechMap-Postmap Clock Gating - Elapsed_Time 0, CPU_Time 0.0
+stamp 'PBS_TechMap-Postmap Clock Gating' being created for table 'pbs_debug'
+
+  Total Time (Wall) |  Stage Time (Wall)  |   % (Wall)   |    Date - Time     |  Memory   | Stage
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:06(00:00:03) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:32:49 (Aug06) |  292.0 MB | PBS_Generic-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:11(00:00:11) |  66.4( 61.1) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic_Opt-Post
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic-Postgen HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Premap HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:22(00:00:20) |  00:00:04(00:00:06) |  27.9( 33.3) |   12:33:06 (Aug06) |  571.3 MB | PBS_Techmap-Global Mapping
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:01) |   5.7(  5.6) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Datapath Postmap Operations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:00) |  -0.0(  0.0) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Postmap HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Postmap Clock Gating
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+Number of threads: 8 * 1   (id: pbs_debug, time_info v1.57)
+Info: (*N*) indicates data that was populated from previously saved time_info database
+Info: CPU time includes time of parent + longest thread
+-------------------------------------------------------------------------------
+ hi_fo_buf                 21634     -239      -271         0        0
+            Worst cost_group: clk, WNS: -239.5
+            Path: b[9] --> reg1/q_reg[31]/D
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+       hi_fo_buf         0  (        0 /        0 )  0.00
+
+ 
+Incremental optimization status
+===============================
+                                   Group   
+                                  Tot Wrst     Total - - DRC Totals - -
+                           Total  Weighted      Neg      Max       Max 
+Operation                   Area   Slacks      Slack    Trans      Cap 
+ init_delay                21634     -239      -271         0        0
+            Worst cost_group: clk, WNS: -239.5
+            Path: b[9] --> reg1/q_reg[31]/D
+ incr_delay                21642        0         0         0        0
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+       crit_upsz         6  (        3 /        3 )  0.01
+    plc_bal_star         0  (        0 /        0 )  0.00
+     drc_buftimb         0  (        0 /        0 )  0.00
+          plc_st         0  (        0 /        0 )  0.00
+    plc_st_fence         0  (        0 /        0 )  0.00
+        plc_star         0  (        0 /        0 )  0.00
+      plc_laf_st         0  (        0 /        0 )  0.00
+ plc_laf_st_fence         0  (        0 /        0 )  0.00
+     drc_buftims         0  (        0 /        0 )  0.00
+            fopt         0  (        0 /        0 )  0.00
+   plc_laf_lo_st         0  (        0 /        0 )  0.00
+       plc_lo_st         0  (        0 /        0 )  0.00
+        mb_split         0  (        0 /        0 )  0.00
+
+ 
+Local TNS optimization status
+=============================
+                                   Group   
+                                  Tot Wrst     Total - - DRC Totals - -
+                           Total  Weighted      Neg      Max       Max 
+Operation                   Area   Slacks      Slack    Trans      Cap 
+ init_tns                  21642        0         0         0        0
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+    plc_bal_star         0  (        0 /        0 )  0.00
+     drc_buftimb         0  (        0 /        0 )  0.00
+     drc_buftims         0  (        0 /        0 )  0.00
+       crit_upsz         0  (        0 /        0 )  0.00
+   plc_laf_lo_st         0  (        0 /        0 )  0.00
+       plc_lo_st         0  (        0 /        0 )  0.00
+            fopt         0  (        0 /        0 )  0.00
+       crit_dnsz         0  (        0 /        0 )  0.00
+             dup         0  (        0 /        0 )  0.00
+        setup_dn         0  (        0 /        0 )  0.00
+        mb_split         0  (        0 /        0 )  0.00
+
+PBS_TechMap-Postmap Cleanup - Elapsed_Time 0, CPU_Time -0.004823000000001798
+stamp 'PBS_TechMap-Postmap Cleanup' being created for table 'pbs_debug'
+
+  Total Time (Wall) |  Stage Time (Wall)  |   % (Wall)   |    Date - Time     |  Memory   | Stage
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:06(00:00:03) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:32:49 (Aug06) |  292.0 MB | PBS_Generic-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:11(00:00:11) |  66.4( 61.1) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic_Opt-Post
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic-Postgen HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Premap HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:22(00:00:20) |  00:00:04(00:00:06) |  27.9( 33.3) |   12:33:06 (Aug06) |  571.3 MB | PBS_Techmap-Global Mapping
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:01) |   5.7(  5.6) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Datapath Postmap Operations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:00) |  -0.0(  0.0) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Postmap HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Postmap Clock Gating
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:00) |  -0.0(  0.0) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Postmap Cleanup
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+Number of threads: 8 * 1   (id: pbs_debug, time_info v1.57)
+Info: (*N*) indicates data that was populated from previously saved time_info database
+Info: CPU time includes time of parent + longest thread
+PBS_Techmap-Post_MBCI - Elapsed_Time 0, CPU_Time 0.0
+stamp 'PBS_Techmap-Post_MBCI' being created for table 'pbs_debug'
+
+  Total Time (Wall) |  Stage Time (Wall)  |   % (Wall)   |    Date - Time     |  Memory   | Stage
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:06(00:00:03) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:32:49 (Aug06) |  292.0 MB | PBS_Generic-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:11(00:00:11) |  66.4( 61.1) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic_Opt-Post
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_Generic-Postgen HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Start
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:17(00:00:14) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:00 (Aug06) |  573.9 MB | PBS_TechMap-Premap HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:22(00:00:20) |  00:00:04(00:00:06) |  27.9( 33.3) |   12:33:06 (Aug06) |  571.3 MB | PBS_Techmap-Global Mapping
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:01) |   5.7(  5.6) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Datapath Postmap Operations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:00) |  -0.0(  0.0) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Postmap HBO Optimizations
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Postmap Clock Gating
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:00) |  -0.0(  0.0) |   12:33:07 (Aug06) |  571.3 MB | PBS_TechMap-Postmap Cleanup
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+ 00:00:23(00:00:21) |  00:00:00(00:00:00) |   0.0(  0.0) |   12:33:07 (Aug06) |  571.3 MB | PBS_Techmap-Post_MBCI
+--------------------+---------------------+--------------+--------------------+-----------+----------------------
+Number of threads: 8 * 1   (id: pbs_debug, time_info v1.57)
+Info: (*N*) indicates data that was populated from previously saved time_info database
+Info: CPU time includes time of parent + longest thread
+##>=================== Cadence Confidential (Mapping-Logical) ===================
+##>Main Thread Summary:
+##>----------------------------------------------------------------------------------------
+##>STEP                           Elapsed       WNS       TNS     Insts      Area    Memory
+##>----------------------------------------------------------------------------------------
+##>M:Initial                            0         -         -      2686     56686       573
+##>M:Pre Cleanup                        0         -         -      2686     56686       573
+##>M:Setup                              0         -         -         -         -         -
+##>M:Launch ST                          0         -         -         -         -         -
+##>M:Design Partition                   0         -         -         -         -         -
+##>M:Create Partition Netlists          0         -         -         -         -         -
+##>M:Init Power                         0         -         -         -         -         -
+##>M:Budgeting                          0         -         -         -         -         -
+##>M:Derenv-DB                          0         -         -         -         -         -
+##>M:Debug Outputs                      0         -         -         -         -         -
+##>M:ST loading                         0         -         -         -         -         -
+##>M:Distributed                        0         -         -         -         -         -
+##>M:Timer                              0         -         -         -         -         -
+##>M:Assembly                           0         -         -         -         -         -
+##>M:DFT                                0         -         -         -         -         -
+##>M:DP Operations                      1         -         -      1470     21654       571
+##>M:Const Prop                         0      -239       271      1470     21654       571
+##>M:Cleanup                            0        15         0      1470     21642       571
+##>M:MBCI                               0         -         -      1470     21642       571
+##>M:Const Gate Removal                 0         -         -         -         -         -
+##>M:Misc                               6
+##>----------------------------------------------------------------------------------------
+##>Total Elapsed                        7
+##>========================================================================================
+Info    : Done mapping. [SYNTH-5]
+        : Done mapping 'mult_seq'.
+      flow.cputime  flow.realtime  timing.setup.tns  timing.setup.wns  snapshot
+UM:*                                                                   syn_map
+@file(genus_script.tcl) 41: syn_opt
+Info    : Incrementally optimizing. [SYNTH-7]
+        : Incrementally optimizing 'mult_seq' using 'medium' effort.
+ 
+Incremental optimization status
+===============================
+                                   Group   
+                                  Tot Wrst     Total - - DRC Totals - -
+                           Total  Weighted      Neg      Max       Max 
+Operation                   Area   Slacks      Slack    Trans      Cap 
+ init_iopt                 21642        0         0         0        0
+IOPT-REDREM: Performing redundancy removal: Detected 0 redundant wires. CPU time 0.006 seconds.
+
+-------------------------------------------------------------------------------
+ const_prop                21642        0         0         0        0
+ simp_cc_inputs            21631        0         0         0        0
+ 
+Incremental optimization status
+===============================
+                                   Group   
+                                  Tot Wrst     Total - - DRC Totals - -
+                           Total  Weighted      Neg      Max       Max 
+Operation                   Area   Slacks      Slack    Trans      Cap 
+ init_delay                21631        0         0         0        0
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+       crit_upsz         0  (        0 /        0 )  0.00
+    plc_bal_star         0  (        0 /        0 )  0.00
+     drc_buftimb         0  (        0 /        0 )  0.00
+          plc_st         0  (        0 /        0 )  0.00
+    plc_st_fence         0  (        0 /        0 )  0.00
+        plc_star         0  (        0 /        0 )  0.00
+      plc_laf_st         0  (        0 /        0 )  0.00
+ plc_laf_st_fence         0  (        0 /        0 )  0.00
+     drc_buftims         0  (        0 /        0 )  0.00
+   plc_laf_lo_st         0  (        0 /        0 )  0.00
+       plc_lo_st         0  (        0 /        0 )  0.00
+            fopt         0  (        0 /        0 )  0.00
+       crit_dnsz         0  (        0 /        0 )  0.00
+             dup         0  (        0 /        0 )  0.00
+            fopt         0  (        0 /        0 )  0.00
+        setup_dn         0  (        0 /        0 )  0.00
+         buf2inv         0  (        0 /        0 )  0.00
+        mb_split         0  (        0 /        0 )  0.00
+             exp         0  (        0 /        0 )  0.00
+       gate_deco         0  (        0 /        0 )  0.00
+       gcomp_tim         0  (        0 /        0 )  0.00
+  inv_pair_2_buf         0  (        0 /        0 )  0.00
+
+ init_drc                  21631        0         0         0        0
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+          plc_st         0  (        0 /        0 )  0.00
+        plc_star         0  (        0 /        0 )  0.00
+        drc_bufs         0  (        0 /        0 )  0.00
+        drc_fopt         0  (        0 /        0 )  0.00
+        drc_bufb         0  (        0 /        0 )  0.00
+      simple_buf         0  (        0 /        0 )  0.00
+             dup         0  (        0 /        0 )  0.00
+       crit_dnsz         0  (        0 /        0 )  0.00
+       crit_upsz         0  (        0 /        0 )  0.00
+
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+          plc_st         0  (        0 /        0 )  0.00
+        plc_star         0  (        0 /        0 )  0.00
+      drc_buf_sp         0  (        0 /        0 )  0.00
+        drc_bufs         0  (        0 /        0 )  0.00
+        drc_fopt         0  (        0 /        0 )  0.00
+        drc_bufb         0  (        0 /        0 )  0.00
+      simple_buf         0  (        0 /        0 )  0.00
+             dup         0  (        0 /        0 )  0.00
+       crit_dnsz         0  (        0 /        0 )  0.00
+       crit_upsz         0  (        0 /        0 )  0.00
+
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+          plc_st         0  (        0 /        0 )  0.00
+        plc_star         0  (        0 /        0 )  0.00
+      drc_buf_sp         0  (        0 /        0 )  0.00
+        drc_bufs         0  (        0 /        0 )  0.00
+        drc_fopt         0  (        0 /        0 )  0.00
+        drc_bufb         0  (        0 /        0 )  0.00
+             dup         0  (        0 /        0 )  0.00
+       crit_dnsz         0  (        0 /        0 )  0.00
+       crit_upsz         0  (        0 /        0 )  0.00
+
+ init_tns                  21631        0         0         0        0
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+    plc_bal_star         0  (        0 /        0 )  0.00
+     drc_buftimb         0  (        0 /        0 )  0.00
+     drc_buftims         0  (        0 /        0 )  0.00
+       crit_upsz         0  (        0 /        0 )  0.00
+   plc_laf_lo_st         0  (        0 /        0 )  0.00
+       plc_lo_st         0  (        0 /        0 )  0.00
+            fopt         0  (        0 /        0 )  0.00
+       crit_dnsz         0  (        0 /        0 )  0.00
+             dup         0  (        0 /        0 )  0.00
+        setup_dn         0  (        0 /        0 )  0.00
+         buf2inv         0  (        0 /        0 )  0.00
+        mb_split         0  (        0 /        0 )  0.00
+
+ init_area                 21631        0         0         0        0
+ rem_buf                   21526        0         0         0        0
+ rem_inv                   21519        0         0         0        0
+ merge_bi                  21500        0         0         0        0
+ gate_comp                 21458        0         0         0        0
+ gcomp_mog                 21394        0         0         0        0
+ glob_area                 21374        0         0         0        0
+ area_down                 21353        0         0         0        0
+ rem_inv                   21346        0         0         0        0
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+           undup         0  (        0 /        0 )  0.00
+         rem_buf        25  (       11 /       11 )  0.04
+         rem_inv         1  (        1 /        1 )  0.00
+        merge_bi         7  (        3 /        3 )  0.02
+      rem_inv_qb         0  (        0 /        0 )  0.00
+        io_phase         4  (        0 /        0 )  0.01
+       gate_comp       218  (        3 /        3 )  0.34
+       gcomp_mog         2  (        2 /        2 )  0.10
+       glob_area        67  (       10 /       67 )  0.03
+       area_down        10  (        5 /        5 )  0.05
+      size_n_buf         0  (        0 /        0 )  0.00
+  gate_deco_area         0  (        0 /        0 )  0.00
+         rem_buf        14  (        0 /        0 )  0.01
+         rem_inv         1  (        1 /        1 )  0.00
+        merge_bi         4  (        0 /        0 )  0.01
+      rem_inv_qb         0  (        0 /        0 )  0.00
+
+ 
+Incremental optimization status
+===============================
+                                   Group   
+                                  Tot Wrst     Total - - DRC Totals - -
+                           Total  Weighted      Neg      Max       Max 
+Operation                   Area   Slacks      Slack    Trans      Cap 
+ init_delay                21346        0         0         0        0
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+       crit_upsz         0  (        0 /        0 )  0.00
+    plc_bal_star         0  (        0 /        0 )  0.00
+     drc_buftimb         0  (        0 /        0 )  0.00
+          plc_st         0  (        0 /        0 )  0.00
+    plc_st_fence         0  (        0 /        0 )  0.00
+        plc_star         0  (        0 /        0 )  0.00
+      plc_laf_st         0  (        0 /        0 )  0.00
+ plc_laf_st_fence         0  (        0 /        0 )  0.00
+     drc_buftims         0  (        0 /        0 )  0.00
+   plc_laf_lo_st         0  (        0 /        0 )  0.00
+       plc_lo_st         0  (        0 /        0 )  0.00
+            fopt         0  (        0 /        0 )  0.00
+       crit_dnsz         0  (        0 /        0 )  0.00
+             dup         0  (        0 /        0 )  0.00
+            fopt         0  (        0 /        0 )  0.00
+        setup_dn         0  (        0 /        0 )  0.00
+         buf2inv         0  (        0 /        0 )  0.00
+        mb_split         0  (        0 /        0 )  0.00
+             exp         0  (        0 /        0 )  0.00
+       gate_deco         0  (        0 /        0 )  0.00
+       gcomp_tim         0  (        0 /        0 )  0.00
+  inv_pair_2_buf         0  (        0 /        0 )  0.00
+
+ init_drc                  21346        0         0         0        0
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+          plc_st         0  (        0 /        0 )  0.00
+        plc_star         0  (        0 /        0 )  0.00
+        drc_bufs         0  (        0 /        0 )  0.00
+        drc_fopt         0  (        0 /        0 )  0.00
+        drc_bufb         0  (        0 /        0 )  0.00
+      simple_buf         0  (        0 /        0 )  0.00
+             dup         0  (        0 /        0 )  0.00
+       crit_dnsz         0  (        0 /        0 )  0.00
+       crit_upsz         0  (        0 /        0 )  0.00
+
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+          plc_st         0  (        0 /        0 )  0.00
+        plc_star         0  (        0 /        0 )  0.00
+        drc_bufs         0  (        0 /        0 )  0.00
+        drc_fopt         0  (        0 /        0 )  0.00
+        drc_bufb         0  (        0 /        0 )  0.00
+      simple_buf         0  (        0 /        0 )  0.00
+             dup         0  (        0 /        0 )  0.00
+       crit_dnsz         0  (        0 /        0 )  0.00
+       crit_upsz         0  (        0 /        0 )  0.00
+
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+          plc_st         0  (        0 /        0 )  0.00
+        plc_star         0  (        0 /        0 )  0.00
+        drc_bufs         0  (        0 /        0 )  0.00
+        drc_fopt         0  (        0 /        0 )  0.00
+        drc_bufb         0  (        0 /        0 )  0.00
+             dup         0  (        0 /        0 )  0.00
+       crit_dnsz         0  (        0 /        0 )  0.00
+       crit_upsz         0  (        0 /        0 )  0.00
+
+ init_area                 21346        0         0         0        0
+
+           Trick     Calls     Accepts   Attempts    Time(secs) 
+-----------------------------------------------------------
+           undup         0  (        0 /        0 )  0.00
+         rem_buf        14  (        0 /        0 )  0.01
+         rem_inv         0  (        0 /        0 )  0.00
+        merge_bi         4  (        0 /        0 )  0.01
+      rem_inv_qb         0  (        0 /        0 )  0.00
+        io_phase         5  (        0 /        0 )  0.01
+       gate_comp       210  (        0 /        0 )  0.33
+       gcomp_mog         0  (        0 /        0 )  0.09
+       glob_area        50  (        0 /       50 )  0.03
+       area_down         8  (        0 /        0 )  0.03
+      size_n_buf         0  (        0 /        0 )  0.00
+  gate_deco_area         0  (        0 /        0 )  0.00
+
+==================================
+Stage : incr_opt 
+==================================
+  =================
+   Message Summary
+  =================
+--------------------------------------------------------------------------------
+|   Id    |Sev  |Count |                     Message Text                      |
+--------------------------------------------------------------------------------
+| CFM-1   |Info |    1 |Wrote dofile.                                          |
+| CFM-5   |Info |    1 |Wrote formal verification information.                 |
+| CPI-506 |Info |    1 |Command 'commit_power_intent' cannot proceed as there  |
+|         |     |      | is no power intent loaded.                            |
+| PA-7    |Info |    4 |Resetting power analysis results.                      |
+|         |     |      |All computed switching activities are removed.         |
+| SYNTH-5 |Info |    1 |Done mapping.                                          |
+| SYNTH-7 |Info |    1 |Incrementally optimizing.                              |
+--------------------------------------------------------------------------------
+Info    : Done incrementally optimizing. [SYNTH-8]
+        : Done incrementally optimizing 'mult_seq'.
+      flow.cputime  flow.realtime  timing.setup.tns  timing.setup.wns  snapshot
+UM:*                                                                   syn_opt
+@file(genus_script.tcl) 43: write_hdl > mult_seq.vh
+@file(genus_script.tcl) 44: write_sdc > mult_seq.sdc
+Finished SDC export (command execution time mm:ss (real) = 00:00).
+@file(genus_script.tcl) 45: write_sdf -timescale ns -nonegchecks -recrem split -edges check_edge  -setuphold split > mult_seq.sdf
+@file(genus_script.tcl) 48: set filename [format "%s%s%s" "reports/" $my_toplevel "_timing.rep"]
+@file(genus_script.tcl) 49: redirect $filename { report_timing -nets -nworst 1}
+@file(genus_script.tcl) 51: set filename [format "%s%s%s" "reports/" $my_toplevel "_area.rep"]
+@file(genus_script.tcl) 52: redirect $filename { report_area}
+@file(genus_script.tcl) 54: set filename [format "%s%s%s" "reports/" $my_toplevel "_qor.rep"]
+@file(genus_script.tcl) 55: redirect $filename { report_qor}
+@file(genus_script.tcl) 57: set filename [format "%s%s%s" "reports/" $my_toplevel "_clocks.rep"]
+@file(genus_script.tcl) 58: redirect $filename { report_clocks}
+@file(genus_script.tcl) 60: set filename [format "%s%s%s" "reports/" $my_toplevel "_timing_summary.rep"]
+@file(genus_script.tcl) 61: redirect $filename { report_timing_summary}
+@file(genus_script.tcl) 63: set filename [format "%s%s%s" "reports/" $my_toplevel "_power.rep"]
+@file(genus_script.tcl) 64: redirect $filename { report_power}
+@file(genus_script.tcl) 68: exit
+Normal exit.
\ No newline at end of file
diff --git a/sky130_cds/synth/genus_script.tcl b/sky130_cds/synth/genus_script.tcl
new file mode 100755
index 000000000..571906fc0
--- /dev/null
+++ b/sky130_cds/synth/genus_script.tcl
@@ -0,0 +1,68 @@
+set s8lib ../sky130_osu_sc_t18/18T_ms/lib
+
+set_db init_lib_search_path $s8lib
+set search_path [list "./" ]
+lappend search_path $s8lib
+lappend search_path "./hdl"
+
+set_db init_hdl_search_path $search_path
+read_libs sky130_osu_sc_18T_ms_TT_1P8_25C.ccs.lib 
+
+set my_verilog_files [list adder.sv flopenr.sv flop.sv mult_seq.sv]
+
+set my_toplevel "mult_seq"
+
+read_hdl -language sv $my_verilog_files
+elaborate $my_toplevel
+
+# Set Frequency in [MHz] or [ps]
+set my_clock_pin "clk"
+set my_clk_freq_MHz 100
+set my_period [expr 1000 / $my_clk_freq_MHz]
+set my_uncertainty [expr .1 * $my_period]
+
+# Create clock object 
+set find_clock $my_clock_pin
+if {  $find_clock != [list] } {
+    echo "Found clock!"
+    set my_clk $my_clock_pin
+} 
+set all_in_ex_clk [remove_from_collection [all_inputs] [get_ports "clk"]]
+set all_out [all_outputs]
+
+read_sdc constraints_top.sdc
+
+set_db syn_generic_effort medium
+set_db syn_map_effort medium
+set_db syn_opt_effort medium
+
+syn_generic
+syn_map
+syn_opt
+
+write_hdl > mult_seq.vh
+write_sdc > mult_seq.sdc
+write_sdf -timescale ns -nonegchecks -recrem split -edges check_edge  -setuphold split > mult_seq.sdf
+
+# Report Timing
+set filename [format "%s%s%s" "reports/" $my_toplevel "_timing.rep"]
+redirect $filename { report_timing -nets -nworst 1}
+# Report Area
+set filename [format "%s%s%s" "reports/" $my_toplevel "_area.rep"]
+redirect $filename { report_area}
+# Report QoR
+set filename [format "%s%s%s" "reports/" $my_toplevel "_qor.rep"]
+redirect $filename { report_qor}
+# Report Clocks
+set filename [format "%s%s%s" "reports/" $my_toplevel "_clocks.rep"]
+redirect $filename { report_clocks}
+# Report Timing Summary
+set filename [format "%s%s%s" "reports/" $my_toplevel "_timing_summary.rep"]
+redirect $filename { report_timing_summary}
+# Report Power
+set filename [format "%s%s%s" "reports/" $my_toplevel "_power.rep"]
+redirect $filename { report_power}
+
+
+# Quit
+exit
diff --git a/sky130_cds/synth/hdl/adder.sv b/sky130_cds/synth/hdl/adder.sv
new file mode 100755
index 000000000..c7c6e2d9c
--- /dev/null
+++ b/sky130_cds/synth/hdl/adder.sv
@@ -0,0 +1,34 @@
+///////////////////////////////////////////
+// adder.sv
+//
+// Written: David_Harris@hmc.edu 2 October 2021
+// Modified: 
+//
+// Purpose: Adder
+// 
+// A component of the Wally configurable RISC-V project.
+// 
+// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, 
+// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software 
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 
+// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 
+// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+///////////////////////////////////////////
+
+module adder #(parameter WIDTH=8) (
+  input  logic [WIDTH-1:0] a, b,
+  output logic [WIDTH-1:0] y);
+
+  assign y = a + b;
+   
+endmodule 
+
+
diff --git a/sky130_cds/synth/hdl/counter.sv b/sky130_cds/synth/hdl/counter.sv
new file mode 100755
index 000000000..99cf24af8
--- /dev/null
+++ b/sky130_cds/synth/hdl/counter.sv
@@ -0,0 +1,17 @@
+// Example counter for synthesis
+module counter(clk,rst,count);
+   
+   input logic        clk;
+   input logic 	      rst;
+   output logic [7:0] count;
+   
+   always@(posedge clk or negedge rst)
+     begin
+	if(!rst)
+	  count=0;
+	else
+	  count=count+1;
+     end
+   
+endmodule
+
diff --git a/sky130_cds/synth/hdl/flop.sv b/sky130_cds/synth/hdl/flop.sv
new file mode 100755
index 000000000..4a8d4dd5c
--- /dev/null
+++ b/sky130_cds/synth/hdl/flop.sv
@@ -0,0 +1,36 @@
+///////////////////////////////////////////
+// flop.sv
+//
+// Written: David_Harris@hmc.edu 9 January 2021
+// Modified: 
+//
+// Purpose: various flavors of flip-flops
+// 
+// A component of the Wally configurable RISC-V project.
+// 
+// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, 
+// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software 
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 
+// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 
+// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+///////////////////////////////////////////
+
+// ordinary flip-flop
+module flop #(parameter WIDTH = 8) ( 
+  input  logic             clk,
+  input  logic [WIDTH-1:0] d, 
+  output logic [WIDTH-1:0] q);
+
+  always_ff @(posedge clk)
+    q <= d;
+   
+endmodule
+
diff --git a/sky130_cds/synth/hdl/flopenr.sv b/sky130_cds/synth/hdl/flopenr.sv
new file mode 100755
index 000000000..70f130f47
--- /dev/null
+++ b/sky130_cds/synth/hdl/flopenr.sv
@@ -0,0 +1,37 @@
+///////////////////////////////////////////
+// flopenr.sv
+//
+// Written: David_Harris@hmc.edu 9 January 2021
+// Modified: 
+//
+// Purpose: various flavors of flip-flops
+// 
+// A component of the Wally configurable RISC-V project.
+// 
+// Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, 
+// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software 
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 
+// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 
+// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+///////////////////////////////////////////
+
+// flop with enable, synchronous reset
+module flopenr #(parameter WIDTH = 8) (
+  input  logic             clk, reset, en,
+  input  logic [WIDTH-1:0] d, 
+  output logic [WIDTH-1:0] q);
+
+  always_ff @(posedge clk)
+    if (reset)   q <= {WIDTH{1'b0}};
+    else if (en) q <= d;
+   
+endmodule
+
diff --git a/sky130_cds/synth/hdl/mult.sv b/sky130_cds/synth/hdl/mult.sv
new file mode 100755
index 000000000..c7c785f75
--- /dev/null
+++ b/sky130_cds/synth/hdl/mult.sv
@@ -0,0 +1,12 @@
+module mult #(parameter WIDTH=32)
+   (a, b, p);
+
+   input logic [WIDTH-1:0]    a;
+   input logic [WIDTH-1:0]    b;
+   output logic [2*WIDTH-1:0] p;
+
+   assign p = a*b;
+
+endmodule // mult
+
+   
\ No newline at end of file
diff --git a/sky130_cds/synth/hdl/mult_seq.sv b/sky130_cds/synth/hdl/mult_seq.sv
new file mode 100755
index 000000000..6b247905e
--- /dev/null
+++ b/sky130_cds/synth/hdl/mult_seq.sv
@@ -0,0 +1,19 @@
+module mult_seq #(parameter WIDTH=16)
+   (a, b, clk, reset, en, sum_q);
+
+   output logic [2*WIDTH-1:0] sum_q;
+
+   input logic [WIDTH-1:0]    a;
+   input logic [WIDTH-1:0]    b;
+   input logic		      clk;   
+   input logic 		      reset;
+   input logic 		      en;   
+   
+   logic [2*WIDTH-1:0] 	      p;
+   logic [2*WIDTH-1:0] 	      sum;
+
+   assign p = a*b;
+   adder #(2*WIDTH) add1 (p, sum_q, sum);
+   flopenr #(2*WIDTH) reg1 (clk, reset, en, sum, sum_q);
+
+endmodule // mult_seq
diff --git a/sky130_cds/synth/mult_seq.sdc b/sky130_cds/synth/mult_seq.sdc
new file mode 100755
index 000000000..742d48b0b
--- /dev/null
+++ b/sky130_cds/synth/mult_seq.sdc
@@ -0,0 +1,151 @@
+# ####################################################################
+
+#  Created by Genus(TM) Synthesis Solution 20.11-s111_1 on Sat Aug 06 12:33:09 CDT 2022
+
+# ####################################################################
+
+set sdc_version 2.0
+
+set_units -capacitance 1000fF
+set_units -time 1000ps
+
+# Set the current design
+current_design mult_seq
+
+create_clock -name "clk" -period 10.0 -waveform {0.0 5.0} [get_ports clk]
+set_load -pin_load 0.006 [get_ports {sum_q[31]}]
+set_load -pin_load 0.006 [get_ports {sum_q[30]}]
+set_load -pin_load 0.006 [get_ports {sum_q[29]}]
+set_load -pin_load 0.006 [get_ports {sum_q[28]}]
+set_load -pin_load 0.006 [get_ports {sum_q[27]}]
+set_load -pin_load 0.006 [get_ports {sum_q[26]}]
+set_load -pin_load 0.006 [get_ports {sum_q[25]}]
+set_load -pin_load 0.006 [get_ports {sum_q[24]}]
+set_load -pin_load 0.006 [get_ports {sum_q[23]}]
+set_load -pin_load 0.006 [get_ports {sum_q[22]}]
+set_load -pin_load 0.006 [get_ports {sum_q[21]}]
+set_load -pin_load 0.006 [get_ports {sum_q[20]}]
+set_load -pin_load 0.006 [get_ports {sum_q[19]}]
+set_load -pin_load 0.006 [get_ports {sum_q[18]}]
+set_load -pin_load 0.006 [get_ports {sum_q[17]}]
+set_load -pin_load 0.006 [get_ports {sum_q[16]}]
+set_load -pin_load 0.006 [get_ports {sum_q[15]}]
+set_load -pin_load 0.006 [get_ports {sum_q[14]}]
+set_load -pin_load 0.006 [get_ports {sum_q[13]}]
+set_load -pin_load 0.006 [get_ports {sum_q[12]}]
+set_load -pin_load 0.006 [get_ports {sum_q[11]}]
+set_load -pin_load 0.006 [get_ports {sum_q[10]}]
+set_load -pin_load 0.006 [get_ports {sum_q[9]}]
+set_load -pin_load 0.006 [get_ports {sum_q[8]}]
+set_load -pin_load 0.006 [get_ports {sum_q[7]}]
+set_load -pin_load 0.006 [get_ports {sum_q[6]}]
+set_load -pin_load 0.006 [get_ports {sum_q[5]}]
+set_load -pin_load 0.006 [get_ports {sum_q[4]}]
+set_load -pin_load 0.006 [get_ports {sum_q[3]}]
+set_load -pin_load 0.006 [get_ports {sum_q[2]}]
+set_load -pin_load 0.006 [get_ports {sum_q[1]}]
+set_load -pin_load 0.006 [get_ports {sum_q[0]}]
+set_clock_gating_check -setup 0.0 
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[15]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[14]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[13]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[12]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[11]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[10]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[9]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[8]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[7]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[6]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[5]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[4]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[3]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[2]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[1]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {a[0]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[15]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[14]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[13]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[12]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[11]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[10]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[9]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[8]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[7]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[6]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[5]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[4]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[3]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[2]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[1]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {b[0]}]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports reset]
+set_input_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports en]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[31]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[30]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[29]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[28]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[27]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[26]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[25]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[24]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[23]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[22]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[21]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[20]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[19]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[18]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[17]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[16]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[15]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[14]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[13]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[12]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[11]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[10]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[9]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[8]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[7]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[6]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[5]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[4]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[3]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[2]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[1]}]
+set_output_delay -clock [get_clocks clk] -add_delay -max 0.0 [get_ports {sum_q[0]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[15]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[14]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[13]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[12]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[11]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[10]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[9]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[8]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[7]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[6]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[5]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[4]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[3]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[2]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[1]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {a[0]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[15]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[14]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[13]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[12]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[11]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[10]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[9]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[8]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[7]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[6]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[5]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[4]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[3]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[2]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[1]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports {b[0]}]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports reset]
+set_driving_cell -lib_cell sky130_osu_sc_18T_ms__dff_1 -library sky130_osu_sc_18T_ms_TT_1P8_25C.ccs -pin "Q" [get_ports en]
+set_wire_load_mode "enclosed"
+set_clock_uncertainty -setup 1.0 [get_clocks clk]
+set_clock_uncertainty -hold 1.0 [get_clocks clk]
diff --git a/sky130_cds/synth/mult_seq.sdf b/sky130_cds/synth/mult_seq.sdf
new file mode 100755
index 000000000..e73d37d58
--- /dev/null
+++ b/sky130_cds/synth/mult_seq.sdf
@@ -0,0 +1,24549 @@
+(DELAYFILE
+  (SDFVERSION  "OVI 3.0")
+  (DESIGN      "mult_seq")
+  (DATE        "Sat Aug 06 12:33:09 CDT 2022")
+  (VENDOR      "Cadence, Inc.")
+  (PROGRAM     "Genus(TM) Synthesis Solution")
+  (VERSION     "20.11-s111_1")
+  (DIVIDER     .)
+  (VOLTAGE     ::1.8)
+  (PROCESS     "::1.0")
+  (TEMPERATURE ::25.0)
+  (TIMESCALE   1ns)
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[22\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.295) (::0.367))
+          (IOPATH QN Q (::0.086) (::0.081))
+          (IOPATH CK QN (::0.210) (::0.139))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[1\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[11\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[12\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[13\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[14\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[15\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[16\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[17\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.442) (::0.519))
+          (IOPATH QN Q (::0.152) (::0.142))
+          (IOPATH CK QN (::0.210) (::0.139))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[2\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.349) (::0.422))
+          (IOPATH QN Q (::0.110) (::0.103))
+          (IOPATH CK QN (::0.210) (::0.139))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[18\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.460) (::0.537))
+          (IOPATH QN Q (::0.160) (::0.149))
+          (IOPATH CK QN (::0.210) (::0.139))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[19\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[20\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.412) (::0.487))
+          (IOPATH QN Q (::0.138) (::0.129))
+          (IOPATH CK QN (::0.210) (::0.139))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[3\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[21\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[0\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[10\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[23\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[5\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[6\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[24\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.295) (::0.367))
+          (IOPATH QN Q (::0.086) (::0.081))
+          (IOPATH CK QN (::0.210) (::0.139))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[25\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[26\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[7\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[27\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[28\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[29\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[30\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[8\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[9\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_l")
+     (INSTANCE reg1.q_reg\[31\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.352) (::0.430))
+          (IOPATH QN Q (::0.114) (::0.104))
+          (IOPATH CK QN (::0.211) (::0.138))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.149))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__dff_1")
+     (INSTANCE reg1.q_reg\[4\])
+     (DELAY
+        (ABSOLUTE
+          (PORT CK (::0.000))
+          (PORT D (::0.000))
+          (IOPATH CK Q (::0.164) (::0.233))
+          (IOPATH QN Q (::0.033) (::0.032))
+          (IOPATH CK QN (::0.224) (::0.153))
+        )
+     )
+     (TIMINGCHECK
+        (HOLD (negedge D) (posedge CK) (::0.000))
+        (HOLD (posedge D) (posedge CK) (::0.000))
+        (SETUP (negedge D) (posedge CK) (::0.143))
+        (SETUP (posedge D) (posedge CK) (::0.152))
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g99__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g100__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g101__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g102__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g103__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g104__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g105__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g106__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g107__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g108__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g109__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g110__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g111__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g112__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g113__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g114__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g115__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g116__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g117__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g118__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g119__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g120__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g121__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g122__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g123__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g124__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g125__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g126__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g127__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g128__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g129__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE reg1.g130__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.124))
+          (IOPATH B Y (::0.088) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g131__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.101) (::0.100)))
+          (IOPATH B0 Y (::0.090) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.090) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.068) (::0.062)))
+          (IOPATH A1 Y (::0.122) (::0.100))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.122) (::0.088)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.108) (::0.087)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.076) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g132__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.099) (::0.101)))
+          (IOPATH B0 Y (::0.085) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.085) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.064) (::0.062)))
+          (IOPATH A1 Y (::0.120) (::0.101))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.120) (::0.088)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.106) (::0.088)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.071) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g133__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.105) (::0.107)))
+          (IOPATH B0 Y (::0.085) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.085) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.064) (::0.062)))
+          (IOPATH A1 Y (::0.125) (::0.107))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.094)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.111) (::0.094)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.071) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g134__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.101) (::0.100)))
+          (IOPATH B0 Y (::0.090) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.090) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.068) (::0.062)))
+          (IOPATH A1 Y (::0.122) (::0.100))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.122) (::0.088)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.108) (::0.087)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.076) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g135__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.101) (::0.102)))
+          (IOPATH B0 Y (::0.086) (::0.062))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.086) (::0.062)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.065) (::0.061)))
+          (IOPATH A1 Y (::0.122) (::0.102))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.122) (::0.090)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.108) (::0.089)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.072) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g136__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.099) (::0.101)))
+          (IOPATH B0 Y (::0.110) (::0.077))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.110) (::0.077)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.086) (::0.075)))
+          (IOPATH A1 Y (::0.120) (::0.101))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.120) (::0.088)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.106) (::0.088)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.094) (::0.076)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g137__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.105) (::0.107)))
+          (IOPATH B0 Y (::0.110) (::0.077))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.110) (::0.077)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.086) (::0.075)))
+          (IOPATH A1 Y (::0.125) (::0.107))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.094)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.111) (::0.094)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.094) (::0.076)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g138__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.132) (::0.132)))
+          (IOPATH B0 Y (::0.110) (::0.077))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.110) (::0.077)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.086) (::0.075)))
+          (IOPATH A1 Y (::0.151) (::0.132))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.151) (::0.118)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.137) (::0.117)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.094) (::0.076)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g139__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.100) (::0.102)))
+          (IOPATH B0 Y (::0.076) (::0.050))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.076) (::0.050)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.054) (::0.050)))
+          (IOPATH A1 Y (::0.121) (::0.102))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.121) (::0.090)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.107) (::0.089)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.062) (::0.050)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g140__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.136) (::0.135)))
+          (IOPATH B0 Y (::0.110) (::0.077))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.110) (::0.077)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.086) (::0.075)))
+          (IOPATH A1 Y (::0.155) (::0.135))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.155) (::0.121)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.141) (::0.120)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.094) (::0.076)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g141__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.105) (::0.107)))
+          (IOPATH B0 Y (::0.093) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.093) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.070) (::0.062)))
+          (IOPATH A1 Y (::0.125) (::0.107))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.094)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.111) (::0.094)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.078) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g142__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.112) (::0.111)))
+          (IOPATH B0 Y (::0.086) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.086) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.065) (::0.062)))
+          (IOPATH A1 Y (::0.133) (::0.111))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.133) (::0.099)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.119) (::0.098)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.072) (::0.063)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g143__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.099) (::0.101)))
+          (IOPATH B0 Y (::0.089) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.089) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.068) (::0.062)))
+          (IOPATH A1 Y (::0.120) (::0.101))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.120) (::0.088)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.106) (::0.088)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.075) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g144__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.125) (::0.125)))
+          (IOPATH B0 Y (::0.090) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.090) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.068) (::0.062)))
+          (IOPATH A1 Y (::0.145) (::0.125))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.145) (::0.112)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.131) (::0.111)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.076) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g145__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.105) (::0.107)))
+          (IOPATH B0 Y (::0.090) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.090) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.068) (::0.062)))
+          (IOPATH A1 Y (::0.125) (::0.107))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.094)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.111) (::0.094)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.075) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g146__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.105) (::0.107)))
+          (IOPATH B0 Y (::0.085) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.085) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.064) (::0.062)))
+          (IOPATH A1 Y (::0.125) (::0.107))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.094)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.111) (::0.094)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.071) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g147__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.099) (::0.101)))
+          (IOPATH B0 Y (::0.085) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.085) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.064) (::0.062)))
+          (IOPATH A1 Y (::0.120) (::0.101))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.120) (::0.088)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.106) (::0.088)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.071) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g148__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.105) (::0.107)))
+          (IOPATH B0 Y (::0.090) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.090) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.068) (::0.062)))
+          (IOPATH A1 Y (::0.125) (::0.107))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.094)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.111) (::0.094)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.075) (::0.063)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g149__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.105) (::0.107)))
+          (IOPATH B0 Y (::0.090) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.090) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.068) (::0.062)))
+          (IOPATH A1 Y (::0.125) (::0.107))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.094)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.111) (::0.094)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.075) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g150__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.100) (::0.102)))
+          (IOPATH B0 Y (::0.085) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.085) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.064) (::0.062)))
+          (IOPATH A1 Y (::0.122) (::0.102))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.122) (::0.090)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.107) (::0.089)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.071) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g151__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.105) (::0.107)))
+          (IOPATH B0 Y (::0.090) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.090) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.068) (::0.062)))
+          (IOPATH A1 Y (::0.125) (::0.107))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.094)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.111) (::0.094)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.076) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g152__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.100) (::0.102)))
+          (IOPATH B0 Y (::0.085) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.085) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.064) (::0.062)))
+          (IOPATH A1 Y (::0.121) (::0.102))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.121) (::0.090)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.107) (::0.089)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.071) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g153__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.104) (::0.107)))
+          (IOPATH B0 Y (::0.090) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.090) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.068) (::0.062)))
+          (IOPATH A1 Y (::0.125) (::0.107))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.094)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.111) (::0.094)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.076) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g154__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.105) (::0.107)))
+          (IOPATH B0 Y (::0.090) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.090) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.068) (::0.062)))
+          (IOPATH A1 Y (::0.125) (::0.107))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.094)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.111) (::0.094)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.076) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g155__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.099) (::0.101)))
+          (IOPATH B0 Y (::0.085) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.085) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.064) (::0.062)))
+          (IOPATH A1 Y (::0.120) (::0.101))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.120) (::0.088)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.106) (::0.088)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.071) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g156__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.100) (::0.102)))
+          (IOPATH B0 Y (::0.090) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.090) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.068) (::0.062)))
+          (IOPATH A1 Y (::0.121) (::0.102))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.121) (::0.090)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.107) (::0.089)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.076) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g157__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.105) (::0.107)))
+          (IOPATH B0 Y (::0.090) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.090) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.068) (::0.062)))
+          (IOPATH A1 Y (::0.125) (::0.107))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.094)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.111) (::0.094)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.076) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g158__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.100) (::0.102)))
+          (IOPATH B0 Y (::0.085) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.085) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.064) (::0.062)))
+          (IOPATH A1 Y (::0.121) (::0.102))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.121) (::0.090)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.107) (::0.089)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.071) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g159__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.099) (::0.101)))
+          (IOPATH B0 Y (::0.085) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.085) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.064) (::0.062)))
+          (IOPATH A1 Y (::0.120) (::0.101))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.120) (::0.088)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.106) (::0.088)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.071) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g160__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.114) (::0.114)))
+          (IOPATH B0 Y (::0.087) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.087) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.065) (::0.062)))
+          (IOPATH A1 Y (::0.134) (::0.114))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.134) (::0.101)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.120) (::0.100)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.072) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g161__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.105) (::0.107)))
+          (IOPATH B0 Y (::0.085) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.085) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.064) (::0.062)))
+          (IOPATH A1 Y (::0.125) (::0.107))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.094)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.111) (::0.094)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.071) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE reg1.g162__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.238) (::0.193))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.214) (::0.193)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.090) (::0.090)))
+          (IOPATH B0 Y (::0.085) (::0.063))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.201) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.085) (::0.063)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.064) (::0.062)))
+          (IOPATH A1 Y (::0.112) (::0.090))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.225) (::0.125)))
+          (IOPATH B1 Y (::0.225) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.238) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.112) (::0.078)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.098) (::0.078)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.071) (::0.062)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g163)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.106) (::0.097))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g165)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.106) (::0.097))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g166)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.093) (::0.086))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g167)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.106) (::0.097))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g168)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.106) (::0.097))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g169)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.093) (::0.086))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g170)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.071) (::0.065))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g172)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.096) (::0.088))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g173)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.106) (::0.097))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g174)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.634) (::0.593))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g175)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.106) (::0.097))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g176)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.093) (::0.086))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g177)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.106) (::0.097))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g178)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.106) (::0.097))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g179)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.096) (::0.088))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g182)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.093) (::0.086))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g184)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.106) (::0.096))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g185)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.096) (::0.088))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g186)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.096) (::0.088))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g187)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.106) (::0.097))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g188)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.096) (::0.088))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g189)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.093) (::0.086))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g190)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.106) (::0.097))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g191)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.106) (::0.097))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g192)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.097) (::0.088))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE reg1.g193)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.093) (::0.086))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_1")
+     (INSTANCE g14)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.341) (::0.316))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_1")
+     (INSTANCE g13)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.340) (::0.315))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_1")
+     (INSTANCE g12)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.342) (::0.317))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_1")
+     (INSTANCE g8)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.340) (::0.315))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_8")
+     (INSTANCE g15)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.437) (::0.440))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_2")
+     (INSTANCE g11)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.218) (::0.211))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_1")
+     (INSTANCE g10)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.309) (::0.288))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7795__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.117) (::0.111)))
+          (COND ~B (IOPATH A Y (::0.131) (::0.115)))
+          (COND A (IOPATH B Y (::0.110) (::0.091)))
+          (COND B (IOPATH A Y (::0.102) (::0.090)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7796__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.074) (::0.062)))
+          (IOPATH A0 Y (::0.158) (::0.126))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.075) (::0.084)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.074) (::0.075)))
+          (IOPATH B0 Y (::0.075) (::0.075))
+          (IOPATH A1 Y (::0.155) (::0.136))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7797__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.119) (::0.110)))
+          (COND ~B (IOPATH A Y (::0.144) (::0.130)))
+          (COND A (IOPATH B Y (::0.109) (::0.094)))
+          (COND B (IOPATH A Y (::0.116) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7800__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.111) (::0.098)))
+          (IOPATH A0 Y (::0.236) (::0.184))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.156) (::0.099)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.135) (::0.098)))
+          (IOPATH B0 Y (::0.156) (::0.099))
+          (IOPATH A1 Y (::0.192) (::0.165))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7801__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.119) (::0.114)))
+          (COND ~B (IOPATH A Y (::0.143) (::0.128)))
+          (COND A (IOPATH B Y (::0.113) (::0.094)))
+          (COND B (IOPATH A Y (::0.115) (::0.106)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7804__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.110) (::0.091)))
+          (IOPATH A0 Y (::0.179) (::0.161))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.111) (::0.120)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.110) (::0.113)))
+          (IOPATH B0 Y (::0.111) (::0.113))
+          (IOPATH A1 Y (::0.202) (::0.173))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7805__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.117) (::0.111)))
+          (COND ~B (IOPATH A Y (::0.144) (::0.128)))
+          (COND A (IOPATH B Y (::0.110) (::0.091)))
+          (COND B (IOPATH A Y (::0.114) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7808__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.110) (::0.097)))
+          (IOPATH A0 Y (::0.235) (::0.175))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.155) (::0.098)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.134) (::0.098)))
+          (IOPATH B0 Y (::0.155) (::0.098))
+          (IOPATH A1 Y (::0.192) (::0.165))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7809__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.119) (::0.112)))
+          (COND ~B (IOPATH A Y (::0.143) (::0.128)))
+          (COND A (IOPATH B Y (::0.111) (::0.093)))
+          (COND B (IOPATH A Y (::0.115) (::0.106)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7812__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.110) (::0.091)))
+          (IOPATH A0 Y (::0.186) (::0.162))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.111) (::0.120)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.110) (::0.113)))
+          (IOPATH B0 Y (::0.111) (::0.113))
+          (IOPATH A1 Y (::0.201) (::0.172))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7813__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.118) (::0.111)))
+          (COND ~B (IOPATH A Y (::0.144) (::0.127)))
+          (COND A (IOPATH B Y (::0.110) (::0.092)))
+          (COND B (IOPATH A Y (::0.114) (::0.107)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7816__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.111) (::0.098)))
+          (IOPATH A0 Y (::0.210) (::0.163))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.156) (::0.099)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.135) (::0.098)))
+          (IOPATH B0 Y (::0.156) (::0.099))
+          (IOPATH A1 Y (::0.192) (::0.165))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7817__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.118) (::0.112)))
+          (COND ~B (IOPATH A Y (::0.143) (::0.128)))
+          (COND A (IOPATH B Y (::0.111) (::0.092)))
+          (COND B (IOPATH A Y (::0.115) (::0.106)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7820__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.110) (::0.091)))
+          (IOPATH A0 Y (::0.185) (::0.162))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.111) (::0.120)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.110) (::0.113)))
+          (IOPATH B0 Y (::0.111) (::0.113))
+          (IOPATH A1 Y (::0.202) (::0.173))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7821__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.118) (::0.110)))
+          (COND ~B (IOPATH A Y (::0.144) (::0.128)))
+          (COND A (IOPATH B Y (::0.109) (::0.092)))
+          (COND B (IOPATH A Y (::0.114) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7824__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.110) (::0.097)))
+          (IOPATH A0 Y (::0.235) (::0.175))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.155) (::0.098)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.134) (::0.098)))
+          (IOPATH B0 Y (::0.155) (::0.098))
+          (IOPATH A1 Y (::0.192) (::0.165))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7825__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.119) (::0.112)))
+          (COND ~B (IOPATH A Y (::0.143) (::0.128)))
+          (COND A (IOPATH B Y (::0.111) (::0.093)))
+          (COND B (IOPATH A Y (::0.115) (::0.106)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7828__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.110) (::0.091)))
+          (IOPATH A0 Y (::0.181) (::0.161))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.111) (::0.120)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.110) (::0.113)))
+          (IOPATH B0 Y (::0.111) (::0.113))
+          (IOPATH A1 Y (::0.201) (::0.172))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7829__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.117) (::0.111)))
+          (COND ~B (IOPATH A Y (::0.144) (::0.127)))
+          (COND A (IOPATH B Y (::0.110) (::0.091)))
+          (COND B (IOPATH A Y (::0.114) (::0.107)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7832__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.110) (::0.097)))
+          (IOPATH A0 Y (::0.208) (::0.162))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.155) (::0.098)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.134) (::0.098)))
+          (IOPATH B0 Y (::0.155) (::0.098))
+          (IOPATH A1 Y (::0.192) (::0.165))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7833__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.118) (::0.111)))
+          (COND ~B (IOPATH A Y (::0.143) (::0.128)))
+          (COND A (IOPATH B Y (::0.110) (::0.092)))
+          (COND B (IOPATH A Y (::0.115) (::0.106)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7836__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.110) (::0.091)))
+          (IOPATH A0 Y (::0.183) (::0.160))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.111) (::0.119)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.110) (::0.113)))
+          (IOPATH B0 Y (::0.111) (::0.113))
+          (IOPATH A1 Y (::0.204) (::0.172))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7837__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.117) (::0.111)))
+          (COND ~B (IOPATH A Y (::0.144) (::0.130)))
+          (COND A (IOPATH B Y (::0.110) (::0.091)))
+          (COND B (IOPATH A Y (::0.116) (::0.107)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7840__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.110) (::0.097)))
+          (IOPATH A0 Y (::0.209) (::0.164))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.155) (::0.098)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.134) (::0.098)))
+          (IOPATH B0 Y (::0.155) (::0.098))
+          (IOPATH A1 Y (::0.206) (::0.178))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7841__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.118) (::0.112)))
+          (COND ~B (IOPATH A Y (::0.149) (::0.140)))
+          (COND A (IOPATH B Y (::0.111) (::0.092)))
+          (COND B (IOPATH A Y (::0.127) (::0.115)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7844__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.157) (::0.120)))
+          (IOPATH A0 Y (::0.278) (::0.216))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.158) (::0.149)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.157) (::0.142)))
+          (IOPATH B0 Y (::0.158) (::0.142))
+          (IOPATH A1 Y (::0.182) (::0.140))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7845__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.172) (::0.199)))
+          (COND ~B (IOPATH A Y (::0.121) (::0.110)))
+          (COND A (IOPATH B Y (::0.216) (::0.174)))
+          (COND B (IOPATH A Y (::0.097) (::0.075)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7846__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.154) (::0.128))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.133) (::0.128)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.201) (::0.201)))
+          (IOPATH B0 Y (::0.096) (::0.075))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.110) (::0.085)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.096) (::0.075)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.101) (::0.085)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.074) (::0.074)))
+          (IOPATH A1 Y (::0.227) (::0.201))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.125) (::0.086)))
+          (IOPATH B1 Y (::0.125) (::0.086))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.154) (::0.114)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.141) (::0.114)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.227) (::0.175)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.205) (::0.173)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.080) (::0.074)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7847)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.095) (::0.094))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7848__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.104) (::0.092)))
+          (IOPATH A0 Y (::0.197) (::0.147))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.105) (::0.119)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.104) (::0.107)))
+          (IOPATH B0 Y (::0.105) (::0.107))
+          (IOPATH A1 Y (::0.132) (::0.103))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7849__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.172) (::0.200)))
+          (COND ~B (IOPATH A Y (::0.121) (::0.110)))
+          (COND A (IOPATH B Y (::0.217) (::0.176)))
+          (COND B (IOPATH A Y (::0.097) (::0.075)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7851)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.094) (::0.094))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7852__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.106) (::0.087)))
+          (IOPATH A0 Y (::0.197) (::0.147))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.107) (::0.112)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.106) (::0.101)))
+          (IOPATH B0 Y (::0.107) (::0.101))
+          (IOPATH A1 Y (::0.131) (::0.103))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7853__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.172) (::0.200)))
+          (COND ~B (IOPATH A Y (::0.121) (::0.110)))
+          (COND A (IOPATH B Y (::0.217) (::0.176)))
+          (COND B (IOPATH A Y (::0.097) (::0.075)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7855)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.094) (::0.094))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7856__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.118) (::0.086)))
+          (IOPATH A0 Y (::0.196) (::0.146))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.119) (::0.111)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.118) (::0.100)))
+          (IOPATH B0 Y (::0.119) (::0.100))
+          (IOPATH A1 Y (::0.128) (::0.101))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7857__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.172) (::0.200)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.108)))
+          (COND A (IOPATH B Y (::0.217) (::0.176)))
+          (COND B (IOPATH A Y (::0.095) (::0.073)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7858__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.142) (::0.122))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.122) (::0.122)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.202) (::0.202)))
+          (IOPATH B0 Y (::0.086) (::0.067))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.100) (::0.081)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.086) (::0.067)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.090) (::0.081)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.065) (::0.065)))
+          (IOPATH A1 Y (::0.228) (::0.202))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.113) (::0.082)))
+          (IOPATH B1 Y (::0.113) (::0.082))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.142) (::0.109)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.130) (::0.108)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.228) (::0.176)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.207) (::0.174)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.072) (::0.066)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7859)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.085) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7860__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.082) (::0.070)))
+          (IOPATH A0 Y (::0.132) (::0.116))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.083) (::0.092)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.082)))
+          (IOPATH B0 Y (::0.083) (::0.082))
+          (IOPATH A1 Y (::0.129) (::0.102))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7861__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.117) (::0.110)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.108)))
+          (COND A (IOPATH B Y (::0.109) (::0.092)))
+          (COND B (IOPATH A Y (::0.095) (::0.073)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7862__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.056) (::0.056)))
+          (IOPATH A0 Y (::0.100) (::0.075))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.075) (::0.058)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.062) (::0.057)))
+          (IOPATH B0 Y (::0.075) (::0.058))
+          (IOPATH A1 Y (::0.095) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7863)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.084) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7864__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.081) (::0.069)))
+          (IOPATH A0 Y (::0.134) (::0.117))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.082) (::0.092)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.082)))
+          (IOPATH B0 Y (::0.082) (::0.082))
+          (IOPATH A1 Y (::0.128) (::0.101))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7865__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.116) (::0.112)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.108)))
+          (COND A (IOPATH B Y (::0.110) (::0.090)))
+          (COND B (IOPATH A Y (::0.095) (::0.073)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7866__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.056) (::0.057)))
+          (IOPATH A0 Y (::0.100) (::0.074))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.075) (::0.058)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.062) (::0.057)))
+          (IOPATH B0 Y (::0.075) (::0.058))
+          (IOPATH A1 Y (::0.095) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7867)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.085) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7868__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.081) (::0.069)))
+          (IOPATH A0 Y (::0.132) (::0.117))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.082) (::0.092)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.082)))
+          (IOPATH B0 Y (::0.082) (::0.082))
+          (IOPATH A1 Y (::0.128) (::0.101))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7869__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.116) (::0.112)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.108)))
+          (COND A (IOPATH B Y (::0.110) (::0.090)))
+          (COND B (IOPATH A Y (::0.095) (::0.073)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7870__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.056) (::0.056)))
+          (IOPATH A0 Y (::0.099) (::0.074))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.076) (::0.058)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.062) (::0.057)))
+          (IOPATH B0 Y (::0.076) (::0.058))
+          (IOPATH A1 Y (::0.094) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7871)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.084) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7872__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.081) (::0.069)))
+          (IOPATH A0 Y (::0.130) (::0.115))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.082) (::0.092)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.082)))
+          (IOPATH B0 Y (::0.082) (::0.082))
+          (IOPATH A1 Y (::0.128) (::0.101))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7873__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.117) (::0.110)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.108)))
+          (COND A (IOPATH B Y (::0.108) (::0.092)))
+          (COND B (IOPATH A Y (::0.095) (::0.073)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7874__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.057) (::0.055)))
+          (IOPATH A0 Y (::0.100) (::0.075))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.077) (::0.056)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.063) (::0.056)))
+          (IOPATH B0 Y (::0.077) (::0.056))
+          (IOPATH A1 Y (::0.095) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7875)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.084) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7876__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.081) (::0.070)))
+          (IOPATH A0 Y (::0.133) (::0.117))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.082) (::0.093)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.081) (::0.083)))
+          (IOPATH B0 Y (::0.082) (::0.083))
+          (IOPATH A1 Y (::0.128) (::0.101))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7877__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.117) (::0.112)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.108)))
+          (COND A (IOPATH B Y (::0.110) (::0.091)))
+          (COND B (IOPATH A Y (::0.095) (::0.073)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7878__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.056) (::0.057)))
+          (IOPATH A0 Y (::0.116) (::0.084))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.076) (::0.058)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.062) (::0.057)))
+          (IOPATH B0 Y (::0.076) (::0.058))
+          (IOPATH A1 Y (::0.094) (::0.082))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7879)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.084) (::0.081))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7880__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.087) (::0.076)))
+          (IOPATH A0 Y (::0.106) (::0.091))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.088) (::0.099)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.087) (::0.089)))
+          (IOPATH B0 Y (::0.088) (::0.089))
+          (IOPATH A1 Y (::0.128) (::0.101))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7881__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.117) (::0.110)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.108)))
+          (COND A (IOPATH B Y (::0.109) (::0.092)))
+          (COND B (IOPATH A Y (::0.095) (::0.073)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7882__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.142) (::0.121))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.121) (::0.121)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.092) (::0.089)))
+          (IOPATH B0 Y (::0.086) (::0.067))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.099) (::0.081)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.086) (::0.067)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.089) (::0.080)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.066) (::0.065)))
+          (IOPATH A1 Y (::0.112) (::0.089))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.112) (::0.082)))
+          (IOPATH B1 Y (::0.112) (::0.082))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.142) (::0.108)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.129) (::0.107)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.112) (::0.077)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.099) (::0.077)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.072) (::0.066)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.085) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7884__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.082) (::0.070)))
+          (IOPATH A0 Y (::0.132) (::0.116))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.083) (::0.092)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.082)))
+          (IOPATH B0 Y (::0.083) (::0.082))
+          (IOPATH A1 Y (::0.129) (::0.102))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7885__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.117) (::0.110)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.108)))
+          (COND A (IOPATH B Y (::0.109) (::0.092)))
+          (COND B (IOPATH A Y (::0.095) (::0.073)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7886__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.056) (::0.056)))
+          (IOPATH A0 Y (::0.100) (::0.074))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.075) (::0.058)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.062) (::0.057)))
+          (IOPATH B0 Y (::0.075) (::0.058))
+          (IOPATH A1 Y (::0.095) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7887)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.084) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7888__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.081) (::0.069)))
+          (IOPATH A0 Y (::0.132) (::0.117))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.082) (::0.092)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.082)))
+          (IOPATH B0 Y (::0.082) (::0.082))
+          (IOPATH A1 Y (::0.128) (::0.101))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7889__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.116) (::0.112)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.108)))
+          (COND A (IOPATH B Y (::0.110) (::0.090)))
+          (COND B (IOPATH A Y (::0.095) (::0.073)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7890__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.056) (::0.056)))
+          (IOPATH A0 Y (::0.099) (::0.074))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.075) (::0.058)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.062) (::0.057)))
+          (IOPATH B0 Y (::0.075) (::0.058))
+          (IOPATH A1 Y (::0.095) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7891)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.084) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7892__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.081) (::0.069)))
+          (IOPATH A0 Y (::0.131) (::0.117))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.082) (::0.092)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.082)))
+          (IOPATH B0 Y (::0.082) (::0.082))
+          (IOPATH A1 Y (::0.128) (::0.101))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7893__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.149) (::0.139)))
+          (COND ~B (IOPATH A Y (::0.163) (::0.144)))
+          (COND A (IOPATH B Y (::0.146) (::0.122)))
+          (COND B (IOPATH A Y (::0.139) (::0.125)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7894__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.084) (::0.082))
+          (IOPATH A1 Y (::0.096) (::0.090))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.102) (::0.092)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.115) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7895__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.145) (::0.132)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.107)))
+          (COND A (IOPATH B Y (::0.152) (::0.142)))
+          (COND B (IOPATH A Y (::0.164) (::0.152)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7896__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.152) (::0.138)))
+          (COND ~B (IOPATH A Y (::0.160) (::0.145)))
+          (COND A (IOPATH B Y (::0.145) (::0.126)))
+          (COND B (IOPATH A Y (::0.141) (::0.121)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7897__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.147) (::0.130)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.113)))
+          (COND A (IOPATH B Y (::0.151) (::0.144)))
+          (COND B (IOPATH A Y (::0.169) (::0.151)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7898__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.078) (::0.076))
+          (IOPATH A1 Y (::0.096) (::0.091))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.093) (::0.087)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.109) (::0.111)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7899__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.078) (::0.076))
+          (IOPATH A1 Y (::0.096) (::0.091))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.094) (::0.084)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.105) (::0.113)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7900__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.116) (::0.112)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.108)))
+          (COND A (IOPATH B Y (::0.110) (::0.090)))
+          (COND B (IOPATH A Y (::0.095) (::0.074)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7901__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.056) (::0.056)))
+          (IOPATH A0 Y (::0.100) (::0.074))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.075) (::0.058)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.062) (::0.057)))
+          (IOPATH B0 Y (::0.075) (::0.058))
+          (IOPATH A1 Y (::0.096) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7902__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.197) (::0.167)))
+          (COND ~B (IOPATH A Y (::0.200) (::0.170)))
+          (COND A (IOPATH B Y (::0.188) (::0.155)))
+          (COND B (IOPATH A Y (::0.180) (::0.143)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_6")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7903)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.538) (::0.517))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_4")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7904__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.576) (::0.640))
+          (IOPATH B Y (::0.555) (::0.613))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7905__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.159) (::0.162)))
+          (COND ~B (IOPATH A Y (::0.156) (::0.138)))
+          (COND A (IOPATH B Y (::0.171) (::0.137)))
+          (COND B (IOPATH A Y (::0.132) (::0.115)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7906__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.078) (::0.076))
+          (IOPATH A1 Y (::0.096) (::0.091))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.095) (::0.084)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.105) (::0.113)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7907)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.086) (::0.082))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7909__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.100) (::0.077))
+          (IOPATH B Y (::0.080) (::0.056))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7910__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.197) (::0.166)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.166)))
+          (COND A (IOPATH B Y (::0.186) (::0.157)))
+          (COND B (IOPATH A Y (::0.176) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7911__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.161) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.122) (::0.115)))
+          (IOPATH B0 Y (::0.164) (::0.130))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.161) (::0.128)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.164) (::0.130)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.140) (::0.127)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.127) (::0.128)))
+          (IOPATH A1 Y (::0.157) (::0.115))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.176) (::0.128)))
+          (IOPATH B1 Y (::0.176) (::0.128))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.141)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.181) (::0.140)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.157) (::0.103)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.139) (::0.103)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.145) (::0.129)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7912__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.154) (::0.175)))
+          (IOPATH A0 Y (::0.168) (::0.167))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.163) (::0.145)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.164) (::0.167)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.141) (::0.152)))
+          (IOPATH B0 Y (::0.141) (::0.152))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.152) (::0.138)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.127) (::0.083)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.153) (::0.151)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.140) (::0.123)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.122) (::0.095)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.123) (::0.120)))
+          (IOPATH A1 Y (::0.127) (::0.120))
+          (IOPATH B1 Y (::0.154) (::0.175))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.168) (::0.131)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.139) (::0.114)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7913__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.081) (::0.069)))
+          (IOPATH A0 Y (::0.109) (::0.092))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.082) (::0.092)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.082)))
+          (IOPATH B0 Y (::0.082) (::0.082))
+          (IOPATH A1 Y (::0.152) (::0.133))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_8")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7914)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.476) (::0.454))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_8")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7915)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.476) (::0.454))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7916__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.153) (::0.139)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.157)))
+          (COND A (IOPATH B Y (::0.146) (::0.127)))
+          (COND B (IOPATH A Y (::0.153) (::0.129)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7917__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.141) (::0.127)))
+          (COND ~B (IOPATH A Y (::0.128) (::0.116)))
+          (COND A (IOPATH B Y (::0.148) (::0.139)))
+          (COND B (IOPATH A Y (::0.172) (::0.158)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7918__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.178) (::0.152)))
+          (COND ~B (IOPATH A Y (::0.186) (::0.163)))
+          (COND A (IOPATH B Y (::0.166) (::0.144)))
+          (COND B (IOPATH A Y (::0.167) (::0.139)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_4")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7919__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.582) (::0.645))
+          (IOPATH B Y (::0.561) (::0.618))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7920__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.167)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.167)))
+          (COND A (IOPATH B Y (::0.188) (::0.160)))
+          (COND B (IOPATH A Y (::0.177) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_4")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7921__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.582) (::0.645))
+          (IOPATH B Y (::0.561) (::0.618))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7923__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.100) (::0.077))
+          (IOPATH B Y (::0.080) (::0.056))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7925__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.100) (::0.076))
+          (IOPATH B Y (::0.081) (::0.056))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7926__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.158) (::0.175)))
+          (IOPATH A0 Y (::0.171) (::0.170))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.165) (::0.147)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.167) (::0.170)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.143) (::0.154)))
+          (IOPATH B0 Y (::0.143) (::0.154))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.157) (::0.139)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.130) (::0.085)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.157) (::0.152)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.142) (::0.125)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.097)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.126) (::0.122)))
+          (IOPATH A1 Y (::0.130) (::0.122))
+          (IOPATH B1 Y (::0.158) (::0.175))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.171) (::0.133)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.141) (::0.116)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7927__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.159) (::0.178)))
+          (IOPATH A0 Y (::0.170) (::0.169))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.165) (::0.147)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.167) (::0.169)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.146) (::0.157)))
+          (IOPATH B0 Y (::0.146) (::0.157))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.157) (::0.142)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.128) (::0.082)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.158) (::0.154)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.144) (::0.128)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.122) (::0.094)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.124) (::0.119)))
+          (IOPATH A1 Y (::0.128) (::0.119))
+          (IOPATH B1 Y (::0.159) (::0.178))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.170) (::0.133)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.144) (::0.119)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7928__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.113) (::0.108)))
+          (IOPATH A0 Y (::0.209) (::0.165))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.156) (::0.110)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.136) (::0.109)))
+          (IOPATH B0 Y (::0.156) (::0.110))
+          (IOPATH A1 Y (::0.187) (::0.160))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7929__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.276) (::0.276)))
+          (IOPATH A0 Y (::0.196) (::0.196))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.191) (::0.172)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.192) (::0.196)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.172) (::0.178)))
+          (IOPATH B0 Y (::0.172) (::0.178))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.273) (::0.224)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.155) (::0.098)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.274) (::0.243)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.170) (::0.148)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.149) (::0.114)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.151) (::0.141)))
+          (IOPATH A1 Y (::0.155) (::0.141))
+          (IOPATH B1 Y (::0.276) (::0.276))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.196) (::0.155)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7930__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.161) (::0.186)))
+          (IOPATH A0 Y (::0.173) (::0.175))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.168) (::0.153)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.169) (::0.175)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.147) (::0.155)))
+          (IOPATH B0 Y (::0.147) (::0.155))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.159) (::0.149)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.131) (::0.086)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.159) (::0.162)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.145) (::0.126)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.126) (::0.098)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.127) (::0.123)))
+          (IOPATH A1 Y (::0.131) (::0.123))
+          (IOPATH B1 Y (::0.161) (::0.186))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.173) (::0.140)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.145) (::0.117)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7931__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.182) (::0.199)))
+          (IOPATH A0 Y (::0.196) (::0.189))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.191) (::0.166)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.193) (::0.189)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.170) (::0.177)))
+          (IOPATH B0 Y (::0.170) (::0.177))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.159)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.156) (::0.100)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.175)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.169) (::0.147)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.151) (::0.116)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.152) (::0.143)))
+          (IOPATH A1 Y (::0.156) (::0.143))
+          (IOPATH B1 Y (::0.182) (::0.199))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.196) (::0.147)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.168) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_8")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7933)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.476) (::0.454))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7934__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.054) (::0.053)))
+          (IOPATH A0 Y (::0.101) (::0.074))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.074) (::0.055)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.061) (::0.054)))
+          (IOPATH B0 Y (::0.074) (::0.055))
+          (IOPATH A1 Y (::0.094) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7935__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.116) (::0.112)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.108)))
+          (COND A (IOPATH B Y (::0.111) (::0.090)))
+          (COND B (IOPATH A Y (::0.095) (::0.073)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7936__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.156) (::0.139)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.146)))
+          (COND A (IOPATH B Y (::0.147) (::0.129)))
+          (COND B (IOPATH A Y (::0.143) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7937__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.130) (::0.117)))
+          (COND ~B (IOPATH A Y (::0.162) (::0.145)))
+          (COND A (IOPATH B Y (::0.121) (::0.096)))
+          (COND B (IOPATH A Y (::0.140) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7938__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.159) (::0.162)))
+          (COND ~B (IOPATH A Y (::0.156) (::0.138)))
+          (COND A (IOPATH B Y (::0.171) (::0.137)))
+          (COND B (IOPATH A Y (::0.133) (::0.114)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7939__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.157) (::0.142)))
+          (COND ~B (IOPATH A Y (::0.168) (::0.147)))
+          (COND A (IOPATH B Y (::0.149) (::0.130)))
+          (COND B (IOPATH A Y (::0.144) (::0.130)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7940__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.153) (::0.132)))
+          (COND ~B (IOPATH A Y (::0.129) (::0.116)))
+          (COND A (IOPATH B Y (::0.152) (::0.149)))
+          (COND B (IOPATH A Y (::0.172) (::0.159)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7941__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.151) (::0.138)))
+          (COND ~B (IOPATH A Y (::0.140) (::0.123)))
+          (COND A (IOPATH B Y (::0.144) (::0.125)))
+          (COND B (IOPATH A Y (::0.116) (::0.090)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7942__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.151) (::0.136)))
+          (COND ~B (IOPATH A Y (::0.140) (::0.123)))
+          (COND A (IOPATH B Y (::0.143) (::0.124)))
+          (COND B (IOPATH A Y (::0.116) (::0.090)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7943__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.182) (::0.168)))
+          (COND ~B (IOPATH A Y (::0.174) (::0.150)))
+          (COND A (IOPATH B Y (::0.184) (::0.151)))
+          (COND B (IOPATH A Y (::0.153) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_4")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7944__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.588) (::0.647))
+          (IOPATH B Y (::0.561) (::0.618))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7945__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.134) (::0.117))
+          (IOPATH B Y (::0.135) (::0.121))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7946__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.103) (::0.070))
+          (IOPATH B Y (::0.102) (::0.073))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7947__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.105) (::0.096))
+          (IOPATH B Y (::0.114) (::0.105))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7948__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.113) (::0.081))
+          (IOPATH B Y (::0.095) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7949__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.103) (::0.070))
+          (IOPATH B Y (::0.105) (::0.074))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7950__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.123) (::0.149))
+          (IOPATH B Y (::0.107) (::0.131))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7951__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.095) (::0.062))
+          (IOPATH B Y (::0.096) (::0.071))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7952__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.114) (::0.087))
+          (IOPATH B Y (::0.089) (::0.060))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7953__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.214) (::0.166))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.182) (::0.166)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.122) (::0.115)))
+          (IOPATH B0 Y (::0.158) (::0.124))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.156) (::0.122)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.158) (::0.124)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.136) (::0.122)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.123)))
+          (IOPATH A1 Y (::0.156) (::0.115))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.170) (::0.123)))
+          (IOPATH B1 Y (::0.170) (::0.123))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.214) (::0.154)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.199) (::0.153)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.156) (::0.103)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.138) (::0.103)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.140) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7956__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.181) (::0.203)))
+          (COND ~B (IOPATH A Y (::0.168) (::0.148)))
+          (COND A (IOPATH B Y (::0.232) (::0.178)))
+          (COND B (IOPATH A Y (::0.145) (::0.130)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7957__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.130) (::0.117)))
+          (COND ~B (IOPATH A Y (::0.162) (::0.143)))
+          (COND A (IOPATH B Y (::0.121) (::0.096)))
+          (COND B (IOPATH A Y (::0.138) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7958__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.140)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.145)))
+          (COND A (IOPATH B Y (::0.148) (::0.128)))
+          (COND B (IOPATH A Y (::0.142) (::0.126)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7959__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.160) (::0.141)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.147)))
+          (COND A (IOPATH B Y (::0.149) (::0.135)))
+          (COND B (IOPATH A Y (::0.144) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7960__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.138)))
+          (COND ~B (IOPATH A Y (::0.129) (::0.117)))
+          (COND A (IOPATH B Y (::0.158) (::0.150)))
+          (COND B (IOPATH A Y (::0.174) (::0.158)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7961__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.143) (::0.132)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.108)))
+          (COND A (IOPATH B Y (::0.152) (::0.141)))
+          (COND B (IOPATH A Y (::0.164) (::0.152)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7962__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.139) (::0.133)))
+          (COND ~B (IOPATH A Y (::0.162) (::0.144)))
+          (COND A (IOPATH B Y (::0.139) (::0.108)))
+          (COND B (IOPATH A Y (::0.140) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7963__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.157) (::0.141)))
+          (COND ~B (IOPATH A Y (::0.168) (::0.147)))
+          (COND A (IOPATH B Y (::0.149) (::0.130)))
+          (COND B (IOPATH A Y (::0.144) (::0.130)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7964__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.211) (::0.181)))
+          (COND ~B (IOPATH A Y (::0.208) (::0.178)))
+          (COND A (IOPATH B Y (::0.204) (::0.174)))
+          (COND B (IOPATH A Y (::0.190) (::0.155)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7965__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.206) (::0.186)))
+          (COND ~B (IOPATH A Y (::0.206) (::0.181)))
+          (COND A (IOPATH B Y (::0.208) (::0.171)))
+          (COND B (IOPATH A Y (::0.192) (::0.155)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7966)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.085) (::0.079))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7967)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.084) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7968__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.124) (::0.109))
+          (IOPATH B Y (::0.154) (::0.177))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7969__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.108) (::0.082))
+          (IOPATH B Y (::0.105) (::0.074))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7970__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.103) (::0.070))
+          (IOPATH B Y (::0.104) (::0.074))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7971__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.134) (::0.116))
+          (IOPATH B Y (::0.134) (::0.122))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7972__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.124) (::0.108))
+          (IOPATH B Y (::0.123) (::0.112))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7973__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.112) (::0.088))
+          (IOPATH B Y (::0.094) (::0.068))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7974__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.134) (::0.118))
+          (IOPATH B Y (::0.141) (::0.123))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7975__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.188) (::0.148))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.156) (::0.148)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.119) (::0.112)))
+          (IOPATH B0 Y (::0.154) (::0.121))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.153) (::0.119)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.154) (::0.121)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.134) (::0.119)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.119) (::0.120)))
+          (IOPATH A1 Y (::0.152) (::0.112))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.168) (::0.120)))
+          (IOPATH B1 Y (::0.168) (::0.120))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.188) (::0.137)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.174) (::0.136)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.152) (::0.101)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.134) (::0.100)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.135) (::0.120)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7976__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.070) (::0.067)))
+          (IOPATH A0 Y (::0.147) (::0.122))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.097) (::0.068)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.068)))
+          (IOPATH B0 Y (::0.097) (::0.068))
+          (IOPATH A1 Y (::0.135) (::0.124))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7977__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.096) (::0.088)))
+          (IOPATH A0 Y (::0.268) (::0.205))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.131) (::0.089)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.113) (::0.088)))
+          (IOPATH B0 Y (::0.131) (::0.089))
+          (IOPATH A1 Y (::0.173) (::0.152))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7978__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.234) (::0.235)))
+          (IOPATH A0 Y (::0.186) (::0.186))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.180) (::0.164)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.186)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.147) (::0.156)))
+          (IOPATH B0 Y (::0.147) (::0.156))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.231) (::0.188)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.133) (::0.087)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.232) (::0.204)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.145) (::0.127)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.128) (::0.099)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.129) (::0.124)))
+          (IOPATH A1 Y (::0.133) (::0.124))
+          (IOPATH B1 Y (::0.234) (::0.235))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.186) (::0.152)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.145) (::0.118)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7979__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.082) (::0.069)))
+          (IOPATH A0 Y (::0.132) (::0.115))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.082) (::0.092)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.082)))
+          (IOPATH B0 Y (::0.082) (::0.082))
+          (IOPATH A1 Y (::0.128) (::0.101))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7980__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.163) (::0.162)))
+          (COND ~B (IOPATH A Y (::0.163) (::0.157)))
+          (COND A (IOPATH B Y (::0.172) (::0.145)))
+          (COND B (IOPATH A Y (::0.153) (::0.125)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7981__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.141)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.146)))
+          (COND A (IOPATH B Y (::0.148) (::0.128)))
+          (COND B (IOPATH A Y (::0.143) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7982__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.150) (::0.133)))
+          (COND ~B (IOPATH A Y (::0.161) (::0.142)))
+          (COND A (IOPATH B Y (::0.139) (::0.125)))
+          (COND B (IOPATH A Y (::0.136) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7984__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.160) (::0.142)))
+          (COND ~B (IOPATH A Y (::0.176) (::0.150)))
+          (COND A (IOPATH B Y (::0.153) (::0.124)))
+          (COND B (IOPATH A Y (::0.152) (::0.129)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7985__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.178) (::0.160)))
+          (COND ~B (IOPATH A Y (::0.185) (::0.162)))
+          (COND A (IOPATH B Y (::0.174) (::0.146)))
+          (COND B (IOPATH A Y (::0.166) (::0.141)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7986__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.118) (::0.093)))
+          (IOPATH A0 Y (::0.178) (::0.156))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.119) (::0.121)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.118) (::0.114)))
+          (IOPATH B0 Y (::0.119) (::0.114))
+          (IOPATH A1 Y (::0.197) (::0.168))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7987__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.188) (::0.160)))
+          (COND ~B (IOPATH A Y (::0.202) (::0.171)))
+          (COND A (IOPATH B Y (::0.180) (::0.143)))
+          (COND B (IOPATH A Y (::0.181) (::0.148)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7988__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.204) (::0.178)))
+          (COND ~B (IOPATH A Y (::0.203) (::0.171)))
+          (COND A (IOPATH B Y (::0.200) (::0.163)))
+          (COND B (IOPATH A Y (::0.182) (::0.145)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7989__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.211) (::0.181)))
+          (COND ~B (IOPATH A Y (::0.210) (::0.181)))
+          (COND A (IOPATH B Y (::0.204) (::0.176)))
+          (COND B (IOPATH A Y (::0.193) (::0.157)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7990__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.183) (::0.157)))
+          (COND ~B (IOPATH A Y (::0.198) (::0.166)))
+          (COND A (IOPATH B Y (::0.176) (::0.140)))
+          (COND B (IOPATH A Y (::0.175) (::0.145)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7991__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.187) (::0.161)))
+          (COND ~B (IOPATH A Y (::0.211) (::0.178)))
+          (COND A (IOPATH B Y (::0.181) (::0.143)))
+          (COND B (IOPATH A Y (::0.188) (::0.162)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7992__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.186) (::0.160)))
+          (COND ~B (IOPATH A Y (::0.191) (::0.163)))
+          (COND A (IOPATH B Y (::0.178) (::0.146)))
+          (COND B (IOPATH A Y (::0.170) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7994)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.083) (::0.077))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7995)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.083) (::0.077))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7996)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.085) (::0.080))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7997__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.116) (::0.088))
+          (IOPATH B Y (::0.079) (::0.053))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7998__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.131) (::0.162))
+          (IOPATH B Y (::0.117) (::0.146))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g7999__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.135) (::0.117))
+          (IOPATH B Y (::0.135) (::0.119))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8000__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.068) (::0.078))
+          (IOPATH B Y (::0.063) (::0.061))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8001__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.098) (::0.074))
+          (IOPATH B Y (::0.066) (::0.047))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8002__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.202) (::0.156))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.169) (::0.156)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.123) (::0.115)))
+          (IOPATH B0 Y (::0.158) (::0.125))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.166) (::0.129)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.158) (::0.125)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.146) (::0.128)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.123)))
+          (IOPATH A1 Y (::0.156) (::0.115))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.181) (::0.129)))
+          (IOPATH B1 Y (::0.181) (::0.129))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.202) (::0.144)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.187) (::0.144)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.156) (::0.104)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.139) (::0.103)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.139) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8003__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.245) (::0.230)))
+          (IOPATH A0 Y (::0.173) (::0.176))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.168) (::0.154)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.169) (::0.176)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.142) (::0.153)))
+          (IOPATH B0 Y (::0.142) (::0.153))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.243) (::0.184)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.132) (::0.086)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.243) (::0.199)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.140) (::0.124)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.127) (::0.098)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.128) (::0.123)))
+          (IOPATH A1 Y (::0.132) (::0.123))
+          (IOPATH B1 Y (::0.245) (::0.230))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.173) (::0.141)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.140) (::0.115)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8004__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.088) (::0.078)))
+          (IOPATH A0 Y (::0.191) (::0.150))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.125) (::0.079)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.107) (::0.078)))
+          (IOPATH B0 Y (::0.125) (::0.079))
+          (IOPATH A1 Y (::0.166) (::0.146))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8005__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.098) (::0.077)))
+          (IOPATH A0 Y (::0.152) (::0.133))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.099) (::0.102)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.098) (::0.094)))
+          (IOPATH B0 Y (::0.099) (::0.094))
+          (IOPATH A1 Y (::0.172) (::0.147))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8006__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.072) (::0.072)))
+          (IOPATH A0 Y (::0.146) (::0.118))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.099) (::0.073)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.083) (::0.072)))
+          (IOPATH B0 Y (::0.099) (::0.073))
+          (IOPATH A1 Y (::0.134) (::0.122))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8007__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.072) (::0.068)))
+          (IOPATH A0 Y (::0.148) (::0.122))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.098) (::0.069)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.083) (::0.068)))
+          (IOPATH B0 Y (::0.098) (::0.069))
+          (IOPATH A1 Y (::0.135) (::0.122))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8008__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.275) (::0.276)))
+          (IOPATH A0 Y (::0.209) (::0.208))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.204) (::0.184)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.205) (::0.208)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.185) (::0.184)))
+          (IOPATH B0 Y (::0.185) (::0.184))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.273) (::0.224)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.157) (::0.101)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.273) (::0.243)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.183) (::0.153)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.152) (::0.117)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.153) (::0.144)))
+          (IOPATH A1 Y (::0.157) (::0.144))
+          (IOPATH B1 Y (::0.275) (::0.276))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.209) (::0.170)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.183) (::0.142)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8009__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.074) (::0.073)))
+          (IOPATH A0 Y (::0.148) (::0.121))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.101) (::0.074)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.085) (::0.073)))
+          (IOPATH B0 Y (::0.101) (::0.074))
+          (IOPATH A1 Y (::0.135) (::0.122))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8010__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.129) (::0.115)))
+          (IOPATH A0 Y (::0.196) (::0.139))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.171) (::0.116)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.151) (::0.116)))
+          (IOPATH B0 Y (::0.171) (::0.116))
+          (IOPATH A1 Y (::0.176) (::0.138))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8011__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.056) (::0.056)))
+          (IOPATH A0 Y (::0.100) (::0.074))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.075) (::0.058)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.062) (::0.057)))
+          (IOPATH B0 Y (::0.075) (::0.058))
+          (IOPATH A1 Y (::0.096) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8012__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.118) (::0.110)))
+          (COND ~B (IOPATH A Y (::0.120) (::0.108)))
+          (COND A (IOPATH B Y (::0.108) (::0.092)))
+          (COND B (IOPATH A Y (::0.095) (::0.074)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8013__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.177) (::0.196)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.147)))
+          (COND A (IOPATH B Y (::0.221) (::0.169)))
+          (COND B (IOPATH A Y (::0.144) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8014__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.151) (::0.137)))
+          (COND ~B (IOPATH A Y (::0.140) (::0.123)))
+          (COND A (IOPATH B Y (::0.144) (::0.125)))
+          (COND B (IOPATH A Y (::0.116) (::0.090)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8015__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.238) (::0.193)))
+          (COND ~B (IOPATH A Y (::0.141) (::0.125)))
+          (COND A (IOPATH B Y (::0.186) (::0.210)))
+          (COND B (IOPATH A Y (::0.180) (::0.169)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8016__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.188) (::0.160)))
+          (COND ~B (IOPATH A Y (::0.210) (::0.177)))
+          (COND A (IOPATH B Y (::0.180) (::0.143)))
+          (COND B (IOPATH A Y (::0.187) (::0.160)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8017__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.200) (::0.176)))
+          (COND ~B (IOPATH A Y (::0.198) (::0.168)))
+          (COND A (IOPATH B Y (::0.197) (::0.160)))
+          (COND B (IOPATH A Y (::0.178) (::0.141)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8018__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.204) (::0.173)))
+          (COND ~B (IOPATH A Y (::0.202) (::0.170)))
+          (COND A (IOPATH B Y (::0.195) (::0.162)))
+          (COND B (IOPATH A Y (::0.181) (::0.144)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8019__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.188) (::0.152)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.167)))
+          (COND A (IOPATH B Y (::0.170) (::0.144)))
+          (COND B (IOPATH A Y (::0.177) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8020__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.201) (::0.173)))
+          (COND ~B (IOPATH A Y (::0.196) (::0.167)))
+          (COND A (IOPATH B Y (::0.194) (::0.162)))
+          (COND B (IOPATH A Y (::0.176) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8021__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.187) (::0.161)))
+          (COND ~B (IOPATH A Y (::0.209) (::0.176)))
+          (COND A (IOPATH B Y (::0.181) (::0.143)))
+          (COND B (IOPATH A Y (::0.186) (::0.159)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8022__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.206) (::0.175)))
+          (COND ~B (IOPATH A Y (::0.212) (::0.179)))
+          (COND A (IOPATH B Y (::0.198) (::0.165)))
+          (COND B (IOPATH A Y (::0.191) (::0.159)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8023__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.183) (::0.162)))
+          (COND ~B (IOPATH A Y (::0.187) (::0.173)))
+          (COND A (IOPATH B Y (::0.177) (::0.151)))
+          (COND B (IOPATH A Y (::0.178) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8024__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.194) (::0.165)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.167)))
+          (COND A (IOPATH B Y (::0.185) (::0.152)))
+          (COND B (IOPATH A Y (::0.176) (::0.141)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8025)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.051) (::0.047))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8026__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.069) (::0.078))
+          (IOPATH B Y (::0.062) (::0.061))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8027__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.103) (::0.070))
+          (IOPATH B Y (::0.102) (::0.073))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8028__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.131) (::0.163))
+          (IOPATH B Y (::0.117) (::0.144))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8029__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.106) (::0.085))
+          (IOPATH B Y (::0.091) (::0.068))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8030__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.135) (::0.118))
+          (IOPATH B Y (::0.163) (::0.185))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8031__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.082) (::0.079)))
+          (IOPATH A0 Y (::0.179) (::0.139))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.106) (::0.081)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.089) (::0.079)))
+          (IOPATH B0 Y (::0.106) (::0.081))
+          (IOPATH A1 Y (::0.163) (::0.130))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8032__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.108) (::0.078))
+          (IOPATH B Y (::0.080) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8033__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.174) (::0.118))
+          (IOPATH B Y (::0.099) (::0.071))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8034__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.078) (::0.070)))
+          (IOPATH A0 Y (::0.116) (::0.097))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.080) (::0.096)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.079) (::0.080)))
+          (IOPATH B0 Y (::0.080) (::0.080))
+          (IOPATH A1 Y (::0.125) (::0.112))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8035__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.099) (::0.079))
+          (IOPATH B Y (::0.066) (::0.047))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8036__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.108) (::0.078))
+          (IOPATH B Y (::0.080) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8037__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.192) (::0.150))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.159) (::0.150)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.123) (::0.115)))
+          (IOPATH B0 Y (::0.160) (::0.124))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.166) (::0.129)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.160) (::0.124)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.146) (::0.128)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.124) (::0.123)))
+          (IOPATH A1 Y (::0.156) (::0.115))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.181) (::0.129)))
+          (IOPATH B1 Y (::0.181) (::0.129))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.192) (::0.138)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.178) (::0.137)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.156) (::0.104)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.139) (::0.103)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.141) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8038__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.112) (::0.105)))
+          (IOPATH A0 Y (::0.192) (::0.149))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.153) (::0.106)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.133) (::0.105)))
+          (IOPATH B0 Y (::0.153) (::0.106))
+          (IOPATH A1 Y (::0.159) (::0.118))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8039__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.114) (::0.092)))
+          (IOPATH A0 Y (::0.176) (::0.153))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.115) (::0.120)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.114) (::0.113)))
+          (IOPATH B0 Y (::0.115) (::0.113))
+          (IOPATH A1 Y (::0.197) (::0.163))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8040__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.274) (::0.278)))
+          (IOPATH A0 Y (::0.208) (::0.202))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.202) (::0.179)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.204) (::0.202)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.291) (::0.264)))
+          (IOPATH B0 Y (::0.291) (::0.264))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.272) (::0.226)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.158) (::0.102)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.272) (::0.245)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.288) (::0.218)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.153) (::0.118)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.154) (::0.145)))
+          (IOPATH A1 Y (::0.158) (::0.145))
+          (IOPATH B1 Y (::0.274) (::0.278))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.208) (::0.163)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.288) (::0.203)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8042__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.158) (::0.136)))
+          (COND ~B (IOPATH A Y (::0.127) (::0.116)))
+          (COND A (IOPATH B Y (::0.155) (::0.153)))
+          (COND B (IOPATH A Y (::0.171) (::0.157)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8043__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.130) (::0.117)))
+          (COND ~B (IOPATH A Y (::0.162) (::0.143)))
+          (COND A (IOPATH B Y (::0.121) (::0.096)))
+          (COND B (IOPATH A Y (::0.138) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8044__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.160) (::0.149)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.146)))
+          (COND A (IOPATH B Y (::0.158) (::0.134)))
+          (COND B (IOPATH A Y (::0.142) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8045__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.145) (::0.129)))
+          (COND ~B (IOPATH A Y (::0.126) (::0.114)))
+          (COND A (IOPATH B Y (::0.149) (::0.143)))
+          (COND B (IOPATH A Y (::0.170) (::0.156)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8046__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.154) (::0.140)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.146)))
+          (COND A (IOPATH B Y (::0.148) (::0.127)))
+          (COND B (IOPATH A Y (::0.142) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8047__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.169) (::0.124))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.140) (::0.124)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.205) (::0.187)))
+          (IOPATH B0 Y (::0.125) (::0.090))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.198) (::0.142)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.125) (::0.090)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.180) (::0.141)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.095) (::0.089)))
+          (IOPATH A1 Y (::0.230) (::0.187))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.216) (::0.143)))
+          (IOPATH B1 Y (::0.216) (::0.143))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.169) (::0.113)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.155) (::0.112)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.230) (::0.171)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.213) (::0.170)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.108) (::0.089)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8048__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.130) (::0.117)))
+          (COND ~B (IOPATH A Y (::0.162) (::0.143)))
+          (COND A (IOPATH B Y (::0.122) (::0.096)))
+          (COND B (IOPATH A Y (::0.138) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8049__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.145) (::0.132)))
+          (COND ~B (IOPATH A Y (::0.163) (::0.143)))
+          (COND A (IOPATH B Y (::0.138) (::0.117)))
+          (COND B (IOPATH A Y (::0.138) (::0.125)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8050__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.181) (::0.203)))
+          (COND ~B (IOPATH A Y (::0.171) (::0.160)))
+          (COND A (IOPATH B Y (::0.232) (::0.178)))
+          (COND B (IOPATH A Y (::0.157) (::0.135)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8051__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.138) (::0.125)))
+          (COND ~B (IOPATH A Y (::0.159) (::0.143)))
+          (COND A (IOPATH B Y (::0.130) (::0.108)))
+          (COND B (IOPATH A Y (::0.138) (::0.118)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8052__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.145) (::0.128)))
+          (COND ~B (IOPATH A Y (::0.124) (::0.115)))
+          (COND A (IOPATH B Y (::0.149) (::0.142)))
+          (COND B (IOPATH A Y (::0.171) (::0.155)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8053__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.168) (::0.146)))
+          (COND ~B (IOPATH A Y (::0.172) (::0.149)))
+          (COND A (IOPATH B Y (::0.158) (::0.133)))
+          (COND B (IOPATH A Y (::0.151) (::0.122)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8054__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.094) (::0.091)))
+          (IOPATH A0 Y (::0.179) (::0.142))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.130) (::0.092)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.112) (::0.091)))
+          (IOPATH B0 Y (::0.130) (::0.092))
+          (IOPATH A1 Y (::0.163) (::0.144))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8055__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.174)))
+          (COND ~B (IOPATH A Y (::0.204) (::0.179)))
+          (COND A (IOPATH B Y (::0.195) (::0.160)))
+          (COND B (IOPATH A Y (::0.190) (::0.151)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8056__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.226) (::0.172))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.188) (::0.172)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.136) (::0.127)))
+          (IOPATH B0 Y (::0.183) (::0.144))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.180) (::0.141)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.183) (::0.144)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.155) (::0.141)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.142) (::0.142)))
+          (IOPATH A1 Y (::0.176) (::0.127))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.196) (::0.142)))
+          (IOPATH B1 Y (::0.196) (::0.142))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.226) (::0.160)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.211) (::0.159)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.176) (::0.116)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.156) (::0.115)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.162) (::0.143)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8059)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.086) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8060__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.071) (::0.083))
+          (IOPATH B Y (::0.079) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8061__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.072) (::0.082))
+          (IOPATH B Y (::0.079) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8062__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.104) (::0.070))
+          (IOPATH B Y (::0.103) (::0.074))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8063__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.103) (::0.070))
+          (IOPATH B Y (::0.104) (::0.074))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8064__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.110) (::0.084))
+          (IOPATH B Y (::0.097) (::0.070))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8065__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.110) (::0.082))
+          (IOPATH B Y (::0.097) (::0.070))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8066__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.107) (::0.085))
+          (IOPATH B Y (::0.090) (::0.067))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8067__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.133) (::0.116))
+          (IOPATH B Y (::0.161) (::0.194))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8068__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.141) (::0.132))
+          (IOPATH B Y (::0.169) (::0.193))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8069__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.138) (::0.171))
+          (IOPATH B Y (::0.118) (::0.145))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8070__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.095) (::0.072))
+          (IOPATH B Y (::0.080) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8071__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.056) (::0.058))
+          (IOPATH B Y (::0.075) (::0.081))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8072__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.202) (::0.157))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.169) (::0.157)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.122) (::0.114)))
+          (IOPATH B0 Y (::0.253) (::0.161))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.229) (::0.167)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.253) (::0.161)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.207) (::0.166)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.206) (::0.159)))
+          (IOPATH A1 Y (::0.156) (::0.114))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.248) (::0.168)))
+          (IOPATH B1 Y (::0.248) (::0.168))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.202) (::0.145)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.188) (::0.145)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.156) (::0.102)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.138) (::0.102)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.227) (::0.159)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8073__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.089) (::0.078)))
+          (IOPATH A0 Y (::0.192) (::0.150))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.125) (::0.079)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.107) (::0.078)))
+          (IOPATH B0 Y (::0.125) (::0.079))
+          (IOPATH A1 Y (::0.165) (::0.146))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8074__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.161) (::0.175)))
+          (IOPATH A0 Y (::0.171) (::0.174))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.166) (::0.152)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.168) (::0.174)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.126) (::0.148)))
+          (IOPATH B0 Y (::0.126) (::0.148))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.159) (::0.139)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.130) (::0.085)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.159) (::0.152)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.125) (::0.120)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.097)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.126) (::0.122)))
+          (IOPATH A1 Y (::0.130) (::0.122))
+          (IOPATH B1 Y (::0.161) (::0.175))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.171) (::0.138)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.125) (::0.110)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8075__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.282) (::0.198))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.252) (::0.198)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.125) (::0.117)))
+          (IOPATH B0 Y (::0.161) (::0.126))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.246) (::0.173)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.161) (::0.126)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.223) (::0.172)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.125) (::0.124)))
+          (IOPATH A1 Y (::0.159) (::0.117))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.266) (::0.174)))
+          (IOPATH B1 Y (::0.266) (::0.174))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.282) (::0.184)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.266) (::0.183)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.159) (::0.105)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.141) (::0.105)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.142) (::0.125)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8076__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.108) (::0.099)))
+          (IOPATH A0 Y (::0.199) (::0.155))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.150) (::0.101)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.130) (::0.100)))
+          (IOPATH B0 Y (::0.150) (::0.101))
+          (IOPATH A1 Y (::0.184) (::0.159))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8078__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.078) (::0.069)))
+          (IOPATH A0 Y (::0.136) (::0.118))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.079) (::0.092)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.079) (::0.082)))
+          (IOPATH B0 Y (::0.079) (::0.082))
+          (IOPATH A1 Y (::0.150) (::0.130))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8082)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.081) (::0.072))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8083__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.157) (::0.142)))
+          (COND ~B (IOPATH A Y (::0.168) (::0.148)))
+          (COND A (IOPATH B Y (::0.150) (::0.130)))
+          (COND B (IOPATH A Y (::0.144) (::0.130)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8084__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.182) (::0.202)))
+          (COND ~B (IOPATH A Y (::0.199) (::0.227)))
+          (COND A (IOPATH B Y (::0.231) (::0.180)))
+          (COND B (IOPATH A Y (::0.248) (::0.192)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8085__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.140)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.144)))
+          (COND A (IOPATH B Y (::0.148) (::0.128)))
+          (COND B (IOPATH A Y (::0.141) (::0.126)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8086__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.176) (::0.204)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.142)))
+          (COND A (IOPATH B Y (::0.234) (::0.166)))
+          (COND B (IOPATH A Y (::0.138) (::0.126)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8087__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.160) (::0.149)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.147)))
+          (COND A (IOPATH B Y (::0.158) (::0.134)))
+          (COND B (IOPATH A Y (::0.144) (::0.126)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8088__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.148) (::0.126)))
+          (COND ~B (IOPATH A Y (::0.150) (::0.122)))
+          (COND A (IOPATH B Y (::0.148) (::0.145)))
+          (COND B (IOPATH A Y (::0.177) (::0.178)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8089__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.150) (::0.135)))
+          (COND ~B (IOPATH A Y (::0.160) (::0.140)))
+          (COND A (IOPATH B Y (::0.142) (::0.120)))
+          (COND B (IOPATH A Y (::0.135) (::0.118)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8090__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.147) (::0.128)))
+          (COND ~B (IOPATH A Y (::0.118) (::0.108)))
+          (COND A (IOPATH B Y (::0.149) (::0.144)))
+          (COND B (IOPATH A Y (::0.164) (::0.150)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8091__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.154) (::0.137)))
+          (COND ~B (IOPATH A Y (::0.167) (::0.147)))
+          (COND A (IOPATH B Y (::0.144) (::0.126)))
+          (COND B (IOPATH A Y (::0.143) (::0.128)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8092__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.144) (::0.130)))
+          (COND ~B (IOPATH A Y (::0.162) (::0.142)))
+          (COND A (IOPATH B Y (::0.136) (::0.115)))
+          (COND B (IOPATH A Y (::0.137) (::0.122)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8093__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.172) (::0.122))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.137) (::0.122)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.160) (::0.159)))
+          (IOPATH B0 Y (::0.251) (::0.179))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.158) (::0.125)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.251) (::0.179)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.138) (::0.125)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.205) (::0.178)))
+          (IOPATH A1 Y (::0.191) (::0.159))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.173) (::0.126)))
+          (IOPATH B1 Y (::0.173) (::0.126))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.172) (::0.110)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.157) (::0.110)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.191) (::0.147)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.173) (::0.147)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.225) (::0.178)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8094__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.163) (::0.144)))
+          (COND ~B (IOPATH A Y (::0.135) (::0.117)))
+          (COND A (IOPATH B Y (::0.171) (::0.155)))
+          (COND B (IOPATH A Y (::0.179) (::0.161)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8095__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.194) (::0.164)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.168)))
+          (COND A (IOPATH B Y (::0.184) (::0.153)))
+          (COND B (IOPATH A Y (::0.178) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8096__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.194) (::0.167)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.167)))
+          (COND A (IOPATH B Y (::0.187) (::0.153)))
+          (COND B (IOPATH A Y (::0.177) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8097__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.168)))
+          (COND ~B (IOPATH A Y (::0.202) (::0.171)))
+          (COND A (IOPATH B Y (::0.190) (::0.156)))
+          (COND B (IOPATH A Y (::0.182) (::0.144)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8099__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.200) (::0.172)))
+          (COND ~B (IOPATH A Y (::0.209) (::0.180)))
+          (COND A (IOPATH B Y (::0.193) (::0.161)))
+          (COND B (IOPATH A Y (::0.191) (::0.158)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8100__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.195) (::0.170)))
+          (COND ~B (IOPATH A Y (::0.192) (::0.163)))
+          (COND A (IOPATH B Y (::0.190) (::0.157)))
+          (COND B (IOPATH A Y (::0.171) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8101__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.223) (::0.234)))
+          (COND ~B (IOPATH A Y (::0.211) (::0.184)))
+          (COND A (IOPATH B Y (::0.285) (::0.205)))
+          (COND B (IOPATH A Y (::0.196) (::0.158)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8102)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.051) (::0.047))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8104__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.077) (::0.069)))
+          (IOPATH A0 Y (::0.117) (::0.097))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.078) (::0.094)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.077) (::0.079)))
+          (IOPATH B0 Y (::0.078) (::0.079))
+          (IOPATH A1 Y (::0.125) (::0.112))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8105__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.113) (::0.085))
+          (IOPATH B Y (::0.078) (::0.048))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8106__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.138) (::0.171))
+          (IOPATH B Y (::0.117) (::0.146))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8107__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.055) (::0.061))
+          (IOPATH B Y (::0.082) (::0.089))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8108__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.178) (::0.201))
+          (IOPATH B Y (::0.170) (::0.192))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8109__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.109) (::0.085))
+          (IOPATH B Y (::0.096) (::0.068))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8110__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.123) (::0.150))
+          (IOPATH B Y (::0.107) (::0.131))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8111__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.098) (::0.074))
+          (IOPATH B Y (::0.068) (::0.049))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8113__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.072) (::0.081))
+          (IOPATH B Y (::0.080) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8114__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.095) (::0.074)))
+          (IOPATH A0 Y (::0.152) (::0.133))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.096) (::0.099)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.095) (::0.091)))
+          (IOPATH B0 Y (::0.096) (::0.091))
+          (IOPATH A1 Y (::0.185) (::0.154))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8115__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.097) (::0.078)))
+          (IOPATH A0 Y (::0.154) (::0.135))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.098) (::0.103)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.097) (::0.095)))
+          (IOPATH B0 Y (::0.098) (::0.095))
+          (IOPATH A1 Y (::0.172) (::0.149))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8116__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.094) (::0.086)))
+          (IOPATH A0 Y (::0.264) (::0.181))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.129) (::0.087)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.111) (::0.086)))
+          (IOPATH B0 Y (::0.129) (::0.087))
+          (IOPATH A1 Y (::0.250) (::0.184))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8117__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.206) (::0.216)))
+          (COND ~B (IOPATH A Y (::0.205) (::0.178)))
+          (COND A (IOPATH B Y (::0.255) (::0.184)))
+          (COND B (IOPATH A Y (::0.187) (::0.159)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8118__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.196) (::0.170)))
+          (COND ~B (IOPATH A Y (::0.191) (::0.164)))
+          (COND A (IOPATH B Y (::0.189) (::0.159)))
+          (COND B (IOPATH A Y (::0.171) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8119__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.184) (::0.158)))
+          (COND ~B (IOPATH A Y (::0.198) (::0.169)))
+          (COND A (IOPATH B Y (::0.176) (::0.141)))
+          (COND B (IOPATH A Y (::0.177) (::0.145)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8120__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.183) (::0.159)))
+          (COND ~B (IOPATH A Y (::0.200) (::0.169)))
+          (COND A (IOPATH B Y (::0.177) (::0.140)))
+          (COND B (IOPATH A Y (::0.178) (::0.148)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8121__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.105) (::0.092)))
+          (IOPATH A0 Y (::0.206) (::0.160))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.148) (::0.093)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.128) (::0.092)))
+          (IOPATH B0 Y (::0.148) (::0.093))
+          (IOPATH A1 Y (::0.190) (::0.161))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8122__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.193) (::0.164)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.167)))
+          (COND A (IOPATH B Y (::0.184) (::0.152)))
+          (COND B (IOPATH A Y (::0.176) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8123)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.136) (::0.105))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8124__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.054) (::0.054)))
+          (IOPATH A0 Y (::0.100) (::0.074))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.074) (::0.055)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.060) (::0.054)))
+          (IOPATH B0 Y (::0.074) (::0.055))
+          (IOPATH A1 Y (::0.086) (::0.067))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8125__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.116) (::0.112)))
+          (COND ~B (IOPATH A Y (::0.141) (::0.127)))
+          (COND A (IOPATH B Y (::0.111) (::0.090)))
+          (COND B (IOPATH A Y (::0.114) (::0.103)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8126__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.181) (::0.193)))
+          (COND ~B (IOPATH A Y (::0.187) (::0.212)))
+          (COND A (IOPATH B Y (::0.217) (::0.177)))
+          (COND B (IOPATH A Y (::0.226) (::0.167)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8127__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.130) (::0.111)))
+          (COND ~B (IOPATH A Y (::0.119) (::0.104)))
+          (COND A (IOPATH B Y (::0.136) (::0.130)))
+          (COND B (IOPATH A Y (::0.161) (::0.150)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8128__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.161) (::0.152)))
+          (COND ~B (IOPATH A Y (::0.167) (::0.147)))
+          (COND A (IOPATH B Y (::0.161) (::0.136)))
+          (COND B (IOPATH A Y (::0.143) (::0.129)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8129__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.130) (::0.119)))
+          (COND ~B (IOPATH A Y (::0.164) (::0.144)))
+          (COND A (IOPATH B Y (::0.123) (::0.096)))
+          (COND B (IOPATH A Y (::0.140) (::0.126)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8130__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.163) (::0.144)))
+          (COND ~B (IOPATH A Y (::0.179) (::0.153)))
+          (COND A (IOPATH B Y (::0.156) (::0.126)))
+          (COND B (IOPATH A Y (::0.155) (::0.132)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8131__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.194) (::0.167)))
+          (COND ~B (IOPATH A Y (::0.191) (::0.163)))
+          (COND A (IOPATH B Y (::0.186) (::0.157)))
+          (COND B (IOPATH A Y (::0.171) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8132__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.194) (::0.165)))
+          (COND ~B (IOPATH A Y (::0.198) (::0.167)))
+          (COND A (IOPATH B Y (::0.186) (::0.152)))
+          (COND B (IOPATH A Y (::0.177) (::0.141)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8133__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.191) (::0.164)))
+          (COND ~B (IOPATH A Y (::0.193) (::0.164)))
+          (COND A (IOPATH B Y (::0.184) (::0.151)))
+          (COND B (IOPATH A Y (::0.172) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8134__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.197) (::0.169)))
+          (COND ~B (IOPATH A Y (::0.230) (::0.242)))
+          (COND A (IOPATH B Y (::0.190) (::0.156)))
+          (COND B (IOPATH A Y (::0.282) (::0.208)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8135__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.180) (::0.156)))
+          (COND ~B (IOPATH A Y (::0.214) (::0.229)))
+          (COND A (IOPATH B Y (::0.171) (::0.150)))
+          (COND B (IOPATH A Y (::0.257) (::0.204)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8136__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.189) (::0.162)))
+          (COND ~B (IOPATH A Y (::0.204) (::0.171)))
+          (COND A (IOPATH B Y (::0.182) (::0.144)))
+          (COND B (IOPATH A Y (::0.181) (::0.150)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8137__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.181) (::0.157)))
+          (COND ~B (IOPATH A Y (::0.198) (::0.166)))
+          (COND A (IOPATH B Y (::0.174) (::0.139)))
+          (COND B (IOPATH A Y (::0.174) (::0.147)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8138__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.176)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.167)))
+          (COND A (IOPATH B Y (::0.198) (::0.159)))
+          (COND B (IOPATH A Y (::0.176) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8139__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.193) (::0.164)))
+          (COND ~B (IOPATH A Y (::0.196) (::0.166)))
+          (COND A (IOPATH B Y (::0.184) (::0.151)))
+          (COND B (IOPATH A Y (::0.175) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8140__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.243) (::0.387)))
+          (COND ~B (IOPATH A Y (::0.181) (::0.160)))
+          (COND A (IOPATH B Y (::0.535) (::0.339)))
+          (COND B (IOPATH A Y (::0.163) (::0.133)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8141__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.187) (::0.161)))
+          (COND ~B (IOPATH A Y (::0.202) (::0.170)))
+          (COND A (IOPATH B Y (::0.181) (::0.143)))
+          (COND B (IOPATH A Y (::0.179) (::0.148)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8142__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.169)))
+          (COND ~B (IOPATH A Y (::0.201) (::0.171)))
+          (COND A (IOPATH B Y (::0.190) (::0.156)))
+          (COND B (IOPATH A Y (::0.182) (::0.144)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8143)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.051) (::0.046))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8144)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.085) (::0.079))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8145)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.083) (::0.077))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8146__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.157) (::0.208))
+          (IOPATH B Y (::0.126) (::0.201))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8147__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.093) (::0.070))
+          (IOPATH B Y (::0.088) (::0.066))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8148__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.100) (::0.082))
+          (IOPATH B Y (::0.074) (::0.056))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8149__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.077) (::0.069)))
+          (IOPATH A0 Y (::0.108) (::0.094))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.078) (::0.094)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.078) (::0.079)))
+          (IOPATH B0 Y (::0.078) (::0.079))
+          (IOPATH A1 Y (::0.127) (::0.111))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8150__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.056) (::0.058))
+          (IOPATH B Y (::0.074) (::0.079))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8151__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.058) (::0.068))
+          (IOPATH B Y (::0.058) (::0.056))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8152__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.263) (::0.208))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.233) (::0.208)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.124) (::0.116)))
+          (IOPATH B0 Y (::0.164) (::0.128))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.211) (::0.146)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.164) (::0.128)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.189) (::0.145)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.128) (::0.126)))
+          (IOPATH A1 Y (::0.158) (::0.116))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.228) (::0.147)))
+          (IOPATH B1 Y (::0.228) (::0.147))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.263) (::0.193)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.248) (::0.192)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.158) (::0.104)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.140) (::0.104)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.145) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8153__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.170) (::0.184)))
+          (IOPATH A0 Y (::0.181) (::0.179))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.176) (::0.156)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.177) (::0.179)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.124) (::0.120)))
+          (IOPATH B0 Y (::0.124) (::0.120))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.168) (::0.146)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.135) (::0.088)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.168) (::0.160)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.122) (::0.095)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.130) (::0.100)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.131) (::0.126)))
+          (IOPATH A1 Y (::0.135) (::0.126))
+          (IOPATH B1 Y (::0.170) (::0.184))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.181) (::0.142)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.122) (::0.085)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8154__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.099) (::0.080)))
+          (IOPATH A0 Y (::0.156) (::0.136))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.100) (::0.105)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.100) (::0.097)))
+          (IOPATH B0 Y (::0.100) (::0.097))
+          (IOPATH A1 Y (::0.177) (::0.151))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8155__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.160) (::0.179)))
+          (IOPATH A0 Y (::0.142) (::0.138))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.136) (::0.115)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.138) (::0.138)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.120) (::0.117)))
+          (IOPATH B0 Y (::0.120) (::0.117))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.158) (::0.142)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.162) (::0.127)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.158) (::0.155)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.118) (::0.092)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.157) (::0.134)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.158) (::0.158)))
+          (IOPATH A1 Y (::0.162) (::0.158))
+          (IOPATH B1 Y (::0.160) (::0.179))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.142) (::0.095)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.118) (::0.083)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8156__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.101) (::0.080)))
+          (IOPATH A0 Y (::0.158) (::0.137))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.102) (::0.105)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.101) (::0.097)))
+          (IOPATH B0 Y (::0.102) (::0.097))
+          (IOPATH A1 Y (::0.180) (::0.152))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8157__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.097) (::0.075)))
+          (IOPATH A0 Y (::0.151) (::0.132))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.098) (::0.100)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.097) (::0.091)))
+          (IOPATH B0 Y (::0.098) (::0.091))
+          (IOPATH A1 Y (::0.169) (::0.145))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8158__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.207) (::0.159))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.173) (::0.159)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.126) (::0.118)))
+          (IOPATH B0 Y (::0.164) (::0.128))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.172) (::0.134)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.164) (::0.128)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.151) (::0.133)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.127) (::0.126)))
+          (IOPATH A1 Y (::0.161) (::0.118))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.187) (::0.134)))
+          (IOPATH B1 Y (::0.187) (::0.134))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.207) (::0.148)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.192) (::0.147)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.161) (::0.107)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.143) (::0.106)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.144) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8159__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.082) (::0.073)))
+          (IOPATH A0 Y (::0.171) (::0.138))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.116) (::0.074)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.099) (::0.073)))
+          (IOPATH B0 Y (::0.116) (::0.074))
+          (IOPATH A1 Y (::0.156) (::0.141))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8160__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.124) (::0.082))
+          (IOPATH B Y (::0.112) (::0.071))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8161__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.182) (::0.203)))
+          (IOPATH A0 Y (::0.197) (::0.192))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.191) (::0.170)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.193) (::0.192)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.164) (::0.170)))
+          (IOPATH B0 Y (::0.164) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.164)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.150) (::0.097)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.179)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.162) (::0.141)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.145) (::0.112)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.146) (::0.139)))
+          (IOPATH A1 Y (::0.150) (::0.139))
+          (IOPATH B1 Y (::0.182) (::0.203))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.197) (::0.153)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.162) (::0.130)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8162__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.071) (::0.073)))
+          (IOPATH A0 Y (::0.145) (::0.119))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.098) (::0.074)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.073)))
+          (IOPATH B0 Y (::0.098) (::0.074))
+          (IOPATH A1 Y (::0.132) (::0.122))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8163__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.187) (::0.208)))
+          (IOPATH A0 Y (::0.192) (::0.189))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.187) (::0.166)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.189) (::0.189)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.161) (::0.155)))
+          (IOPATH B0 Y (::0.161) (::0.155))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.186) (::0.168)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.154) (::0.099)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.186) (::0.183)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.159) (::0.127)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.149) (::0.115)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.150) (::0.142)))
+          (IOPATH A1 Y (::0.154) (::0.142))
+          (IOPATH B1 Y (::0.187) (::0.208))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.192) (::0.148)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.159) (::0.115)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8164__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.134) (::0.132)))
+          (IOPATH A0 Y (::0.209) (::0.160))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.178) (::0.133)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.157) (::0.132)))
+          (IOPATH B0 Y (::0.178) (::0.133))
+          (IOPATH A1 Y (::0.317) (::0.250))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8165__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.210) (::0.149))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.169) (::0.149)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.185) (::0.183)))
+          (IOPATH B0 Y (::0.544) (::0.321))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.188) (::0.143)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.544) (::0.321)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.162) (::0.143)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.455) (::0.320)))
+          (IOPATH A1 Y (::0.223) (::0.183))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.204) (::0.144)))
+          (IOPATH B1 Y (::0.204) (::0.144))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.210) (::0.138)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.194) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.223) (::0.171)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.203) (::0.171)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.496) (::0.318)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8166__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.119) (::0.094)))
+          (IOPATH A0 Y (::0.179) (::0.157))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.120) (::0.122)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.119) (::0.116)))
+          (IOPATH B0 Y (::0.120) (::0.116))
+          (IOPATH A1 Y (::0.199) (::0.168))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8167__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.073) (::0.072)))
+          (IOPATH A0 Y (::0.146) (::0.120))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.099) (::0.073)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.084) (::0.072)))
+          (IOPATH B0 Y (::0.099) (::0.073))
+          (IOPATH A1 Y (::0.135) (::0.122))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8168__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.185) (::0.207)))
+          (IOPATH A0 Y (::0.200) (::0.196))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.195) (::0.173)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.196) (::0.196)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.516) (::0.419)))
+          (IOPATH B0 Y (::0.516) (::0.419))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.183) (::0.167)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.166) (::0.114)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.182)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.513) (::0.326)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.161) (::0.127)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.162) (::0.154)))
+          (IOPATH A1 Y (::0.166) (::0.154))
+          (IOPATH B1 Y (::0.185) (::0.207))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.200) (::0.156)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.516) (::0.299)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8169__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.217) (::0.166))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.179) (::0.166)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.149) (::0.140)))
+          (IOPATH B0 Y (::0.541) (::0.310))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.180) (::0.142)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.541) (::0.310)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.155) (::0.141)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.451) (::0.309)))
+          (IOPATH A1 Y (::0.188) (::0.140))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.195) (::0.142)))
+          (IOPATH B1 Y (::0.195) (::0.142))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.217) (::0.154)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.202) (::0.154)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.188) (::0.129)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.168) (::0.128)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.492) (::0.306)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8170__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.150) (::0.132)))
+          (COND ~B (IOPATH A Y (::0.121) (::0.110)))
+          (COND A (IOPATH B Y (::0.153) (::0.146)))
+          (COND B (IOPATH A Y (::0.167) (::0.152)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8171__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.157) (::0.143)))
+          (COND ~B (IOPATH A Y (::0.167) (::0.149)))
+          (COND A (IOPATH B Y (::0.151) (::0.131)))
+          (COND B (IOPATH A Y (::0.145) (::0.128)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8172__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.140)))
+          (COND ~B (IOPATH A Y (::0.171) (::0.157)))
+          (COND A (IOPATH B Y (::0.148) (::0.128)))
+          (COND B (IOPATH A Y (::0.154) (::0.134)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8173__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.143)))
+          (COND ~B (IOPATH A Y (::0.162) (::0.130)))
+          (COND A (IOPATH B Y (::0.151) (::0.128)))
+          (COND B (IOPATH A Y (::0.126) (::0.120)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8174__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.148) (::0.131)))
+          (COND ~B (IOPATH A Y (::0.208) (::0.161)))
+          (COND A (IOPATH B Y (::0.151) (::0.145)))
+          (COND B (IOPATH A Y (::0.202) (::0.221)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8176__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.192) (::0.150))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.159) (::0.150)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.123) (::0.115)))
+          (IOPATH B0 Y (::0.163) (::0.127))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.156) (::0.123)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.163) (::0.127)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.136) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.127) (::0.125)))
+          (IOPATH A1 Y (::0.156) (::0.115))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.171) (::0.124)))
+          (IOPATH B1 Y (::0.171) (::0.124))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.192) (::0.138)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.178) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.156) (::0.104)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.139) (::0.103)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.144) (::0.126)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8177__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.178) (::0.155)))
+          (COND ~B (IOPATH A Y (::0.174) (::0.150)))
+          (COND A (IOPATH B Y (::0.170) (::0.144)))
+          (COND B (IOPATH A Y (::0.154) (::0.122)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8178__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.169) (::0.119))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.134) (::0.119)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.148) (::0.152)))
+          (IOPATH B0 Y (::0.160) (::0.125))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.157) (::0.125)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.160) (::0.125)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.137) (::0.124)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.124) (::0.123)))
+          (IOPATH A1 Y (::0.180) (::0.152))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.172) (::0.125)))
+          (IOPATH B1 Y (::0.172) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.169) (::0.108)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.154) (::0.107)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.180) (::0.140)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.163) (::0.140)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.141) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8179__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.179) (::0.156)))
+          (COND ~B (IOPATH A Y (::0.174) (::0.150)))
+          (COND A (IOPATH B Y (::0.169) (::0.149)))
+          (COND B (IOPATH A Y (::0.151) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8180__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.177) (::0.156)))
+          (COND ~B (IOPATH A Y (::0.253) (::0.392)))
+          (COND A (IOPATH B Y (::0.169) (::0.145)))
+          (COND B (IOPATH A Y (::0.512) (::0.324)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8181__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.088) (::0.088)))
+          (IOPATH A0 Y (::0.170) (::0.136))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.122) (::0.089)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.104) (::0.088)))
+          (IOPATH B0 Y (::0.122) (::0.089))
+          (IOPATH A1 Y (::0.158) (::0.139))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8182__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.201) (::0.175)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.166)))
+          (COND A (IOPATH B Y (::0.196) (::0.163)))
+          (COND B (IOPATH A Y (::0.176) (::0.141)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8183__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.234) (::0.539)))
+          (COND ~B (IOPATH A Y (::0.212) (::0.182)))
+          (COND A (IOPATH B Y (::0.815) (::0.402)))
+          (COND B (IOPATH A Y (::0.193) (::0.164)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8184__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.194) (::0.170)))
+          (COND ~B (IOPATH A Y (::0.275) (::0.410)))
+          (COND A (IOPATH B Y (::0.189) (::0.155)))
+          (COND B (IOPATH A Y (::0.566) (::0.376)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8185__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.196) (::0.169)))
+          (COND ~B (IOPATH A Y (::0.192) (::0.165)))
+          (COND A (IOPATH B Y (::0.189) (::0.158)))
+          (COND B (IOPATH A Y (::0.173) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8186__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.263) (::0.408)))
+          (COND ~B (IOPATH A Y (::0.193) (::0.166)))
+          (COND A (IOPATH B Y (::0.586) (::0.382)))
+          (COND B (IOPATH A Y (::0.174) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8187__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.177) (::0.157)))
+          (COND ~B (IOPATH A Y (::0.185) (::0.161)))
+          (COND A (IOPATH B Y (::0.174) (::0.137)))
+          (COND B (IOPATH A Y (::0.166) (::0.131)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8188__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.208) (::0.183)))
+          (COND ~B (IOPATH A Y (::0.204) (::0.170)))
+          (COND A (IOPATH B Y (::0.206) (::0.168)))
+          (COND B (IOPATH A Y (::0.181) (::0.146)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8189__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.190) (::0.163)))
+          (COND ~B (IOPATH A Y (::0.159) (::0.134)))
+          (COND A (IOPATH B Y (::0.193) (::0.176)))
+          (COND B (IOPATH A Y (::0.200) (::0.179)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8190__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.202) (::0.169)))
+          (COND ~B (IOPATH A Y (::0.200) (::0.169)))
+          (COND A (IOPATH B Y (::0.190) (::0.162)))
+          (COND B (IOPATH A Y (::0.179) (::0.143)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8191__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.182) (::0.155)))
+          (COND ~B (IOPATH A Y (::0.207) (::0.176)))
+          (COND A (IOPATH B Y (::0.173) (::0.139)))
+          (COND B (IOPATH A Y (::0.184) (::0.159)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8192__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.188) (::0.162)))
+          (COND ~B (IOPATH A Y (::0.210) (::0.178)))
+          (COND A (IOPATH B Y (::0.182) (::0.144)))
+          (COND B (IOPATH A Y (::0.188) (::0.160)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8193__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.182) (::0.199)))
+          (IOPATH A0 Y (::0.192) (::0.192))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.187) (::0.169)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.189) (::0.192)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.166) (::0.173)))
+          (IOPATH B0 Y (::0.166) (::0.173))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.160)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.148) (::0.094)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.174)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.164) (::0.143)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.143) (::0.109)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.144) (::0.136)))
+          (IOPATH A1 Y (::0.148) (::0.136))
+          (IOPATH B1 Y (::0.182) (::0.199))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.192) (::0.153)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.164) (::0.132)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8194)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.051) (::0.046))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8196)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.084) (::0.078))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8197__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.108) (::0.080))
+          (IOPATH B Y (::0.080) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8198__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.171) (::0.106))
+          (IOPATH B Y (::0.151) (::0.080))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8199__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.133) (::0.163))
+          (IOPATH B Y (::0.149) (::0.220))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8200__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.094) (::0.062))
+          (IOPATH B Y (::0.096) (::0.067))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8201__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.078) (::0.069)))
+          (IOPATH A0 Y (::0.105) (::0.093))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.079) (::0.095)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.078) (::0.080)))
+          (IOPATH B0 Y (::0.079) (::0.080))
+          (IOPATH A1 Y (::0.124) (::0.112))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8202__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.094) (::0.062))
+          (IOPATH B Y (::0.095) (::0.067))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8203__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.109) (::0.080))
+          (IOPATH B Y (::0.179) (::0.097))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8204__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.068) (::0.073))
+          (IOPATH B Y (::0.057) (::0.055))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8205__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.068) (::0.079))
+          (IOPATH B Y (::0.062) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8206__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.129) (::0.101))
+          (IOPATH B Y (::0.134) (::0.125))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8207__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.068) (::0.078))
+          (IOPATH B Y (::0.062) (::0.061))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8208__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.088) (::0.096))
+          (IOPATH B Y (::0.085) (::0.090))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8209__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.070) (::0.078))
+          (IOPATH B Y (::0.063) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8210__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.075) (::0.074)))
+          (IOPATH A0 Y (::0.126) (::0.105))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.099) (::0.076)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.083) (::0.075)))
+          (IOPATH B0 Y (::0.099) (::0.076))
+          (IOPATH A1 Y (::0.115) (::0.106))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8211__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.151) (::0.137)))
+          (COND ~B (IOPATH A Y (::0.163) (::0.142)))
+          (COND A (IOPATH B Y (::0.143) (::0.124)))
+          (COND B (IOPATH A Y (::0.137) (::0.125)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8212__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.139) (::0.167)))
+          (IOPATH A0 Y (::0.208) (::0.193))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.202) (::0.168)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.204) (::0.193)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.131) (::0.143)))
+          (IOPATH B0 Y (::0.131) (::0.143))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.138) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.111) (::0.074)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.138) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.129) (::0.114)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.105) (::0.083)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.107) (::0.106)))
+          (IOPATH A1 Y (::0.111) (::0.106))
+          (IOPATH B1 Y (::0.139) (::0.167))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.208) (::0.160)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.129) (::0.106)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8213__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.151) (::0.141)))
+          (COND ~B (IOPATH A Y (::0.227) (::0.356)))
+          (COND A (IOPATH B Y (::0.148) (::0.125)))
+          (COND B (IOPATH A Y (::0.429) (::0.264)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8214__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.140)))
+          (COND ~B (IOPATH A Y (::0.167) (::0.147)))
+          (COND A (IOPATH B Y (::0.148) (::0.128)))
+          (COND B (IOPATH A Y (::0.143) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8215__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.103) (::0.082)))
+          (IOPATH A0 Y (::0.152) (::0.134))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.104) (::0.107)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.103) (::0.099)))
+          (IOPATH B0 Y (::0.104) (::0.099))
+          (IOPATH A1 Y (::0.150) (::0.124))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8216__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.165) (::0.188)))
+          (IOPATH A0 Y (::0.182) (::0.178))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.177) (::0.156)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.178) (::0.178)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.123) (::0.121)))
+          (IOPATH B0 Y (::0.123) (::0.121))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.163) (::0.150)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.128) (::0.082)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.163) (::0.163)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.121) (::0.096)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.122) (::0.094)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.124) (::0.119)))
+          (IOPATH A1 Y (::0.128) (::0.119))
+          (IOPATH B1 Y (::0.165) (::0.188))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.182) (::0.143)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.121) (::0.087)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8217__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.086) (::0.072)))
+          (IOPATH A0 Y (::0.152) (::0.139))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.087) (::0.096)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.086) (::0.088)))
+          (IOPATH B0 Y (::0.087) (::0.088))
+          (IOPATH A1 Y (::0.173) (::0.146))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8218__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.093) (::0.074)))
+          (IOPATH A0 Y (::0.149) (::0.130))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.094) (::0.098)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.093) (::0.090)))
+          (IOPATH B0 Y (::0.094) (::0.090))
+          (IOPATH A1 Y (::0.168) (::0.151))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8220__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.125) (::0.102)))
+          (IOPATH A0 Y (::0.537) (::0.336))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.126) (::0.130)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.126) (::0.123)))
+          (IOPATH B0 Y (::0.126) (::0.123))
+          (IOPATH A1 Y (::0.199) (::0.174))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8221__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.071) (::0.073)))
+          (IOPATH A0 Y (::0.154) (::0.127))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.097) (::0.074)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.074)))
+          (IOPATH B0 Y (::0.097) (::0.074))
+          (IOPATH A1 Y (::0.144) (::0.129))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8222__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.123) (::0.114)))
+          (COND ~B (IOPATH A Y (::0.128) (::0.116)))
+          (COND A (IOPATH B Y (::0.114) (::0.099)))
+          (COND B (IOPATH A Y (::0.103) (::0.085)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8223__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.154) (::0.136)))
+          (COND ~B (IOPATH A Y (::0.168) (::0.148)))
+          (COND A (IOPATH B Y (::0.143) (::0.127)))
+          (COND B (IOPATH A Y (::0.144) (::0.130)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8224__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.140)))
+          (COND ~B (IOPATH A Y (::0.167) (::0.147)))
+          (COND A (IOPATH B Y (::0.148) (::0.128)))
+          (COND B (IOPATH A Y (::0.143) (::0.128)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8225__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.147) (::0.129)))
+          (COND ~B (IOPATH A Y (::0.129) (::0.116)))
+          (COND A (IOPATH B Y (::0.150) (::0.144)))
+          (COND B (IOPATH A Y (::0.172) (::0.160)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8226__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.151) (::0.137)))
+          (COND ~B (IOPATH A Y (::0.164) (::0.148)))
+          (COND A (IOPATH B Y (::0.143) (::0.124)))
+          (COND B (IOPATH A Y (::0.144) (::0.126)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8227__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.151) (::0.135)))
+          (COND ~B (IOPATH A Y (::0.129) (::0.118)))
+          (COND A (IOPATH B Y (::0.156) (::0.147)))
+          (COND B (IOPATH A Y (::0.175) (::0.159)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8228__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.146) (::0.128)))
+          (COND ~B (IOPATH A Y (::0.230) (::0.165)))
+          (COND A (IOPATH B Y (::0.149) (::0.144)))
+          (COND B (IOPATH A Y (::0.205) (::0.237)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8229__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.184) (::0.203)))
+          (COND ~B (IOPATH A Y (::0.167) (::0.148)))
+          (COND A (IOPATH B Y (::0.232) (::0.184)))
+          (COND B (IOPATH A Y (::0.144) (::0.128)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8230__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.171) (::0.200)))
+          (COND ~B (IOPATH A Y (::0.163) (::0.139)))
+          (COND A (IOPATH B Y (::0.227) (::0.162)))
+          (COND B (IOPATH A Y (::0.134) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8231__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.151) (::0.138)))
+          (COND ~B (IOPATH A Y (::0.139) (::0.122)))
+          (COND A (IOPATH B Y (::0.145) (::0.124)))
+          (COND B (IOPATH A Y (::0.116) (::0.089)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8232__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.141)))
+          (COND ~B (IOPATH A Y (::0.168) (::0.150)))
+          (COND A (IOPATH B Y (::0.148) (::0.128)))
+          (COND B (IOPATH A Y (::0.146) (::0.129)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8233__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.170) (::0.176)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.134)))
+          (COND A (IOPATH B Y (::0.192) (::0.154)))
+          (COND B (IOPATH A Y (::0.129) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8234__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.177) (::0.186)))
+          (COND ~B (IOPATH A Y (::0.169) (::0.151)))
+          (COND A (IOPATH B Y (::0.208) (::0.169)))
+          (COND B (IOPATH A Y (::0.148) (::0.130)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8235__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.150) (::0.132)))
+          (COND ~B (IOPATH A Y (::0.128) (::0.118)))
+          (COND A (IOPATH B Y (::0.153) (::0.146)))
+          (COND B (IOPATH A Y (::0.175) (::0.158)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8236__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.150) (::0.136)))
+          (COND ~B (IOPATH A Y (::0.167) (::0.146)))
+          (COND A (IOPATH B Y (::0.143) (::0.121)))
+          (COND B (IOPATH A Y (::0.143) (::0.128)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8237__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.150) (::0.131)))
+          (COND ~B (IOPATH A Y (::0.131) (::0.118)))
+          (COND A (IOPATH B Y (::0.153) (::0.146)))
+          (COND B (IOPATH A Y (::0.175) (::0.160)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8238__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.147) (::0.130)))
+          (COND ~B (IOPATH A Y (::0.126) (::0.114)))
+          (COND A (IOPATH B Y (::0.150) (::0.144)))
+          (COND B (IOPATH A Y (::0.170) (::0.156)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8239__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.151) (::0.137)))
+          (COND ~B (IOPATH A Y (::0.162) (::0.142)))
+          (COND A (IOPATH B Y (::0.143) (::0.124)))
+          (COND B (IOPATH A Y (::0.137) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8240__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.130) (::0.118)))
+          (COND ~B (IOPATH A Y (::0.164) (::0.146)))
+          (COND A (IOPATH B Y (::0.122) (::0.096)))
+          (COND B (IOPATH A Y (::0.142) (::0.126)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8241__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.140)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.146)))
+          (COND A (IOPATH B Y (::0.147) (::0.128)))
+          (COND B (IOPATH A Y (::0.143) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8242__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.152) (::0.140)))
+          (COND ~B (IOPATH A Y (::0.162) (::0.143)))
+          (COND A (IOPATH B Y (::0.146) (::0.127)))
+          (COND B (IOPATH A Y (::0.138) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8243__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.171)))
+          (COND ~B (IOPATH A Y (::0.203) (::0.172)))
+          (COND A (IOPATH B Y (::0.193) (::0.155)))
+          (COND B (IOPATH A Y (::0.184) (::0.145)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8244__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.197) (::0.166)))
+          (COND ~B (IOPATH A Y (::0.202) (::0.170)))
+          (COND A (IOPATH B Y (::0.187) (::0.153)))
+          (COND B (IOPATH A Y (::0.181) (::0.144)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8245__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.167)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.166)))
+          (COND A (IOPATH B Y (::0.188) (::0.159)))
+          (COND B (IOPATH A Y (::0.175) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8246__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.192) (::0.193)))
+          (COND ~B (IOPATH A Y (::0.173) (::0.150)))
+          (COND A (IOPATH B Y (::0.218) (::0.176)))
+          (COND B (IOPATH A Y (::0.152) (::0.122)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8247)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.133) (::0.108))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8248__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.230) (::0.344))
+          (IOPATH B Y (::0.142) (::0.125))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8249__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.123) (::0.150))
+          (IOPATH B Y (::0.139) (::0.375))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8250__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.090) (::0.065))
+          (IOPATH B Y (::0.090) (::0.065))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8251__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.175) (::0.236))
+          (IOPATH B Y (::0.118) (::0.147))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8252__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.132) (::0.162))
+          (IOPATH B Y (::0.119) (::0.149))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8253__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.140) (::0.173))
+          (IOPATH B Y (::0.118) (::0.146))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8254__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.134) (::0.117))
+          (IOPATH B Y (::0.141) (::0.125))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8255__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.097) (::0.069))
+          (IOPATH B Y (::0.103) (::0.072))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8256__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.110) (::0.084))
+          (IOPATH B Y (::0.098) (::0.070))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8257__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.093) (::0.085))
+          (IOPATH B Y (::0.124) (::0.112))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8258__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.108) (::0.082))
+          (IOPATH B Y (::0.177) (::0.090))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8259__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.119) (::0.089))
+          (IOPATH B Y (::0.108) (::0.078))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8260__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.075) (::0.084))
+          (IOPATH B Y (::0.081) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8261__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.071) (::0.083))
+          (IOPATH B Y (::0.080) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8262__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.131) (::0.164))
+          (IOPATH B Y (::0.163) (::0.404))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8263__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.120) (::0.110))
+          (IOPATH B Y (::0.142) (::0.126))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8264__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.115) (::0.088))
+          (IOPATH B Y (::0.105) (::0.076))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8265__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.072) (::0.082))
+          (IOPATH B Y (::0.081) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8266__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.152) (::0.208))
+          (IOPATH B Y (::0.120) (::0.150))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8267__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.078) (::0.091))
+          (IOPATH B Y (::0.084) (::0.090))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8268__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.106) (::0.082))
+          (IOPATH B Y (::0.093) (::0.068))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8269__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.071) (::0.082))
+          (IOPATH B Y (::0.079) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8270__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.132) (::0.162))
+          (IOPATH B Y (::0.117) (::0.145))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8271__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.107) (::0.082))
+          (IOPATH B Y (::0.095) (::0.069))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8272__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.122) (::0.108))
+          (IOPATH B Y (::0.125) (::0.114))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8273__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.104) (::0.094))
+          (IOPATH B Y (::0.137) (::0.129))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8274__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.103) (::0.096))
+          (IOPATH B Y (::0.083) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8275__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.100) (::0.080)))
+          (IOPATH A0 Y (::0.163) (::0.145))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.101) (::0.106)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.100) (::0.098)))
+          (IOPATH B0 Y (::0.101) (::0.098))
+          (IOPATH A1 Y (::0.182) (::0.134))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8276__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.156) (::0.099))
+          (IOPATH B Y (::0.144) (::0.085))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8277__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.195) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.162) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.135) (::0.126)))
+          (IOPATH B0 Y (::0.147) (::0.108))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.494) (::0.258)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.147) (::0.108)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.452) (::0.260)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.112) (::0.106)))
+          (IOPATH A1 Y (::0.168) (::0.126))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.531) (::0.262)))
+          (IOPATH B1 Y (::0.531) (::0.262))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.195) (::0.141)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.181) (::0.140)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.168) (::0.115)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.150) (::0.114)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.128) (::0.107)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8278)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.056) (::0.048))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8279__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.095) (::0.064))
+          (IOPATH B Y (::0.097) (::0.066))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8280__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.058) (::0.058))
+          (IOPATH B Y (::0.075) (::0.080))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8282__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.068) (::0.071)))
+          (IOPATH A0 Y (::0.120) (::0.106))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.090) (::0.072)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.075) (::0.071)))
+          (IOPATH B0 Y (::0.090) (::0.072))
+          (IOPATH A1 Y (::0.109) (::0.100))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8283__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.150) (::0.133)))
+          (COND ~B (IOPATH A Y (::0.172) (::0.149)))
+          (COND A (IOPATH B Y (::0.139) (::0.121)))
+          (COND B (IOPATH A Y (::0.146) (::0.135)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8284__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.124) (::0.135))
+          (IOPATH A1 Y (::0.126) (::0.137))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.090) (::0.082)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.101) (::0.107)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8285__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.150) (::0.140)))
+          (COND ~B (IOPATH A Y (::0.167) (::0.152)))
+          (COND A (IOPATH B Y (::0.147) (::0.124)))
+          (COND B (IOPATH A Y (::0.148) (::0.131)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8286__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.124) (::0.144))
+          (IOPATH A1 Y (::0.117) (::0.127))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.090) (::0.088)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.110) (::0.107)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8287__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.149) (::0.133)))
+          (COND ~B (IOPATH A Y (::0.168) (::0.146)))
+          (COND A (IOPATH B Y (::0.140) (::0.120)))
+          (COND B (IOPATH A Y (::0.142) (::0.130)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8288__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.125) (::0.138))
+          (IOPATH A1 Y (::0.123) (::0.132))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.096) (::0.094)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.116) (::0.114)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8289__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.140)))
+          (COND ~B (IOPATH A Y (::0.171) (::0.147)))
+          (COND A (IOPATH B Y (::0.147) (::0.128)))
+          (COND B (IOPATH A Y (::0.144) (::0.135)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8290__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.149) (::0.133)))
+          (COND ~B (IOPATH A Y (::0.171) (::0.147)))
+          (COND A (IOPATH B Y (::0.140) (::0.120)))
+          (COND B (IOPATH A Y (::0.143) (::0.135)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8292__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.151) (::0.136)))
+          (COND ~B (IOPATH A Y (::0.144) (::0.122)))
+          (COND A (IOPATH B Y (::0.157) (::0.147)))
+          (COND B (IOPATH A Y (::0.178) (::0.172)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8293__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.152) (::0.140)))
+          (COND ~B (IOPATH A Y (::0.133) (::0.119)))
+          (COND A (IOPATH B Y (::0.160) (::0.148)))
+          (COND B (IOPATH A Y (::0.175) (::0.162)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8294__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.140)))
+          (COND ~B (IOPATH A Y (::0.171) (::0.147)))
+          (COND A (IOPATH B Y (::0.147) (::0.127)))
+          (COND B (IOPATH A Y (::0.144) (::0.134)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8295__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.156) (::0.141)))
+          (COND ~B (IOPATH A Y (::0.144) (::0.122)))
+          (COND A (IOPATH B Y (::0.160) (::0.151)))
+          (COND B (IOPATH A Y (::0.178) (::0.172)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8296__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.146) (::0.131)))
+          (COND ~B (IOPATH A Y (::0.151) (::0.149)))
+          (COND A (IOPATH B Y (::0.137) (::0.118)))
+          (COND B (IOPATH A Y (::0.145) (::0.107)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8297__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.087) (::0.073)))
+          (IOPATH A0 Y (::0.152) (::0.134))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.088) (::0.098)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.088) (::0.090)))
+          (IOPATH B0 Y (::0.088) (::0.090))
+          (IOPATH A1 Y (::0.175) (::0.155))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8298__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.147) (::0.150)))
+          (IOPATH A0 Y (::0.231) (::0.208))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.225) (::0.184)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.227) (::0.208)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.157) (::0.157)))
+          (IOPATH B0 Y (::0.157) (::0.157))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.146) (::0.114)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.162) (::0.127)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.146) (::0.128)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.155) (::0.128)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.157) (::0.135)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.158) (::0.160)))
+          (IOPATH A1 Y (::0.162) (::0.160))
+          (IOPATH B1 Y (::0.147) (::0.150))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.231) (::0.173)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.155) (::0.118)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8299__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.087) (::0.073)))
+          (IOPATH A0 Y (::0.158) (::0.142))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.088) (::0.098)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.088) (::0.089)))
+          (IOPATH B0 Y (::0.088) (::0.089))
+          (IOPATH A1 Y (::0.172) (::0.149))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8300__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.139) (::0.129)))
+          (IOPATH A0 Y (::0.733) (::0.319))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.175) (::0.130)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.156) (::0.130)))
+          (IOPATH B0 Y (::0.175) (::0.130))
+          (IOPATH A1 Y (::0.168) (::0.146))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8301__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.170) (::0.148)))
+          (COND ~B (IOPATH A Y (::0.173) (::0.150)))
+          (COND A (IOPATH B Y (::0.160) (::0.135)))
+          (COND B (IOPATH A Y (::0.152) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8302__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.201) (::0.171)))
+          (COND ~B (IOPATH A Y (::0.285) (::0.418)))
+          (COND A (IOPATH B Y (::0.193) (::0.159)))
+          (COND B (IOPATH A Y (::0.590) (::0.398)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8303__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.191) (::0.163)))
+          (COND ~B (IOPATH A Y (::0.194) (::0.165)))
+          (COND A (IOPATH B Y (::0.182) (::0.151)))
+          (COND B (IOPATH A Y (::0.173) (::0.139)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8304__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.221) (::0.220)))
+          (COND ~B (IOPATH A Y (::0.207) (::0.172)))
+          (COND A (IOPATH B Y (::0.261) (::0.212)))
+          (COND B (IOPATH A Y (::0.181) (::0.157)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8305__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.193) (::0.168)))
+          (COND ~B (IOPATH A Y (::0.167) (::0.142)))
+          (COND A (IOPATH B Y (::0.201) (::0.177)))
+          (COND B (IOPATH A Y (::0.210) (::0.185)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8306__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.201) (::0.171)))
+          (COND ~B (IOPATH A Y (::0.284) (::0.406)))
+          (COND A (IOPATH B Y (::0.193) (::0.158)))
+          (COND B (IOPATH A Y (::0.569) (::0.393)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8307__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.204) (::0.204)))
+          (IOPATH A0 Y (::0.172) (::0.162))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.167) (::0.138)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.169) (::0.162)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.522) (::0.420)))
+          (IOPATH B0 Y (::0.522) (::0.420))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.202) (::0.164)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.167) (::0.114)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.203) (::0.180)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.520) (::0.327)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.162) (::0.128)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.163) (::0.154)))
+          (IOPATH A1 Y (::0.167) (::0.154))
+          (IOPATH B1 Y (::0.204) (::0.204))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.172) (::0.114)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.522) (::0.300)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8308__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.113) (::0.091)))
+          (IOPATH A0 Y (::0.179) (::0.138))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.114) (::0.119)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.113) (::0.112)))
+          (IOPATH B0 Y (::0.114) (::0.112))
+          (IOPATH A1 Y (::0.197) (::0.164))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8309__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.118) (::0.099)))
+          (IOPATH A0 Y (::0.184) (::0.141))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.119) (::0.127)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.118) (::0.120)))
+          (IOPATH B0 Y (::0.119) (::0.120))
+          (IOPATH A1 Y (::0.169) (::0.127))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8310)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.057) (::0.048))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8311)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.056) (::0.048))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8312)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.086) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8313)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.079) (::0.078))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8314)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.081) (::0.078))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8316__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.096) (::0.089))
+          (IOPATH B Y (::0.129) (::0.118))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8317__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.089) (::0.091))
+          (IOPATH B Y (::0.089) (::0.089))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8318__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.126) (::0.092))
+          (IOPATH B Y (::0.123) (::0.081))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8319__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.072) (::0.088))
+          (IOPATH B Y (::0.081) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8320__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.061) (::0.053)))
+          (IOPATH A0 Y (::0.128) (::0.110))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.082) (::0.054)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.068) (::0.054)))
+          (IOPATH B0 Y (::0.082) (::0.054))
+          (IOPATH A1 Y (::0.128) (::0.111))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8321__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.072) (::0.087))
+          (IOPATH B Y (::0.287) (::0.135))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8322__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.055) (::0.059))
+          (IOPATH B Y (::0.075) (::0.081))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8323__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.075) (::0.080)))
+          (IOPATH A0 Y (::0.326) (::0.188))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.098) (::0.082)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.080)))
+          (IOPATH B0 Y (::0.098) (::0.082))
+          (IOPATH A1 Y (::0.088) (::0.067))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8324__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.069) (::0.071)))
+          (IOPATH A0 Y (::0.119) (::0.100))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.090) (::0.072)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.075) (::0.071)))
+          (IOPATH B0 Y (::0.090) (::0.072))
+          (IOPATH A1 Y (::0.109) (::0.106))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8325__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.075) (::0.067)))
+          (IOPATH A0 Y (::0.072) (::0.064))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.076) (::0.093)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.075) (::0.077)))
+          (IOPATH B0 Y (::0.076) (::0.077))
+          (IOPATH A1 Y (::0.123) (::0.109))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8326__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.056) (::0.058))
+          (IOPATH B Y (::0.073) (::0.078))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8327__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.067) (::0.066)))
+          (IOPATH A0 Y (::0.124) (::0.107))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.088) (::0.068)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.073) (::0.067)))
+          (IOPATH B0 Y (::0.088) (::0.068))
+          (IOPATH A1 Y (::0.108) (::0.101))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8328__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.161) (::0.148)))
+          (COND ~B (IOPATH A Y (::0.171) (::0.155)))
+          (COND A (IOPATH B Y (::0.156) (::0.135)))
+          (COND B (IOPATH A Y (::0.152) (::0.134)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8329__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.160) (::0.141)))
+          (COND ~B (IOPATH A Y (::0.170) (::0.152)))
+          (COND A (IOPATH B Y (::0.149) (::0.135)))
+          (COND B (IOPATH A Y (::0.149) (::0.132)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8330__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.178) (::0.126))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.143) (::0.126)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.148) (::0.153)))
+          (IOPATH B0 Y (::0.408) (::0.227))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.197) (::0.144)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.408) (::0.227)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.177) (::0.143)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.337) (::0.226)))
+          (IOPATH A1 Y (::0.180) (::0.153))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.214) (::0.144)))
+          (IOPATH B1 Y (::0.214) (::0.144))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.178) (::0.115)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.163) (::0.114)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.180) (::0.141)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.162) (::0.140)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.368) (::0.224)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8331__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.159) (::0.144)))
+          (COND ~B (IOPATH A Y (::0.182) (::0.158)))
+          (COND A (IOPATH B Y (::0.156) (::0.123)))
+          (COND B (IOPATH A Y (::0.160) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8332__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.094) (::0.088)))
+          (IOPATH A0 Y (::0.181) (::0.144))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.128) (::0.090)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.110) (::0.089)))
+          (IOPATH B0 Y (::0.128) (::0.090))
+          (IOPATH A1 Y (::0.160) (::0.139))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8333__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.163) (::0.143)))
+          (COND ~B (IOPATH A Y (::0.184) (::0.161)))
+          (COND A (IOPATH B Y (::0.155) (::0.126)))
+          (COND B (IOPATH A Y (::0.164) (::0.141)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8334__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.092) (::0.087)))
+          (IOPATH A0 Y (::0.200) (::0.150))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.125) (::0.089)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.108) (::0.088)))
+          (IOPATH B0 Y (::0.125) (::0.089))
+          (IOPATH A1 Y (::0.158) (::0.138))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8335__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.141) (::0.101))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.111) (::0.101)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.105) (::0.100)))
+          (IOPATH B0 Y (::0.144) (::0.114))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.111) (::0.082)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.144) (::0.114)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.096) (::0.082)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.114) (::0.112)))
+          (IOPATH A1 Y (::0.133) (::0.100))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.125) (::0.083)))
+          (IOPATH B1 Y (::0.125) (::0.083))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.141) (::0.090)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.127) (::0.089)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.133) (::0.088)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.117) (::0.088)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.126) (::0.113)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8336__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.192) (::0.167)))
+          (COND ~B (IOPATH A Y (::0.191) (::0.164)))
+          (COND A (IOPATH B Y (::0.186) (::0.155)))
+          (COND B (IOPATH A Y (::0.171) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8338__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.206) (::0.181)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.166)))
+          (COND A (IOPATH B Y (::0.203) (::0.170)))
+          (COND B (IOPATH A Y (::0.176) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8339__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.207) (::0.214)))
+          (IOPATH A0 Y (::0.196) (::0.195))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.191) (::0.172)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.192) (::0.195)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.175)))
+          (IOPATH B0 Y (::0.168) (::0.175))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.205) (::0.173)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.155) (::0.099)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.205) (::0.189)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.146)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.149) (::0.115)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.151) (::0.142)))
+          (IOPATH A1 Y (::0.155) (::0.142))
+          (IOPATH B1 Y (::0.207) (::0.214))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.196) (::0.155)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.134)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8340__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.117) (::0.092)))
+          (IOPATH A0 Y (::0.201) (::0.167))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.118) (::0.120)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.117) (::0.113)))
+          (IOPATH B0 Y (::0.118) (::0.113))
+          (IOPATH A1 Y (::0.202) (::0.149))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8342__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.205) (::0.180)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.165)))
+          (COND A (IOPATH B Y (::0.202) (::0.169)))
+          (COND B (IOPATH A Y (::0.174) (::0.141)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8344__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.205) (::0.190)))
+          (COND ~B (IOPATH A Y (::0.200) (::0.171)))
+          (COND A (IOPATH B Y (::0.213) (::0.167)))
+          (COND B (IOPATH A Y (::0.181) (::0.144)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8346__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.202) (::0.185)))
+          (COND ~B (IOPATH A Y (::0.200) (::0.170)))
+          (COND A (IOPATH B Y (::0.208) (::0.163)))
+          (COND B (IOPATH A Y (::0.180) (::0.145)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8347__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.231) (::0.180)))
+          (COND ~B (IOPATH A Y (::0.164) (::0.138)))
+          (COND A (IOPATH B Y (::0.205) (::0.207)))
+          (COND B (IOPATH A Y (::0.205) (::0.183)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8348__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.117) (::0.109)))
+          (IOPATH A0 Y (::0.211) (::0.165))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.159) (::0.110)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.139) (::0.109)))
+          (IOPATH B0 Y (::0.159) (::0.110))
+          (IOPATH A1 Y (::0.189) (::0.160))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8349__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.202) (::0.187)))
+          (COND ~B (IOPATH A Y (::0.192) (::0.163)))
+          (COND A (IOPATH B Y (::0.209) (::0.170)))
+          (COND B (IOPATH A Y (::0.171) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8350__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.207) (::0.181)))
+          (COND ~B (IOPATH A Y (::0.198) (::0.173)))
+          (COND A (IOPATH B Y (::0.203) (::0.170)))
+          (COND B (IOPATH A Y (::0.183) (::0.141)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8351__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.200) (::0.177)))
+          (COND ~B (IOPATH A Y (::0.194) (::0.164)))
+          (COND A (IOPATH B Y (::0.198) (::0.166)))
+          (COND B (IOPATH A Y (::0.172) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8352__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.078) (::0.071)))
+          (IOPATH A0 Y (::0.125) (::0.089))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.104) (::0.072)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.088) (::0.072)))
+          (IOPATH B0 Y (::0.104) (::0.072))
+          (IOPATH A1 Y (::0.106) (::0.081))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8353__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.182) (::0.173)))
+          (COND ~B (IOPATH A Y (::0.175) (::0.153)))
+          (COND A (IOPATH B Y (::0.189) (::0.152)))
+          (COND B (IOPATH A Y (::0.155) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8354)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.073) (::0.069))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8355)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.079) (::0.076))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8356)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.297) (::0.130))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8357__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.097) (::0.081)))
+          (COND ~B (IOPATH A Y (::0.090) (::0.081)))
+          (COND A (IOPATH B Y (::0.104) (::0.103)))
+          (COND B (IOPATH A Y (::0.136) (::0.129)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8358__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.134) (::0.118)))
+          (COND ~B (IOPATH A Y (::0.160) (::0.140)))
+          (COND A (IOPATH B Y (::0.123) (::0.098)))
+          (COND B (IOPATH A Y (::0.136) (::0.117)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8359__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.143) (::0.144)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.147)))
+          (COND A (IOPATH B Y (::0.152) (::0.112)))
+          (COND B (IOPATH A Y (::0.144) (::0.126)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8360__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.153) (::0.147)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.136)))
+          (COND A (IOPATH B Y (::0.155) (::0.124)))
+          (COND B (IOPATH A Y (::0.131) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8361__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.150) (::0.134)))
+          (COND ~B (IOPATH A Y (::0.133) (::0.124)))
+          (COND A (IOPATH B Y (::0.155) (::0.146)))
+          (COND B (IOPATH A Y (::0.180) (::0.162)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8362__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.181) (::0.170)))
+          (COND ~B (IOPATH A Y (::0.173) (::0.151)))
+          (COND A (IOPATH B Y (::0.185) (::0.151)))
+          (COND B (IOPATH A Y (::0.153) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8363__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.207) (::0.196)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.165)))
+          (COND A (IOPATH B Y (::0.220) (::0.174)))
+          (COND B (IOPATH A Y (::0.174) (::0.141)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8364__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.186) (::0.159)))
+          (COND ~B (IOPATH A Y (::0.208) (::0.177)))
+          (COND A (IOPATH B Y (::0.179) (::0.142)))
+          (COND B (IOPATH A Y (::0.187) (::0.158)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8365__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.207) (::0.196)))
+          (COND ~B (IOPATH A Y (::0.195) (::0.168)))
+          (COND A (IOPATH B Y (::0.221) (::0.175)))
+          (COND B (IOPATH A Y (::0.178) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8366__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.200) (::0.170)))
+          (COND ~B (IOPATH A Y (::0.193) (::0.162)))
+          (COND A (IOPATH B Y (::0.190) (::0.164)))
+          (COND B (IOPATH A Y (::0.170) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8367__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.177)))
+          (COND ~B (IOPATH A Y (::0.196) (::0.168)))
+          (COND A (IOPATH B Y (::0.199) (::0.161)))
+          (COND B (IOPATH A Y (::0.177) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8368__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.205) (::0.186)))
+          (COND ~B (IOPATH A Y (::0.196) (::0.164)))
+          (COND A (IOPATH B Y (::0.209) (::0.169)))
+          (COND B (IOPATH A Y (::0.173) (::0.139)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8369__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.194) (::0.165)))
+          (COND ~B (IOPATH A Y (::0.192) (::0.166)))
+          (COND A (IOPATH B Y (::0.184) (::0.156)))
+          (COND B (IOPATH A Y (::0.174) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8370__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.234) (::0.539)))
+          (COND ~B (IOPATH A Y (::0.204) (::0.170)))
+          (COND A (IOPATH B Y (::0.813) (::0.400)))
+          (COND B (IOPATH A Y (::0.180) (::0.152)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8371__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.201) (::0.162)))
+          (COND ~B (IOPATH A Y (::0.153) (::0.132)))
+          (COND A (IOPATH B Y (::0.192) (::0.186)))
+          (COND B (IOPATH A Y (::0.198) (::0.174)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8372__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.203) (::0.198)))
+          (COND ~B (IOPATH A Y (::0.192) (::0.167)))
+          (COND A (IOPATH B Y (::0.224) (::0.171)))
+          (COND B (IOPATH A Y (::0.175) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8373__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.165) (::0.145)))
+          (COND ~B (IOPATH A Y (::0.180) (::0.154)))
+          (COND A (IOPATH B Y (::0.158) (::0.128)))
+          (COND B (IOPATH A Y (::0.157) (::0.132)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8374__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.188) (::0.160)))
+          (COND ~B (IOPATH A Y (::0.196) (::0.180)))
+          (COND A (IOPATH B Y (::0.179) (::0.144)))
+          (COND B (IOPATH A Y (::0.191) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8375__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.190) (::0.162)))
+          (COND ~B (IOPATH A Y (::0.192) (::0.166)))
+          (COND A (IOPATH B Y (::0.181) (::0.151)))
+          (COND B (IOPATH A Y (::0.174) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8376__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.212) (::0.204)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.166)))
+          (COND A (IOPATH B Y (::0.234) (::0.187)))
+          (COND B (IOPATH A Y (::0.175) (::0.141)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8377__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.185) (::0.166)))
+          (COND ~B (IOPATH A Y (::0.178) (::0.152)))
+          (COND A (IOPATH B Y (::0.182) (::0.154)))
+          (COND B (IOPATH A Y (::0.155) (::0.126)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8378__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.202) (::0.172)))
+          (COND ~B (IOPATH A Y (::0.194) (::0.166)))
+          (COND A (IOPATH B Y (::0.192) (::0.166)))
+          (COND B (IOPATH A Y (::0.174) (::0.139)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8379__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.204) (::0.194)))
+          (COND ~B (IOPATH A Y (::0.193) (::0.164)))
+          (COND A (IOPATH B Y (::0.218) (::0.172)))
+          (COND B (IOPATH A Y (::0.172) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8380__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.174)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.168)))
+          (COND A (IOPATH B Y (::0.194) (::0.161)))
+          (COND B (IOPATH A Y (::0.177) (::0.141)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8381__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.228) (::0.188)))
+          (COND ~B (IOPATH A Y (::0.163) (::0.139)))
+          (COND A (IOPATH B Y (::0.209) (::0.206)))
+          (COND B (IOPATH A Y (::0.206) (::0.182)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8382__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.206) (::0.195)))
+          (COND ~B (IOPATH A Y (::0.204) (::0.173)))
+          (COND A (IOPATH B Y (::0.220) (::0.166)))
+          (COND B (IOPATH A Y (::0.184) (::0.148)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8383__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.207) (::0.174)))
+          (COND ~B (IOPATH A Y (::0.200) (::0.168)))
+          (COND A (IOPATH B Y (::0.196) (::0.170)))
+          (COND B (IOPATH A Y (::0.178) (::0.143)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8384__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.176)))
+          (COND ~B (IOPATH A Y (::0.191) (::0.163)))
+          (COND A (IOPATH B Y (::0.195) (::0.164)))
+          (COND B (IOPATH A Y (::0.170) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8385__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.205) (::0.186)))
+          (COND ~B (IOPATH A Y (::0.198) (::0.170)))
+          (COND A (IOPATH B Y (::0.208) (::0.168)))
+          (COND B (IOPATH A Y (::0.180) (::0.142)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8386__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.171)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.168)))
+          (COND A (IOPATH B Y (::0.192) (::0.160)))
+          (COND B (IOPATH A Y (::0.177) (::0.141)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8387__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.176)))
+          (COND ~B (IOPATH A Y (::0.193) (::0.174)))
+          (COND A (IOPATH B Y (::0.195) (::0.164)))
+          (COND B (IOPATH A Y (::0.182) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8388__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.201) (::0.177)))
+          (COND ~B (IOPATH A Y (::0.193) (::0.164)))
+          (COND A (IOPATH B Y (::0.197) (::0.166)))
+          (COND B (IOPATH A Y (::0.172) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8389__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.210) (::0.200)))
+          (COND ~B (IOPATH A Y (::0.198) (::0.170)))
+          (COND A (IOPATH B Y (::0.227) (::0.182)))
+          (COND B (IOPATH A Y (::0.180) (::0.142)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8390__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.168)))
+          (COND ~B (IOPATH A Y (::0.192) (::0.163)))
+          (COND A (IOPATH B Y (::0.188) (::0.164)))
+          (COND B (IOPATH A Y (::0.171) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8391__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.207) (::0.196)))
+          (COND ~B (IOPATH A Y (::0.277) (::0.406)))
+          (COND A (IOPATH B Y (::0.221) (::0.175)))
+          (COND B (IOPATH A Y (::0.562) (::0.377)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8392__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.190) (::0.196))
+          (IOPATH A1 Y (::0.190) (::0.194))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.110) (::0.100)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.111) (::0.121)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8393__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.155) (::0.166))
+          (IOPATH A1 Y (::0.156) (::0.163))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.092) (::0.086)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.102) (::0.106)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8394__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.188) (::0.198))
+          (IOPATH A1 Y (::0.185) (::0.189))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.105) (::0.097)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.108) (::0.116)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8395__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.183) (::0.162)))
+          (COND ~B (IOPATH A Y (::0.211) (::0.191)))
+          (COND A (IOPATH B Y (::0.180) (::0.141)))
+          (COND B (IOPATH A Y (::0.201) (::0.166)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8396)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.062) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8397__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.069) (::0.079))
+          (IOPATH B Y (::0.062) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8398__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.139) (::0.124))
+          (IOPATH B Y (::0.140) (::0.123))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8399__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.073) (::0.082))
+          (IOPATH B Y (::0.083) (::0.071))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8400__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.114) (::0.089))
+          (IOPATH B Y (::0.103) (::0.072))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8401__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.116) (::0.088))
+          (IOPATH B Y (::0.082) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8402__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.059) (::0.053)))
+          (IOPATH A0 Y (::0.125) (::0.105))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.079) (::0.054)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.065) (::0.053)))
+          (IOPATH B0 Y (::0.079) (::0.054))
+          (IOPATH A1 Y (::0.112) (::0.104))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8403__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.115) (::0.087))
+          (IOPATH B Y (::0.083) (::0.055))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8404__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.118) (::0.094))
+          (IOPATH B Y (::0.118) (::0.079))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8405__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.100) (::0.087)))
+          (IOPATH A0 Y (::0.123) (::0.103))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.101) (::0.113)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.100) (::0.103)))
+          (IOPATH B0 Y (::0.101) (::0.103))
+          (IOPATH A1 Y (::0.161) (::0.135))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8406__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.086) (::0.076)))
+          (IOPATH A0 Y (::0.186) (::0.149))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.122) (::0.077)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.104) (::0.076)))
+          (IOPATH B0 Y (::0.122) (::0.077))
+          (IOPATH A1 Y (::0.149) (::0.138))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8407__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.239) (::0.184))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.207) (::0.184)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.127) (::0.119)))
+          (IOPATH B0 Y (::0.172) (::0.127))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.191) (::0.139)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.172) (::0.127)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.170) (::0.138)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.135) (::0.126)))
+          (IOPATH A1 Y (::0.162) (::0.119))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.206) (::0.139)))
+          (IOPATH B1 Y (::0.206) (::0.139))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.239) (::0.171)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.225) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.162) (::0.108)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.144) (::0.107)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.152) (::0.126)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8408__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.184) (::0.195)))
+          (IOPATH A0 Y (::0.174) (::0.176))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.169) (::0.153)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.171) (::0.176)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.163) (::0.164)))
+          (IOPATH B0 Y (::0.163) (::0.164))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.182) (::0.156)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.131) (::0.086)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.182) (::0.169)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.161) (::0.134)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.126) (::0.098)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.127) (::0.123)))
+          (IOPATH A1 Y (::0.131) (::0.123))
+          (IOPATH B1 Y (::0.184) (::0.195))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.174) (::0.140)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.161) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8409__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.211) (::0.167))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.179) (::0.167)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.125) (::0.117)))
+          (IOPATH B0 Y (::0.148) (::0.109))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.199) (::0.145)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.148) (::0.109)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.178) (::0.144)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.112) (::0.107)))
+          (IOPATH A1 Y (::0.160) (::0.117))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.216) (::0.146)))
+          (IOPATH B1 Y (::0.216) (::0.146))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.211) (::0.155)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.197) (::0.154)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.160) (::0.106)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.142) (::0.105)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.130) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8410__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.202) (::0.154))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.168) (::0.154)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.126) (::0.118)))
+          (IOPATH B0 Y (::0.151) (::0.111))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.140) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.151) (::0.111)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.118) (::0.100)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.115) (::0.109)))
+          (IOPATH A1 Y (::0.162) (::0.118))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.155) (::0.101)))
+          (IOPATH B1 Y (::0.155) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.202) (::0.142)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.187) (::0.141)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.162) (::0.107)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.143) (::0.106)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.132) (::0.110)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8411__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.100) (::0.081)))
+          (IOPATH A0 Y (::0.177) (::0.146))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.101) (::0.106)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.100) (::0.097)))
+          (IOPATH B0 Y (::0.101) (::0.097))
+          (IOPATH A1 Y (::0.197) (::0.161))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8412__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.185) (::0.182)))
+          (IOPATH A0 Y (::0.180) (::0.182))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.174) (::0.160)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.176) (::0.182)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.126) (::0.125)))
+          (IOPATH B0 Y (::0.126) (::0.125))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.146)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.130) (::0.085)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.159)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.124) (::0.099)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.125) (::0.097)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.126) (::0.122)))
+          (IOPATH A1 Y (::0.130) (::0.122))
+          (IOPATH B1 Y (::0.185) (::0.182))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.180) (::0.148)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.124) (::0.090)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8413__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.098) (::0.096)))
+          (IOPATH A0 Y (::0.180) (::0.142))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.133) (::0.097)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.115) (::0.096)))
+          (IOPATH B0 Y (::0.133) (::0.097))
+          (IOPATH A1 Y (::0.145) (::0.108))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8414__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.097) (::0.078)))
+          (IOPATH A0 Y (::0.167) (::0.142))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.098) (::0.103)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.097) (::0.095)))
+          (IOPATH B0 Y (::0.098) (::0.095))
+          (IOPATH A1 Y (::0.176) (::0.130))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8415__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.173) (::0.178)))
+          (IOPATH A0 Y (::0.191) (::0.180))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.186) (::0.158)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.187) (::0.180)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.162) (::0.164)))
+          (IOPATH B0 Y (::0.162) (::0.164))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.171) (::0.142)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.126) (::0.082)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.172) (::0.154)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.160) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.120) (::0.094)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.122) (::0.118)))
+          (IOPATH A1 Y (::0.126) (::0.118))
+          (IOPATH B1 Y (::0.173) (::0.178))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.191) (::0.148)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.160) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8416__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.214) (::0.162))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.180) (::0.162)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.126) (::0.118)))
+          (IOPATH B0 Y (::0.150) (::0.110))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.188) (::0.138)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.150) (::0.110)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.168) (::0.137)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.114) (::0.109)))
+          (IOPATH A1 Y (::0.161) (::0.118))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.204) (::0.138)))
+          (IOPATH B1 Y (::0.204) (::0.138))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.214) (::0.150)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.199) (::0.150)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.161) (::0.107)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.143) (::0.107)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.132) (::0.109)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8417__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.091) (::0.073)))
+          (IOPATH A0 Y (::0.155) (::0.139))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.092) (::0.098)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.091) (::0.089)))
+          (IOPATH B0 Y (::0.092) (::0.089))
+          (IOPATH A1 Y (::0.169) (::0.151))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8418__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.234) (::0.173))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.196) (::0.173)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.141) (::0.131)))
+          (IOPATH B0 Y (::0.170) (::0.124))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.190) (::0.148)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.170) (::0.124)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.165) (::0.147)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.128) (::0.122)))
+          (IOPATH A1 Y (::0.181) (::0.131))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.205) (::0.149)))
+          (IOPATH B1 Y (::0.205) (::0.149))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.234) (::0.161)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.219) (::0.160)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.181) (::0.120)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.161) (::0.119)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.150) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8419__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.230) (::0.177))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.191) (::0.177)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.143) (::0.132)))
+          (IOPATH B0 Y (::0.214) (::0.156))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.191) (::0.148)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.214) (::0.156)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.166) (::0.147)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.172) (::0.155)))
+          (IOPATH A1 Y (::0.183) (::0.132))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.207) (::0.148)))
+          (IOPATH B1 Y (::0.207) (::0.148))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.230) (::0.166)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.214) (::0.165)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.183) (::0.121)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.163) (::0.121)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.192) (::0.155)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8420__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.245) (::0.183))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.209) (::0.183)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.232) (::0.204)))
+          (IOPATH B0 Y (::0.550) (::0.308))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.158) (::0.114)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.550) (::0.308)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.132) (::0.113)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.459) (::0.308)))
+          (IOPATH A1 Y (::0.266) (::0.204))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.173) (::0.115)))
+          (IOPATH B1 Y (::0.173) (::0.115))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.245) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.230) (::0.171)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.266) (::0.191)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.247) (::0.190)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.500) (::0.305)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8421__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.093) (::0.075)))
+          (IOPATH A0 Y (::0.131) (::0.110))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.094) (::0.100)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.093) (::0.092)))
+          (IOPATH B0 Y (::0.094) (::0.092))
+          (IOPATH A1 Y (::0.168) (::0.140))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8422__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.236) (::0.183))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.198) (::0.183)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.143) (::0.133)))
+          (IOPATH B0 Y (::0.173) (::0.126))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.192) (::0.150)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.173) (::0.126)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.167) (::0.149)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.130) (::0.124)))
+          (IOPATH A1 Y (::0.183) (::0.133))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.208) (::0.150)))
+          (IOPATH B1 Y (::0.208) (::0.150))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.236) (::0.172)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.221) (::0.171)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.183) (::0.122)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.163) (::0.121)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.152) (::0.125)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8424__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.131) (::0.095))
+          (IOPATH B Y (::0.082) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8425__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.162) (::0.146)))
+          (COND ~B (IOPATH A Y (::0.168) (::0.147)))
+          (COND A (IOPATH B Y (::0.155) (::0.138)))
+          (COND B (IOPATH A Y (::0.144) (::0.129)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8426__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.163) (::0.162)))
+          (COND ~B (IOPATH A Y (::0.167) (::0.146)))
+          (COND A (IOPATH B Y (::0.172) (::0.141)))
+          (COND B (IOPATH A Y (::0.142) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8427__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.234) (::0.180))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.203) (::0.180)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.123) (::0.116)))
+          (IOPATH B0 Y (::0.169) (::0.132))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.133) (::0.098)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.169) (::0.132)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.112) (::0.097)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.133) (::0.130)))
+          (IOPATH A1 Y (::0.157) (::0.116))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.148) (::0.098)))
+          (IOPATH B1 Y (::0.148) (::0.098))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.234) (::0.167)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.167)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.157) (::0.104)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.139) (::0.104)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.150) (::0.131)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8428__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.260) (::0.204))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.230) (::0.204)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.123) (::0.115)))
+          (IOPATH B0 Y (::0.167) (::0.131))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.149) (::0.127)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.167) (::0.131)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.129) (::0.127)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.132) (::0.129)))
+          (IOPATH A1 Y (::0.157) (::0.115))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.164) (::0.128)))
+          (IOPATH B1 Y (::0.164) (::0.128))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.260) (::0.189)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.245) (::0.188)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.157) (::0.104)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.139) (::0.103)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.148) (::0.130)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8429__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.169) (::0.136)))
+          (IOPATH A0 Y (::0.472) (::0.270))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.170) (::0.169)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.169) (::0.156)))
+          (IOPATH B0 Y (::0.170) (::0.156))
+          (IOPATH A1 Y (::0.147) (::0.115))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8430__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.201) (::0.158))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.169) (::0.158)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.123) (::0.115)))
+          (IOPATH B0 Y (::0.168) (::0.132))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.165) (::0.130)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.168) (::0.132)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.145) (::0.129)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.132) (::0.130)))
+          (IOPATH A1 Y (::0.156) (::0.115))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.180) (::0.131)))
+          (IOPATH B1 Y (::0.180) (::0.131))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.201) (::0.146)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.187) (::0.145)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.156) (::0.104)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.138) (::0.103)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.148) (::0.130)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8431__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.202) (::0.160))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.169) (::0.160)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.123) (::0.115)))
+          (IOPATH B0 Y (::0.167) (::0.131))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.165) (::0.130)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.167) (::0.131)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.145) (::0.129)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.131) (::0.129)))
+          (IOPATH A1 Y (::0.156) (::0.115))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.180) (::0.131)))
+          (IOPATH B1 Y (::0.180) (::0.131))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.202) (::0.148)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.188) (::0.148)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.156) (::0.104)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.138) (::0.103)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.147) (::0.130)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8432__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.235) (::0.181))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.204) (::0.181)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.123) (::0.115)))
+          (IOPATH B0 Y (::0.167) (::0.131))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.149) (::0.127)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.167) (::0.131)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.129) (::0.127)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.132) (::0.130)))
+          (IOPATH A1 Y (::0.157) (::0.115))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.164) (::0.128)))
+          (IOPATH B1 Y (::0.164) (::0.128))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.235) (::0.168)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.167)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.157) (::0.104)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.139) (::0.103)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.148) (::0.130)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8433__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.102) (::0.087)))
+          (IOPATH A0 Y (::0.157) (::0.142))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.103) (::0.112)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.103) (::0.104)))
+          (IOPATH B0 Y (::0.103) (::0.104))
+          (IOPATH A1 Y (::0.190) (::0.161))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8434__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.094) (::0.076)))
+          (IOPATH A0 Y (::0.171) (::0.140))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.095) (::0.100)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.094) (::0.092)))
+          (IOPATH B0 Y (::0.095) (::0.092))
+          (IOPATH A1 Y (::0.169) (::0.150))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8435__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.202) (::0.160))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.160)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.123) (::0.115)))
+          (IOPATH B0 Y (::0.167) (::0.131))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.166) (::0.130)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.167) (::0.131)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.146) (::0.130)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.132) (::0.129)))
+          (IOPATH A1 Y (::0.157) (::0.115))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.181) (::0.131)))
+          (IOPATH B1 Y (::0.181) (::0.131))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.202) (::0.148)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.188) (::0.148)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.157) (::0.104)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.139) (::0.103)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.148) (::0.130)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8436__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.234) (::0.180))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.203) (::0.180)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.123) (::0.115)))
+          (IOPATH B0 Y (::0.169) (::0.132))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.132) (::0.096)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.169) (::0.132)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.112) (::0.096)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.133) (::0.130)))
+          (IOPATH A1 Y (::0.157) (::0.115))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.147) (::0.097)))
+          (IOPATH B1 Y (::0.147) (::0.097))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.234) (::0.167)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.219) (::0.166)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.157) (::0.104)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.139) (::0.103)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.149) (::0.131)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8438__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.096) (::0.077)))
+          (IOPATH A0 Y (::0.174) (::0.142))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.097) (::0.102)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.096) (::0.093)))
+          (IOPATH B0 Y (::0.097) (::0.093))
+          (IOPATH A1 Y (::0.171) (::0.152))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8439__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.234) (::0.180))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.203) (::0.180)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.123) (::0.115)))
+          (IOPATH B0 Y (::0.169) (::0.132))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.184) (::0.134)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.169) (::0.132)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.164) (::0.133)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.133) (::0.130)))
+          (IOPATH A1 Y (::0.157) (::0.115))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.200) (::0.135)))
+          (IOPATH B1 Y (::0.200) (::0.135))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.234) (::0.167)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.219) (::0.166)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.157) (::0.104)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.139) (::0.104)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.149) (::0.131)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8440__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.100) (::0.083)))
+          (IOPATH A0 Y (::0.155) (::0.141))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.102) (::0.108)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.101) (::0.100)))
+          (IOPATH B0 Y (::0.102) (::0.100))
+          (IOPATH A1 Y (::0.182) (::0.155))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8441__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.102) (::0.082)))
+          (IOPATH A0 Y (::0.172) (::0.138))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.103) (::0.108)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.102) (::0.099)))
+          (IOPATH B0 Y (::0.103) (::0.099))
+          (IOPATH A1 Y (::0.196) (::0.160))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8442__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.085) (::0.071)))
+          (IOPATH A0 Y (::0.164) (::0.138))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.086) (::0.095)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.086) (::0.086)))
+          (IOPATH B0 Y (::0.086) (::0.086))
+          (IOPATH A1 Y (::0.170) (::0.152))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8443__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.186) (::0.200)))
+          (IOPATH A0 Y (::0.187) (::0.188))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.181) (::0.165)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.188)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.158) (::0.173)))
+          (IOPATH B0 Y (::0.158) (::0.173))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.185) (::0.161)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.144) (::0.093)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.185) (::0.175)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.156) (::0.143)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.138) (::0.107)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.140) (::0.133)))
+          (IOPATH A1 Y (::0.144) (::0.133))
+          (IOPATH B1 Y (::0.186) (::0.200))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.187) (::0.151)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.156) (::0.132)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8444__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.266) (::0.192))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.229) (::0.192)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.143) (::0.133)))
+          (IOPATH B0 Y (::0.216) (::0.158))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.211) (::0.154)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.216) (::0.158)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.186) (::0.154)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.173) (::0.156)))
+          (IOPATH A1 Y (::0.184) (::0.133))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.227) (::0.155)))
+          (IOPATH B1 Y (::0.227) (::0.155))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.266) (::0.180)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.250) (::0.179)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.184) (::0.122)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.164) (::0.121)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.194) (::0.157)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8445__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.110) (::0.104)))
+          (IOPATH A0 Y (::0.206) (::0.161))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.151) (::0.105)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.132) (::0.104)))
+          (IOPATH B0 Y (::0.151) (::0.105))
+          (IOPATH A1 Y (::0.212) (::0.171))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8446__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.186) (::0.206)))
+          (IOPATH A0 Y (::0.220) (::0.206))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.215) (::0.183)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.217) (::0.206)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.192) (::0.190)))
+          (IOPATH B0 Y (::0.192) (::0.190))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.167)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.155) (::0.100)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.185) (::0.182)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.190) (::0.158)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.149) (::0.115)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.151) (::0.142)))
+          (IOPATH A1 Y (::0.155) (::0.142))
+          (IOPATH B1 Y (::0.186) (::0.206))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.220) (::0.168)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.190) (::0.147)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8447__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.264) (::0.201))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.227) (::0.201)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.145) (::0.134)))
+          (IOPATH B0 Y (::0.218) (::0.159))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.213) (::0.156)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.218) (::0.159)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.187) (::0.155)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.175) (::0.157)))
+          (IOPATH A1 Y (::0.186) (::0.134))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.229) (::0.156)))
+          (IOPATH B1 Y (::0.229) (::0.156))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.264) (::0.188)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.248) (::0.188)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.186) (::0.123)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.165) (::0.122)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.196) (::0.158)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8448__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.110) (::0.104)))
+          (IOPATH A0 Y (::0.204) (::0.161))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.151) (::0.105)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.132) (::0.104)))
+          (IOPATH B0 Y (::0.151) (::0.105))
+          (IOPATH A1 Y (::0.190) (::0.164))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8449__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.229) (::0.176))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.190) (::0.176)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.143) (::0.133)))
+          (IOPATH B0 Y (::0.216) (::0.158))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.159) (::0.110)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.216) (::0.158)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.132) (::0.110)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.173) (::0.156)))
+          (IOPATH A1 Y (::0.184) (::0.133))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.174) (::0.111)))
+          (IOPATH B1 Y (::0.174) (::0.111))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.229) (::0.164)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.214) (::0.164)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.184) (::0.122)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.164) (::0.121)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.194) (::0.157)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8450__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.113) (::0.106)))
+          (IOPATH A0 Y (::0.224) (::0.167))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.154) (::0.107)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.134) (::0.106)))
+          (IOPATH B0 Y (::0.154) (::0.107))
+          (IOPATH A1 Y (::0.212) (::0.171))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8451)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.057) (::0.050))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8452)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.052) (::0.047))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8455)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.060) (::0.057))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8456)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.082) (::0.078))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8457__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.136) (::0.094))
+          (IOPATH B Y (::0.099) (::0.070))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8458__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.118) (::0.090))
+          (IOPATH B Y (::0.100) (::0.070))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8459__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.135) (::0.117))
+          (IOPATH B Y (::0.144) (::0.146))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8460__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.118) (::0.090))
+          (IOPATH B Y (::0.099) (::0.070))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8461__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.087) (::0.081))
+          (IOPATH B Y (::0.058) (::0.056))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8462__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.058) (::0.060))
+          (IOPATH B Y (::0.111) (::0.094))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8463__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.110) (::0.081)))
+          (IOPATH A0 Y (::0.348) (::0.124))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.111) (::0.115)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.110) (::0.093)))
+          (IOPATH B0 Y (::0.111) (::0.093))
+          (IOPATH A1 Y (::0.146) (::0.117))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8464__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.085) (::0.083))
+          (IOPATH B Y (::0.059) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8465__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.057) (::0.061))
+          (IOPATH B Y (::0.082) (::0.086))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8466__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.057) (::0.061))
+          (IOPATH B Y (::0.082) (::0.086))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8467__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.110) (::0.082))
+          (IOPATH B Y (::0.082) (::0.057))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8468__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.122) (::0.088))
+          (IOPATH B Y (::0.082) (::0.055))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8469__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.085) (::0.077)))
+          (IOPATH A0 Y (::0.133) (::0.107))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.111) (::0.079)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.092) (::0.078)))
+          (IOPATH B0 Y (::0.111) (::0.079))
+          (IOPATH A1 Y (::0.109) (::0.106))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8470__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.130) (::0.094))
+          (IOPATH B Y (::0.083) (::0.057))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8471__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.078) (::0.079))
+          (IOPATH B Y (::0.059) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8472__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.057) (::0.059))
+          (IOPATH B Y (::0.063) (::0.066))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8473__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.102) (::0.078)))
+          (IOPATH A0 Y (::0.127) (::0.096))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.104) (::0.109)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.102) (::0.089)))
+          (IOPATH B0 Y (::0.104) (::0.089))
+          (IOPATH A1 Y (::0.101) (::0.080))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8474__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.056) (::0.060))
+          (IOPATH B Y (::0.081) (::0.085))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8475__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.086) (::0.074)))
+          (IOPATH A0 Y (::0.114) (::0.098))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.087) (::0.101)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.086) (::0.084)))
+          (IOPATH B0 Y (::0.087) (::0.084))
+          (IOPATH A1 Y (::0.112) (::0.107))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8476__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.151) (::0.137)))
+          (COND ~B (IOPATH A Y (::0.170) (::0.168)))
+          (COND A (IOPATH B Y (::0.143) (::0.124)))
+          (COND B (IOPATH A Y (::0.165) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8477__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.166) (::0.168)))
+          (COND ~B (IOPATH A Y (::0.174) (::0.167)))
+          (COND A (IOPATH B Y (::0.181) (::0.147)))
+          (COND B (IOPATH A Y (::0.165) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8478__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.085) (::0.080)))
+          (IOPATH A0 Y (::0.143) (::0.128))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.113) (::0.081)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.097) (::0.080)))
+          (IOPATH B0 Y (::0.113) (::0.081))
+          (IOPATH A1 Y (::0.126) (::0.105))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8480__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.181) (::0.150)))
+          (COND ~B (IOPATH A Y (::0.156) (::0.126)))
+          (COND A (IOPATH B Y (::0.164) (::0.172)))
+          (COND B (IOPATH A Y (::0.180) (::0.182)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8481__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.154) (::0.136)))
+          (COND ~B (IOPATH A Y (::0.125) (::0.114)))
+          (COND A (IOPATH B Y (::0.155) (::0.151)))
+          (COND B (IOPATH A Y (::0.170) (::0.156)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8482__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.163) (::0.161)))
+          (COND ~B (IOPATH A Y (::0.174) (::0.167)))
+          (COND A (IOPATH B Y (::0.171) (::0.141)))
+          (COND B (IOPATH A Y (::0.165) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8483__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.161) (::0.149)))
+          (COND ~B (IOPATH A Y (::0.167) (::0.148)))
+          (COND A (IOPATH B Y (::0.157) (::0.136)))
+          (COND B (IOPATH A Y (::0.144) (::0.128)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8484__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.166) (::0.168)))
+          (COND ~B (IOPATH A Y (::0.172) (::0.155)))
+          (COND A (IOPATH B Y (::0.181) (::0.147)))
+          (COND B (IOPATH A Y (::0.152) (::0.135)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8485__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.163) (::0.164)))
+          (COND ~B (IOPATH A Y (::0.174) (::0.171)))
+          (COND A (IOPATH B Y (::0.175) (::0.140)))
+          (COND B (IOPATH A Y (::0.170) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8487__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.163) (::0.161)))
+          (COND ~B (IOPATH A Y (::0.171) (::0.147)))
+          (COND A (IOPATH B Y (::0.171) (::0.141)))
+          (COND B (IOPATH A Y (::0.144) (::0.134)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8489__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.159) (::0.158)))
+          (COND ~B (IOPATH A Y (::0.172) (::0.162)))
+          (COND A (IOPATH B Y (::0.168) (::0.134)))
+          (COND B (IOPATH A Y (::0.159) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8490__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.164) (::0.142)))
+          (COND ~B (IOPATH A Y (::0.169) (::0.157)))
+          (COND A (IOPATH B Y (::0.155) (::0.127)))
+          (COND B (IOPATH A Y (::0.160) (::0.116)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8491__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.180) (::0.174)))
+          (COND ~B (IOPATH A Y (::0.172) (::0.148)))
+          (COND A (IOPATH B Y (::0.190) (::0.151)))
+          (COND B (IOPATH A Y (::0.149) (::0.121)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8492__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.110) (::0.096)))
+          (IOPATH A0 Y (::0.172) (::0.139))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.111) (::0.122)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.110) (::0.114)))
+          (IOPATH B0 Y (::0.111) (::0.114))
+          (IOPATH A1 Y (::0.149) (::0.115))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8493__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.201) (::0.156))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.168) (::0.156)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.123) (::0.115)))
+          (IOPATH B0 Y (::0.146) (::0.107))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.166) (::0.129)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.146) (::0.107)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.146) (::0.128)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.111) (::0.106)))
+          (IOPATH A1 Y (::0.156) (::0.115))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.181) (::0.129)))
+          (IOPATH B1 Y (::0.181) (::0.129))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.201) (::0.145)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.187) (::0.144)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.156) (::0.104)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.139) (::0.103)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.128) (::0.106)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8494__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.126) (::0.109)))
+          (IOPATH A0 Y (::0.192) (::0.151))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.127) (::0.138)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.126) (::0.131)))
+          (IOPATH B0 Y (::0.127) (::0.131))
+          (IOPATH A1 Y (::0.174) (::0.133))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8495__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.243) (::0.181))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.207) (::0.181)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.137) (::0.128)))
+          (IOPATH B0 Y (::0.166) (::0.121))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.171) (::0.145)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.166) (::0.121)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.147) (::0.144)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.125) (::0.119)))
+          (IOPATH A1 Y (::0.176) (::0.128))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.186) (::0.146)))
+          (IOPATH B1 Y (::0.186) (::0.146))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.243) (::0.170)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.228) (::0.169)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.176) (::0.117)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.156) (::0.116)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.145) (::0.120)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8496__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.231) (::0.172))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.194) (::0.172)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.139) (::0.130)))
+          (IOPATH B0 Y (::0.168) (::0.123))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.155) (::0.111)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.168) (::0.123)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.129) (::0.110)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.127) (::0.121)))
+          (IOPATH A1 Y (::0.178) (::0.130))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.170) (::0.112)))
+          (IOPATH B1 Y (::0.170) (::0.112))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.231) (::0.160)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.216) (::0.159)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.178) (::0.118)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.159) (::0.118)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.148) (::0.122)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8497__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.199) (::0.200)))
+          (IOPATH A0 Y (::0.217) (::0.203))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.211) (::0.180)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.213) (::0.203)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.493) (::0.405)))
+          (IOPATH B0 Y (::0.493) (::0.405))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.197) (::0.161)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.162) (::0.111)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.197) (::0.176)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.490) (::0.313)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.156) (::0.124)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.158) (::0.150)))
+          (IOPATH A1 Y (::0.162) (::0.150))
+          (IOPATH B1 Y (::0.199) (::0.200))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.217) (::0.165)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.492) (::0.287)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8498__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.199) (::0.187)))
+          (COND ~B (IOPATH A Y (::0.195) (::0.166)))
+          (COND A (IOPATH B Y (::0.208) (::0.165)))
+          (COND B (IOPATH A Y (::0.173) (::0.143)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8499__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.176) (::0.154)))
+          (COND ~B (IOPATH A Y (::0.178) (::0.148)))
+          (COND A (IOPATH B Y (::0.168) (::0.143)))
+          (COND B (IOPATH A Y (::0.150) (::0.129)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8500__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.079) (::0.076)))
+          (IOPATH A0 Y (::0.132) (::0.097))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.107) (::0.078)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.091) (::0.077)))
+          (IOPATH B0 Y (::0.107) (::0.078))
+          (IOPATH A1 Y (::0.136) (::0.111))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8501__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.228) (::0.174))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.189) (::0.174)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.142) (::0.132)))
+          (IOPATH B0 Y (::0.172) (::0.124))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.208) (::0.158)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.172) (::0.124)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.183) (::0.157)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.130) (::0.123)))
+          (IOPATH A1 Y (::0.182) (::0.132))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.224) (::0.158)))
+          (IOPATH B1 Y (::0.224) (::0.158))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.228) (::0.162)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.212) (::0.161)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.182) (::0.121)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.162) (::0.120)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.151) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8502__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.256) (::0.190))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.218) (::0.190)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.147) (::0.136)))
+          (IOPATH B0 Y (::0.178) (::0.129))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.181) (::0.143)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.178) (::0.129)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.154) (::0.142)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.134) (::0.127)))
+          (IOPATH A1 Y (::0.188) (::0.136))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.197) (::0.144)))
+          (IOPATH B1 Y (::0.197) (::0.144))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.256) (::0.178)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.240) (::0.177)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.188) (::0.125)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.168) (::0.124)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.157) (::0.128)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8503__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.122) (::0.106)))
+          (IOPATH A0 Y (::0.187) (::0.147))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.123) (::0.134)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.122) (::0.127)))
+          (IOPATH B0 Y (::0.123) (::0.127))
+          (IOPATH A1 Y (::0.169) (::0.129))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8504__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.198) (::0.192)))
+          (IOPATH A0 Y (::0.169) (::0.161))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.164) (::0.138)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.165) (::0.161)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.148) (::0.143)))
+          (IOPATH B0 Y (::0.148) (::0.143))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.197) (::0.152)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.184) (::0.117)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.197) (::0.168)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.146) (::0.116)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.178) (::0.131)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.180) (::0.157)))
+          (IOPATH A1 Y (::0.184) (::0.157))
+          (IOPATH B1 Y (::0.198) (::0.192))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.169) (::0.114)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.146) (::0.104)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8505)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.068) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8506)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.070) (::0.065))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8507__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.154) (::0.139)))
+          (COND ~B (IOPATH A Y (::0.132) (::0.118)))
+          (COND A (IOPATH B Y (::0.159) (::0.149)))
+          (COND B (IOPATH A Y (::0.175) (::0.161)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8508__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.154) (::0.136)))
+          (COND ~B (IOPATH A Y (::0.142) (::0.120)))
+          (COND A (IOPATH B Y (::0.155) (::0.150)))
+          (COND B (IOPATH A Y (::0.175) (::0.171)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8509__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.159) (::0.135)))
+          (COND ~B (IOPATH A Y (::0.177) (::0.174)))
+          (COND A (IOPATH B Y (::0.142) (::0.133)))
+          (COND B (IOPATH A Y (::0.174) (::0.146)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8510__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.160) (::0.148)))
+          (COND ~B (IOPATH A Y (::0.174) (::0.171)))
+          (COND A (IOPATH B Y (::0.157) (::0.135)))
+          (COND B (IOPATH A Y (::0.170) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8511__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.157) (::0.141)))
+          (COND ~B (IOPATH A Y (::0.160) (::0.142)))
+          (COND A (IOPATH B Y (::0.149) (::0.130)))
+          (COND B (IOPATH A Y (::0.138) (::0.118)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8512__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.163) (::0.164)))
+          (COND ~B (IOPATH A Y (::0.174) (::0.171)))
+          (COND A (IOPATH B Y (::0.175) (::0.140)))
+          (COND B (IOPATH A Y (::0.170) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8513__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.159) (::0.135)))
+          (COND ~B (IOPATH A Y (::0.186) (::0.189)))
+          (COND A (IOPATH B Y (::0.142) (::0.133)))
+          (COND B (IOPATH A Y (::0.195) (::0.164)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8514__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.161) (::0.145)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.150)))
+          (COND A (IOPATH B Y (::0.154) (::0.137)))
+          (COND B (IOPATH A Y (::0.147) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8515__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.163) (::0.164)))
+          (COND ~B (IOPATH A Y (::0.174) (::0.171)))
+          (COND A (IOPATH B Y (::0.175) (::0.140)))
+          (COND B (IOPATH A Y (::0.170) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8516__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.162) (::0.154)))
+          (COND ~B (IOPATH A Y (::0.172) (::0.148)))
+          (COND A (IOPATH B Y (::0.164) (::0.138)))
+          (COND B (IOPATH A Y (::0.145) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8517__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.159) (::0.158)))
+          (COND ~B (IOPATH A Y (::0.150) (::0.147)))
+          (COND A (IOPATH B Y (::0.167) (::0.138)))
+          (COND B (IOPATH A Y (::0.143) (::0.105)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8518__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.135) (::0.123)))
+          (COND ~B (IOPATH A Y (::0.172) (::0.166)))
+          (COND A (IOPATH B Y (::0.128) (::0.101)))
+          (COND B (IOPATH A Y (::0.164) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8519__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.145) (::0.127)))
+          (COND ~B (IOPATH A Y (::0.140) (::0.122)))
+          (COND A (IOPATH B Y (::0.148) (::0.142)))
+          (COND B (IOPATH A Y (::0.176) (::0.169)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8520__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.129) (::0.106)))
+          (COND ~B (IOPATH A Y (::0.150) (::0.123)))
+          (COND A (IOPATH B Y (::0.133) (::0.128)))
+          (COND B (IOPATH A Y (::0.178) (::0.177)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8521__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.154) (::0.141)))
+          (COND ~B (IOPATH A Y (::0.164) (::0.134)))
+          (COND A (IOPATH B Y (::0.149) (::0.126)))
+          (COND B (IOPATH A Y (::0.130) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8522__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.159) (::0.164)))
+          (COND ~B (IOPATH A Y (::0.147) (::0.130)))
+          (COND A (IOPATH B Y (::0.175) (::0.134)))
+          (COND B (IOPATH A Y (::0.125) (::0.098)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8523__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.161) (::0.147)))
+          (COND ~B (IOPATH A Y (::0.171) (::0.154)))
+          (COND A (IOPATH B Y (::0.156) (::0.135)))
+          (COND B (IOPATH A Y (::0.151) (::0.135)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8524__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.142)))
+          (COND ~B (IOPATH A Y (::0.174) (::0.171)))
+          (COND A (IOPATH B Y (::0.150) (::0.128)))
+          (COND B (IOPATH A Y (::0.170) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8525__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.161) (::0.142)))
+          (COND ~B (IOPATH A Y (::0.173) (::0.159)))
+          (COND A (IOPATH B Y (::0.150) (::0.136)))
+          (COND B (IOPATH A Y (::0.156) (::0.139)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8526__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.162) (::0.138)))
+          (COND ~B (IOPATH A Y (::0.126) (::0.108)))
+          (COND A (IOPATH B Y (::0.158) (::0.156)))
+          (COND B (IOPATH A Y (::0.165) (::0.156)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8527__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.163) (::0.162)))
+          (COND ~B (IOPATH A Y (::0.172) (::0.162)))
+          (COND A (IOPATH B Y (::0.172) (::0.141)))
+          (COND B (IOPATH A Y (::0.159) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8528__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.186) (::0.145)))
+          (COND ~B (IOPATH A Y (::0.132) (::0.124)))
+          (COND A (IOPATH B Y (::0.162) (::0.175)))
+          (COND B (IOPATH A Y (::0.179) (::0.161)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8529__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.161) (::0.149)))
+          (COND ~B (IOPATH A Y (::0.172) (::0.154)))
+          (COND A (IOPATH B Y (::0.157) (::0.136)))
+          (COND B (IOPATH A Y (::0.152) (::0.135)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8530__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.166) (::0.168)))
+          (COND ~B (IOPATH A Y (::0.171) (::0.155)))
+          (COND A (IOPATH B Y (::0.181) (::0.147)))
+          (COND B (IOPATH A Y (::0.152) (::0.135)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8531__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.162) (::0.154)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.142)))
+          (COND A (IOPATH B Y (::0.163) (::0.138)))
+          (COND B (IOPATH A Y (::0.138) (::0.126)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8532__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.163) (::0.164)))
+          (COND ~B (IOPATH A Y (::0.172) (::0.155)))
+          (COND A (IOPATH B Y (::0.175) (::0.140)))
+          (COND B (IOPATH A Y (::0.152) (::0.135)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8533__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.160) (::0.149)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.135)))
+          (COND A (IOPATH B Y (::0.157) (::0.135)))
+          (COND B (IOPATH A Y (::0.131) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8534__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.161) (::0.149)))
+          (COND ~B (IOPATH A Y (::0.167) (::0.148)))
+          (COND A (IOPATH B Y (::0.157) (::0.136)))
+          (COND B (IOPATH A Y (::0.144) (::0.128)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8535__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.160) (::0.149)))
+          (COND ~B (IOPATH A Y (::0.166) (::0.148)))
+          (COND A (IOPATH B Y (::0.157) (::0.134)))
+          (COND B (IOPATH A Y (::0.145) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8536__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.154) (::0.148)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.135)))
+          (COND A (IOPATH B Y (::0.156) (::0.126)))
+          (COND B (IOPATH A Y (::0.131) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8537__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.163) (::0.161)))
+          (COND ~B (IOPATH A Y (::0.171) (::0.147)))
+          (COND A (IOPATH B Y (::0.171) (::0.141)))
+          (COND B (IOPATH A Y (::0.144) (::0.134)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8538__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.150) (::0.138)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.135)))
+          (COND A (IOPATH B Y (::0.145) (::0.121)))
+          (COND B (IOPATH A Y (::0.131) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8539__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.168) (::0.136)))
+          (COND ~B (IOPATH A Y (::0.146) (::0.123)))
+          (COND A (IOPATH B Y (::0.156) (::0.162)))
+          (COND B (IOPATH A Y (::0.178) (::0.174)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8540__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.151) (::0.135)))
+          (COND ~B (IOPATH A Y (::0.170) (::0.165)))
+          (COND A (IOPATH B Y (::0.141) (::0.125)))
+          (COND B (IOPATH A Y (::0.161) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8541__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.124) (::0.136))
+          (IOPATH A1 Y (::0.124) (::0.133))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.122) (::0.100)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.122) (::0.144)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8542__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.155) (::0.140)))
+          (COND ~B (IOPATH A Y (::0.107) (::0.093)))
+          (COND A (IOPATH B Y (::0.160) (::0.151)))
+          (COND B (IOPATH A Y (::0.152) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8543__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.119) (::0.126)))
+          (IOPATH A0 Y (::0.187) (::0.174))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.181) (::0.151)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.174)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.374) (::0.290)))
+          (IOPATH B0 Y (::0.374) (::0.290))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.117) (::0.094)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.148) (::0.109)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.117) (::0.105)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.371) (::0.195)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.142) (::0.114)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.144) (::0.136)))
+          (IOPATH A1 Y (::0.148) (::0.136))
+          (IOPATH B1 Y (::0.119) (::0.126))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.187) (::0.144)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.374) (::0.175)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8544__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.107) (::0.118))
+          (IOPATH A1 Y (::0.125) (::0.143))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.123) (::0.099)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.123) (::0.146)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8545__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.124) (::0.135))
+          (IOPATH A1 Y (::0.123) (::0.132))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.085) (::0.074)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.092) (::0.101)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8546__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.154) (::0.149)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.135)))
+          (COND A (IOPATH B Y (::0.158) (::0.127)))
+          (COND B (IOPATH A Y (::0.131) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8547__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.156) (::0.149)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.135)))
+          (COND A (IOPATH B Y (::0.158) (::0.129)))
+          (COND B (IOPATH A Y (::0.131) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8548__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.160) (::0.149)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.135)))
+          (COND A (IOPATH B Y (::0.157) (::0.135)))
+          (COND B (IOPATH A Y (::0.131) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8549__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.211) (::0.195)))
+          (COND ~B (IOPATH A Y (::0.206) (::0.174)))
+          (COND A (IOPATH B Y (::0.219) (::0.173)))
+          (COND B (IOPATH A Y (::0.185) (::0.151)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8550__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.215) (::0.202)))
+          (COND ~B (IOPATH A Y (::0.206) (::0.174)))
+          (COND A (IOPATH B Y (::0.230) (::0.186)))
+          (COND B (IOPATH A Y (::0.185) (::0.151)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8551__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.206) (::0.192)))
+          (COND ~B (IOPATH A Y (::0.196) (::0.165)))
+          (COND A (IOPATH B Y (::0.215) (::0.170)))
+          (COND B (IOPATH A Y (::0.174) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8552__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.214) (::0.208)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.166)))
+          (COND A (IOPATH B Y (::0.241) (::0.192)))
+          (COND B (IOPATH A Y (::0.175) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8553__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.200) (::0.168)))
+          (COND ~B (IOPATH A Y (::0.165) (::0.141)))
+          (COND A (IOPATH B Y (::0.201) (::0.183)))
+          (COND B (IOPATH A Y (::0.210) (::0.183)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8554__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.194) (::0.164)))
+          (COND ~B (IOPATH A Y (::0.162) (::0.137)))
+          (COND A (IOPATH B Y (::0.196) (::0.179)))
+          (COND B (IOPATH A Y (::0.205) (::0.181)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8555__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.145) (::0.102))
+          (IOPATH B Y (::0.351) (::0.093))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8556__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.150) (::0.197))
+          (IOPATH B Y (::0.164) (::0.347))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8557__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.139) (::0.171))
+          (IOPATH B Y (::0.103) (::0.133))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8558__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.150) (::0.197))
+          (IOPATH B Y (::0.103) (::0.133))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8559__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.142) (::0.187))
+          (IOPATH B Y (::0.103) (::0.133))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8560__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.047) (::0.056))
+          (IOPATH B Y (::0.062) (::0.063))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8561__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.103) (::0.143))
+          (IOPATH B Y (::0.103) (::0.133))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8562__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.076) (::0.070))
+          (IOPATH B Y (::0.084) (::0.089))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8563__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.226) (::0.443))
+          (IOPATH B Y (::0.103) (::0.133))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8564__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.139) (::0.171))
+          (IOPATH B Y (::0.103) (::0.133))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8565__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.076) (::0.070))
+          (IOPATH B Y (::0.093) (::0.090))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8566__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.143) (::0.188))
+          (IOPATH B Y (::0.116) (::0.153))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8567__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.141) (::0.134))
+          (IOPATH B Y (::0.145) (::0.148))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8568__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.076) (::0.070))
+          (IOPATH B Y (::0.100) (::0.091))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8569__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.086) (::0.096))
+          (IOPATH B Y (::0.088) (::0.097))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8574__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.096) (::0.099))
+          (IOPATH B Y (::0.089) (::0.096))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8575__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.119) (::0.094))
+          (IOPATH B Y (::0.123) (::0.080))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8576__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.094) (::0.129))
+          (IOPATH B Y (::0.110) (::0.138))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8577__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.138) (::0.170))
+          (IOPATH B Y (::0.125) (::0.172))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8578__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.072) (::0.086))
+          (IOPATH B Y (::0.084) (::0.089))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8579__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.278) (::0.156))
+          (IOPATH B Y (::0.091) (::0.088))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8580__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.111) (::0.100))
+          (IOPATH B Y (::0.139) (::0.149))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8581__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.144) (::0.138))
+          (IOPATH B Y (::0.139) (::0.142))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8582__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.104) (::0.141))
+          (IOPATH B Y (::0.123) (::0.155))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8583__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.136) (::0.156))
+          (IOPATH B Y (::0.122) (::0.153))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8584__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.136) (::0.156))
+          (IOPATH B Y (::0.123) (::0.153))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8585__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.098) (::0.099))
+          (IOPATH B Y (::0.103) (::0.094))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8586)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8587__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.102) (::0.141))
+          (IOPATH B Y (::0.123) (::0.155))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8588__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.083) (::0.090))
+          (IOPATH B Y (::0.081) (::0.088))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8589__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.098) (::0.099))
+          (IOPATH B Y (::0.107) (::0.099))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8590__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.144) (::0.138))
+          (IOPATH B Y (::0.141) (::0.125))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8591__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.073) (::0.088))
+          (IOPATH B Y (::0.100) (::0.091))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8592__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.142) (::0.187))
+          (IOPATH B Y (::0.126) (::0.173))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8593__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.109) (::0.081)))
+          (IOPATH A0 Y (::0.080) (::0.068))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.111) (::0.115)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.109) (::0.093)))
+          (IOPATH B0 Y (::0.111) (::0.093))
+          (IOPATH A1 Y (::0.105) (::0.087))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8594__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.134) (::0.093))
+          (IOPATH B Y (::0.123) (::0.076))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8595__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.140) (::0.118))
+          (IOPATH B Y (::0.142) (::0.137))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8596__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.117) (::0.090))
+          (IOPATH B Y (::0.106) (::0.074))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8597__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.142) (::0.187))
+          (IOPATH B Y (::0.126) (::0.173))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8598__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.139) (::0.171))
+          (IOPATH B Y (::0.123) (::0.154))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8599__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.118) (::0.090))
+          (IOPATH B Y (::0.123) (::0.076))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8600__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.139) (::0.171))
+          (IOPATH B Y (::0.122) (::0.153))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8601__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.099) (::0.140))
+          (IOPATH B Y (::0.126) (::0.173))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8602__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.073) (::0.088))
+          (IOPATH B Y (::0.100) (::0.091))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8603__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.139) (::0.171))
+          (IOPATH B Y (::0.122) (::0.153))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8605__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.142) (::0.187))
+          (IOPATH B Y (::0.123) (::0.155))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8606__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.101) (::0.078)))
+          (IOPATH A0 Y (::0.078) (::0.068))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.103) (::0.108)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.101) (::0.089)))
+          (IOPATH B0 Y (::0.103) (::0.089))
+          (IOPATH A1 Y (::0.105) (::0.087))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8607__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.115) (::0.087))
+          (IOPATH B Y (::0.076) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8608__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.101) (::0.078)))
+          (IOPATH A0 Y (::0.078) (::0.068))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.103) (::0.108)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.101) (::0.089)))
+          (IOPATH B0 Y (::0.103) (::0.089))
+          (IOPATH A1 Y (::0.105) (::0.087))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8609__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.154) (::0.106))
+          (IOPATH B Y (::0.081) (::0.053))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8610__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.060) (::0.054)))
+          (IOPATH A0 Y (::0.120) (::0.104))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.081) (::0.055)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.067) (::0.054)))
+          (IOPATH B0 Y (::0.081) (::0.055))
+          (IOPATH A1 Y (::0.098) (::0.083))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8611__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.198) (::0.178)))
+          (COND ~B (IOPATH A Y (::0.193) (::0.162)))
+          (COND A (IOPATH B Y (::0.200) (::0.158)))
+          (COND B (IOPATH A Y (::0.171) (::0.134)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8612__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.202) (::0.182)))
+          (COND ~B (IOPATH A Y (::0.197) (::0.165)))
+          (COND A (IOPATH B Y (::0.205) (::0.161)))
+          (COND B (IOPATH A Y (::0.175) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8613__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.197) (::0.178)))
+          (COND ~B (IOPATH A Y (::0.192) (::0.161)))
+          (COND A (IOPATH B Y (::0.200) (::0.157)))
+          (COND B (IOPATH A Y (::0.170) (::0.133)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8614__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.192) (::0.168)))
+          (COND ~B (IOPATH A Y (::0.193) (::0.162)))
+          (COND A (IOPATH B Y (::0.189) (::0.150)))
+          (COND B (IOPATH A Y (::0.171) (::0.134)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8615__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.213) (::0.176)))
+          (COND ~B (IOPATH A Y (::0.156) (::0.131)))
+          (COND A (IOPATH B Y (::0.204) (::0.195)))
+          (COND B (IOPATH A Y (::0.200) (::0.175)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8616__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.202) (::0.163)))
+          (COND ~B (IOPATH A Y (::0.156) (::0.131)))
+          (COND A (IOPATH B Y (::0.195) (::0.185)))
+          (COND B (IOPATH A Y (::0.200) (::0.175)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8617__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.204) (::0.164)))
+          (COND ~B (IOPATH A Y (::0.157) (::0.132)))
+          (COND A (IOPATH B Y (::0.196) (::0.187)))
+          (COND B (IOPATH A Y (::0.201) (::0.176)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8618)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.079) (::0.077))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8619)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.071) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8620)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.094) (::0.090))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8621)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.092) (::0.089))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8622)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.114) (::0.096))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8624)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.085) (::0.084))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8625)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.081) (::0.080))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8626)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::1.624) (::1.553))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_3")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8627)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::1.727) (::1.508))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8632)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::3.283) (::3.090))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8634)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::1.641) (::1.556))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8635)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::2.441) (::2.403))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_2")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8638)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::1.734) (::1.650))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8639__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.155) (::0.115))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.126) (::0.115)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.106) (::0.102)))
+          (IOPATH B0 Y (::0.132) (::0.096))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.138) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.132) (::0.096)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.122) (::0.100)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.102) (::0.094)))
+          (IOPATH A1 Y (::0.134) (::0.102))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.152) (::0.101)))
+          (IOPATH B1 Y (::0.152) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.155) (::0.104)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.142) (::0.103)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.134) (::0.091)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.118) (::0.090)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.115) (::0.095)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8640__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.208) (::0.146)))
+          (IOPATH A0 Y (::0.131) (::0.104))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.210) (::0.193)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.208) (::0.168)))
+          (IOPATH B0 Y (::0.210) (::0.168))
+          (IOPATH A1 Y (::0.131) (::0.108))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8641__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.153) (::0.134)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.135)))
+          (COND A (IOPATH B Y (::0.142) (::0.126)))
+          (COND B (IOPATH A Y (::0.131) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8642__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.160) (::0.149)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.135)))
+          (COND A (IOPATH B Y (::0.158) (::0.134)))
+          (COND B (IOPATH A Y (::0.131) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8643__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.165) (::0.163)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.135)))
+          (COND A (IOPATH B Y (::0.174) (::0.144)))
+          (COND B (IOPATH A Y (::0.131) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8644__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.115) (::0.124)))
+          (IOPATH A0 Y (::0.167) (::0.151))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.162) (::0.130)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.163) (::0.151)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.097) (::0.099)))
+          (IOPATH B0 Y (::0.097) (::0.099))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.114) (::0.092)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.126) (::0.091)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.114) (::0.103)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.096) (::0.076)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.121) (::0.098)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.122) (::0.121)))
+          (IOPATH A1 Y (::0.126) (::0.121))
+          (IOPATH B1 Y (::0.115) (::0.124))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.167) (::0.118)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.095) (::0.069)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8645__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.148) (::0.151)))
+          (COND ~B (IOPATH A Y (::0.142) (::0.124)))
+          (COND A (IOPATH B Y (::0.159) (::0.121)))
+          (COND B (IOPATH A Y (::0.118) (::0.093)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8646__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.115) (::0.124)))
+          (IOPATH A0 Y (::0.167) (::0.151))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.162) (::0.130)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.163) (::0.151)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.097) (::0.099)))
+          (IOPATH B0 Y (::0.097) (::0.099))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.114) (::0.092)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.126) (::0.091)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.114) (::0.103)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.096) (::0.076)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.121) (::0.098)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.122) (::0.121)))
+          (IOPATH A1 Y (::0.126) (::0.121))
+          (IOPATH B1 Y (::0.115) (::0.124))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.167) (::0.118)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.095) (::0.069)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8647__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.187) (::0.151)))
+          (IOPATH A0 Y (::0.178) (::0.135))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.188) (::0.190)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.187) (::0.174)))
+          (IOPATH B0 Y (::0.188) (::0.174))
+          (IOPATH A1 Y (::0.168) (::0.140))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8648__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.164) (::0.174)))
+          (IOPATH A0 Y (::0.183) (::0.174))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.177) (::0.152)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.179) (::0.174)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.277) (::0.271)))
+          (IOPATH B0 Y (::0.277) (::0.271))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.162) (::0.137)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.257) (::0.163)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.162) (::0.150)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.274) (::0.212)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.250) (::0.169)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.252) (::0.198)))
+          (IOPATH A1 Y (::0.257) (::0.198))
+          (IOPATH B1 Y (::0.164) (::0.174))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.183) (::0.138)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.274) (::0.197)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8649__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.299) (::0.320)))
+          (IOPATH A0 Y (::0.182) (::0.181))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.177) (::0.159)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.178) (::0.181)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.148) (::0.160)))
+          (IOPATH B0 Y (::0.148) (::0.160))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.296) (::0.252)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.258) (::0.164)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.297) (::0.273)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.146) (::0.130)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.251) (::0.170)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.253) (::0.199)))
+          (IOPATH A1 Y (::0.258) (::0.199))
+          (IOPATH B1 Y (::0.299) (::0.320))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.182) (::0.147)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.146) (::0.121)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8650__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.168) (::0.177)))
+          (IOPATH A0 Y (::0.185) (::0.184))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.180) (::0.161)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.181) (::0.184)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.283) (::0.277)))
+          (IOPATH B0 Y (::0.283) (::0.277))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.166) (::0.140)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.262) (::0.167)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.166) (::0.154)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.280) (::0.219)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.255) (::0.173)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.257) (::0.202)))
+          (IOPATH A1 Y (::0.262) (::0.202))
+          (IOPATH B1 Y (::0.168) (::0.177))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.185) (::0.149)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.281) (::0.204)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8651__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.165) (::0.174)))
+          (IOPATH A0 Y (::0.248) (::0.223))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.242) (::0.197)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.244) (::0.223)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.278) (::0.272)))
+          (IOPATH B0 Y (::0.278) (::0.272))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.163) (::0.138)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.258) (::0.164)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.163) (::0.151)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.275) (::0.214)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.251) (::0.170)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.253) (::0.199)))
+          (IOPATH A1 Y (::0.258) (::0.199))
+          (IOPATH B1 Y (::0.165) (::0.174))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.248) (::0.188)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.276) (::0.199)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8652__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.162) (::0.182)))
+          (IOPATH A0 Y (::0.181) (::0.180))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.176) (::0.158)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.177) (::0.180)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.277) (::0.271)))
+          (IOPATH B0 Y (::0.277) (::0.271))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.161) (::0.145)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.257) (::0.163)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.161) (::0.158)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.274) (::0.212)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.250) (::0.169)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.252) (::0.198)))
+          (IOPATH A1 Y (::0.257) (::0.198))
+          (IOPATH B1 Y (::0.162) (::0.182))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.181) (::0.146)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.274) (::0.197)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8653__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.162) (::0.182)))
+          (IOPATH A0 Y (::0.182) (::0.180))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.176) (::0.158)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.178) (::0.180)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.277) (::0.271)))
+          (IOPATH B0 Y (::0.277) (::0.271))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.161) (::0.145)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.257) (::0.163)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.161) (::0.158)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.274) (::0.212)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.250) (::0.169)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.252) (::0.198)))
+          (IOPATH A1 Y (::0.257) (::0.198))
+          (IOPATH B1 Y (::0.162) (::0.182))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.182) (::0.147)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.274) (::0.197)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8654__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.164) (::0.174)))
+          (IOPATH A0 Y (::0.183) (::0.174))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.177) (::0.152)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.179) (::0.174)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.277) (::0.271)))
+          (IOPATH B0 Y (::0.277) (::0.271))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.162) (::0.137)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.257) (::0.163)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.162) (::0.150)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.274) (::0.212)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.250) (::0.169)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.252) (::0.198)))
+          (IOPATH A1 Y (::0.257) (::0.198))
+          (IOPATH B1 Y (::0.164) (::0.174))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.183) (::0.138)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.274) (::0.197)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8655__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.164) (::0.174)))
+          (IOPATH A0 Y (::0.183) (::0.174))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.177) (::0.152)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.179) (::0.174)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.277) (::0.271)))
+          (IOPATH B0 Y (::0.277) (::0.271))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.162) (::0.137)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.257) (::0.163)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.162) (::0.150)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.274) (::0.212)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.250) (::0.169)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.252) (::0.198)))
+          (IOPATH A1 Y (::0.257) (::0.198))
+          (IOPATH B1 Y (::0.164) (::0.174))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.183) (::0.138)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.274) (::0.197)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8656__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.164) (::0.174)))
+          (IOPATH A0 Y (::0.183) (::0.174))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.177) (::0.152)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.179) (::0.174)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.277) (::0.271)))
+          (IOPATH B0 Y (::0.277) (::0.271))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.162) (::0.137)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.257) (::0.163)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.162) (::0.150)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.274) (::0.212)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.250) (::0.169)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.252) (::0.198)))
+          (IOPATH A1 Y (::0.257) (::0.198))
+          (IOPATH B1 Y (::0.164) (::0.174))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.183) (::0.138)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.274) (::0.197)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8657__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.290) (::0.311)))
+          (IOPATH A0 Y (::0.178) (::0.170))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.172) (::0.148)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.174) (::0.170)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.200) (::0.196)))
+          (IOPATH B0 Y (::0.200) (::0.196))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.288) (::0.244)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.251) (::0.158)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.288) (::0.264)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.198) (::0.156)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.243) (::0.164)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.246) (::0.193)))
+          (IOPATH A1 Y (::0.251) (::0.193))
+          (IOPATH B1 Y (::0.290) (::0.311))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.178) (::0.135)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.198) (::0.146)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8659__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.186) (::0.149)))
+          (IOPATH A0 Y (::0.180) (::0.138))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.188) (::0.187)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.186) (::0.171)))
+          (IOPATH B0 Y (::0.188) (::0.171))
+          (IOPATH A1 Y (::0.174) (::0.146))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8660__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.186) (::0.151)))
+          (IOPATH A0 Y (::0.210) (::0.173))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.188) (::0.190)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.186) (::0.174)))
+          (IOPATH B0 Y (::0.188) (::0.174))
+          (IOPATH A1 Y (::0.192) (::0.174))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8661__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.186) (::0.151)))
+          (IOPATH A0 Y (::0.237) (::0.192))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.188) (::0.190)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.186) (::0.173)))
+          (IOPATH B0 Y (::0.188) (::0.173))
+          (IOPATH A1 Y (::0.213) (::0.199))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8662__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.145) (::0.124)))
+          (IOPATH A0 Y (::0.158) (::0.134))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.146) (::0.154)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.145) (::0.143)))
+          (IOPATH B0 Y (::0.146) (::0.143))
+          (IOPATH A1 Y (::0.168) (::0.134))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8663__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.161) (::0.172)))
+          (IOPATH A0 Y (::0.180) (::0.172))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.175) (::0.149)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.176) (::0.172)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.272) (::0.266)))
+          (IOPATH B0 Y (::0.272) (::0.266))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.160) (::0.135)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.254) (::0.160)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.160) (::0.148)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.269) (::0.208)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.246) (::0.166)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.248) (::0.195)))
+          (IOPATH A1 Y (::0.254) (::0.195))
+          (IOPATH B1 Y (::0.161) (::0.172))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.180) (::0.137)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.270) (::0.193)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8664__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.298) (::0.318)))
+          (IOPATH A0 Y (::0.274) (::0.222))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.267) (::0.196)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.269) (::0.222)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.147) (::0.159)))
+          (IOPATH B0 Y (::0.147) (::0.159))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.295) (::0.251)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.156) (::0.119)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.295) (::0.272)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.146) (::0.130)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.151) (::0.127)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.152) (::0.151)))
+          (IOPATH A1 Y (::0.156) (::0.151))
+          (IOPATH B1 Y (::0.298) (::0.318))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.274) (::0.186)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.145) (::0.120)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8665__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.104) (::0.126))
+          (IOPATH B Y (::0.096) (::0.114))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8666__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.195) (::0.154))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.164) (::0.154)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.177) (::0.173)))
+          (IOPATH B0 Y (::0.154) (::0.119))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.185) (::0.134)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.154) (::0.119)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.166) (::0.133)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.120) (::0.117)))
+          (IOPATH A1 Y (::0.205) (::0.173))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.201) (::0.135)))
+          (IOPATH B1 Y (::0.201) (::0.135))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.195) (::0.142)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.181) (::0.141)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.205) (::0.160)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.189) (::0.159)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.135) (::0.118)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8667__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.158) (::0.166)))
+          (IOPATH A0 Y (::0.180) (::0.169))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.175) (::0.147)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.177) (::0.169)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.147) (::0.146)))
+          (IOPATH B0 Y (::0.147) (::0.146))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.157) (::0.130)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.152) (::0.104)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.157) (::0.143)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.145) (::0.118)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.146) (::0.114)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.148) (::0.139)))
+          (IOPATH A1 Y (::0.152) (::0.139))
+          (IOPATH B1 Y (::0.158) (::0.166))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.180) (::0.133)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.145) (::0.109)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8668__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.158) (::0.166)))
+          (IOPATH A0 Y (::0.181) (::0.170))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.176) (::0.147)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.177) (::0.170)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.116) (::0.113)))
+          (IOPATH B0 Y (::0.116) (::0.113))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.157) (::0.130)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.152) (::0.104)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.157) (::0.143)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.115) (::0.089)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.146) (::0.114)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.148) (::0.139)))
+          (IOPATH A1 Y (::0.152) (::0.139))
+          (IOPATH B1 Y (::0.158) (::0.166))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.181) (::0.133)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.115) (::0.079)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8669__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.195) (::0.154))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.164) (::0.154)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.177) (::0.173)))
+          (IOPATH B0 Y (::0.123) (::0.084))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.185) (::0.134)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.123) (::0.084)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.166) (::0.133)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.089) (::0.083)))
+          (IOPATH A1 Y (::0.205) (::0.173))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.201) (::0.135)))
+          (IOPATH B1 Y (::0.201) (::0.135))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.195) (::0.142)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.181) (::0.141)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.205) (::0.160)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.189) (::0.159)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.105) (::0.083)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8670__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.164)))
+          (IOPATH A0 Y (::0.178) (::0.167))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.172) (::0.144)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.174) (::0.167)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.144) (::0.144)))
+          (IOPATH B0 Y (::0.144) (::0.144))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.128)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.149) (::0.103)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.141)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.142) (::0.116)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.144) (::0.112)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.145) (::0.137)))
+          (IOPATH A1 Y (::0.149) (::0.137))
+          (IOPATH B1 Y (::0.156) (::0.164))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.178) (::0.131)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.142) (::0.107)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8671__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.200) (::0.157))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.168) (::0.157)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.181) (::0.176)))
+          (IOPATH B0 Y (::0.158) (::0.122))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.190) (::0.137)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.158) (::0.122)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.170) (::0.137)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.120)))
+          (IOPATH A1 Y (::0.210) (::0.176))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.205) (::0.138)))
+          (IOPATH B1 Y (::0.205) (::0.138))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.200) (::0.145)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.186) (::0.144)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.210) (::0.163)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.163)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.139) (::0.121)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8672__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.173) (::0.124))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.137) (::0.124)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.155) (::0.148)))
+          (IOPATH B0 Y (::0.168) (::0.126))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.180) (::0.137)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.168) (::0.126)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.159) (::0.136)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.131) (::0.125)))
+          (IOPATH A1 Y (::0.188) (::0.148))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.195) (::0.138)))
+          (IOPATH B1 Y (::0.195) (::0.138))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.173) (::0.112)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.158) (::0.112)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.188) (::0.137)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.170) (::0.136)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.148) (::0.125)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8673__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.170) (::0.121))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.135) (::0.121)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.152) (::0.152)))
+          (IOPATH B0 Y (::0.183) (::0.124))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.218) (::0.161)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.183) (::0.124)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.196) (::0.161)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.147) (::0.123)))
+          (IOPATH A1 Y (::0.184) (::0.152))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.236) (::0.162)))
+          (IOPATH B1 Y (::0.236) (::0.162))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.170) (::0.110)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.156) (::0.109)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.184) (::0.140)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.166) (::0.140)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.163) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8674__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.130) (::0.132)))
+          (IOPATH A0 Y (::0.172) (::0.171))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.166) (::0.149)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.168) (::0.171)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.206) (::0.237)))
+          (IOPATH B0 Y (::0.206) (::0.237))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.128) (::0.096)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.225) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.128) (::0.110)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.204) (::0.187)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.218) (::0.150)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.220) (::0.176)))
+          (IOPATH A1 Y (::0.225) (::0.176))
+          (IOPATH B1 Y (::0.130) (::0.132))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.172) (::0.136)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.204) (::0.175)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8675__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.127) (::0.130)))
+          (IOPATH A0 Y (::0.170) (::0.169))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.164) (::0.147)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.166) (::0.169)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.160) (::0.155)))
+          (IOPATH B0 Y (::0.160) (::0.155))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.126) (::0.096)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.168) (::0.110)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.126) (::0.109)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.159) (::0.126)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.162) (::0.119)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.164) (::0.143)))
+          (IOPATH A1 Y (::0.168) (::0.143))
+          (IOPATH B1 Y (::0.127) (::0.130))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.170) (::0.135)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.158) (::0.117)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8676__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.132) (::0.147)))
+          (IOPATH A0 Y (::0.157) (::0.142))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.151) (::0.120)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.153) (::0.142)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.140) (::0.147)))
+          (IOPATH B0 Y (::0.140) (::0.147))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.131) (::0.113)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.162) (::0.121)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.131) (::0.124)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.138) (::0.117)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.156) (::0.125)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.158) (::0.149)))
+          (IOPATH A1 Y (::0.162) (::0.149))
+          (IOPATH B1 Y (::0.132) (::0.147))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.157) (::0.108)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.138) (::0.109)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8677__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.204) (::0.162))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.162)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.206) (::0.233)))
+          (IOPATH B0 Y (::0.249) (::0.188))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.161) (::0.127)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.249) (::0.188)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.140) (::0.127)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.204) (::0.186)))
+          (IOPATH A1 Y (::0.236) (::0.233))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.176) (::0.128)))
+          (IOPATH B1 Y (::0.176) (::0.128))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.204) (::0.151)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.190) (::0.150)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.236) (::0.216)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.218) (::0.214)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.224) (::0.186)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8678__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.186) (::0.151)))
+          (IOPATH A0 Y (::0.238) (::0.192))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.188) (::0.190)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.186) (::0.173)))
+          (IOPATH B0 Y (::0.188) (::0.173))
+          (IOPATH A1 Y (::0.216) (::0.205))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8679__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.123) (::0.150))
+          (IOPATH B Y (::0.116) (::0.140))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8680__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.177) (::0.142))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.150) (::0.142)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.164) (::0.160)))
+          (IOPATH B0 Y (::0.136) (::0.105))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.167) (::0.119)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.136) (::0.105)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.151) (::0.119)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.106) (::0.104)))
+          (IOPATH A1 Y (::0.187) (::0.160))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.182) (::0.120)))
+          (IOPATH B1 Y (::0.182) (::0.120))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.177) (::0.130)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.163) (::0.129)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.187) (::0.147)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.172) (::0.146)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.118) (::0.104)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8681__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.184) (::0.131))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.146) (::0.131)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.193) (::0.188)))
+          (IOPATH B0 Y (::0.174) (::0.133))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.206) (::0.150)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.174) (::0.133)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.183) (::0.149)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.135) (::0.132)))
+          (IOPATH A1 Y (::0.226) (::0.188))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.222) (::0.151)))
+          (IOPATH B1 Y (::0.222) (::0.151))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.184) (::0.120)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.169) (::0.119)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.226) (::0.175)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.208) (::0.174)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.154) (::0.132)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8682__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.182) (::0.188)))
+          (IOPATH A0 Y (::0.170) (::0.159))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.165) (::0.136)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.166) (::0.159)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.187) (::0.177)))
+          (IOPATH B0 Y (::0.187) (::0.177))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.149)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.193) (::0.127)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.164)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.185) (::0.147)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.188) (::0.138)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.190) (::0.164)))
+          (IOPATH A1 Y (::0.193) (::0.164))
+          (IOPATH B1 Y (::0.182) (::0.188))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.170) (::0.113)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.185) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8683__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.177) (::0.142))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.150) (::0.142)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.164) (::0.161)))
+          (IOPATH B0 Y (::0.106) (::0.073))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.168) (::0.120)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.106) (::0.073)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.152) (::0.120)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.077) (::0.072)))
+          (IOPATH A1 Y (::0.188) (::0.161))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.183) (::0.121)))
+          (IOPATH B1 Y (::0.183) (::0.121))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.177) (::0.130)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.164) (::0.129)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.188) (::0.148)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.173) (::0.147)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.089) (::0.072)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8684__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.119) (::0.145))
+          (IOPATH B Y (::0.112) (::0.134))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8685__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.179) (::0.184)))
+          (IOPATH A0 Y (::0.201) (::0.187))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.164)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.197) (::0.187)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.167) (::0.163)))
+          (IOPATH B0 Y (::0.167) (::0.163))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.178) (::0.145)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.172) (::0.118)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.178) (::0.160)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.134)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.167) (::0.130)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.168) (::0.156)))
+          (IOPATH A1 Y (::0.172) (::0.156))
+          (IOPATH B1 Y (::0.179) (::0.184))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.201) (::0.146)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.165) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8686__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.188) (::0.194)))
+          (IOPATH A0 Y (::0.206) (::0.194))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.201) (::0.171)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.202) (::0.194)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.315) (::0.307)))
+          (IOPATH B0 Y (::0.315) (::0.307))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.186) (::0.154)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.287) (::0.185)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.186) (::0.170)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.312) (::0.251)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.280) (::0.193)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.282) (::0.221)))
+          (IOPATH A1 Y (::0.287) (::0.221))
+          (IOPATH B1 Y (::0.188) (::0.194))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.206) (::0.154)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.313) (::0.233)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8687__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.223) (::0.172))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.186) (::0.172)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.198) (::0.192)))
+          (IOPATH B0 Y (::0.150) (::0.101))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.213) (::0.155)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.150) (::0.101)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.189) (::0.154)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.108) (::0.100)))
+          (IOPATH A1 Y (::0.232) (::0.192))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.229) (::0.156)))
+          (IOPATH B1 Y (::0.229) (::0.156))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.223) (::0.160)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.208) (::0.159)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.232) (::0.179)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.214) (::0.179)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.130) (::0.100)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8688__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.223) (::0.172))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.186) (::0.172)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.198) (::0.192)))
+          (IOPATH B0 Y (::0.181) (::0.138))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.213) (::0.155)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.181) (::0.138)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.189) (::0.154)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.140) (::0.136)))
+          (IOPATH A1 Y (::0.232) (::0.192))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.229) (::0.156)))
+          (IOPATH B1 Y (::0.229) (::0.156))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.223) (::0.160)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.208) (::0.159)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.232) (::0.179)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.214) (::0.179)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.160) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8689__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.197) (::0.138))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.156) (::0.138)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.203) (::0.196)))
+          (IOPATH B0 Y (::0.186) (::0.142))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.218) (::0.159)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.186) (::0.142)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.193) (::0.158)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.144) (::0.140)))
+          (IOPATH A1 Y (::0.238) (::0.196))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.235) (::0.160)))
+          (IOPATH B1 Y (::0.235) (::0.160))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.197) (::0.127)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.181) (::0.127)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.238) (::0.183)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.219) (::0.182)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.165) (::0.141)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8690__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.185) (::0.191)))
+          (IOPATH A0 Y (::0.203) (::0.192))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.198) (::0.169)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.200) (::0.192)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.311) (::0.303)))
+          (IOPATH B0 Y (::0.311) (::0.303))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.183) (::0.152)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.283) (::0.183)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.183) (::0.167)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.308) (::0.246)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.276) (::0.190)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.278) (::0.219)))
+          (IOPATH A1 Y (::0.283) (::0.219))
+          (IOPATH B1 Y (::0.185) (::0.191))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.203) (::0.152)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.308) (::0.229)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8691__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.160) (::0.171)))
+          (IOPATH A0 Y (::0.179) (::0.171))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.174) (::0.149)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.175) (::0.171)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.271) (::0.266)))
+          (IOPATH B0 Y (::0.271) (::0.266))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.159) (::0.135)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.253) (::0.160)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.159) (::0.148)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.268) (::0.207)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.245) (::0.166)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.247) (::0.195)))
+          (IOPATH A1 Y (::0.253) (::0.195))
+          (IOPATH B1 Y (::0.160) (::0.171))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.179) (::0.136)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.268) (::0.193)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8692__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.219) (::0.171))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.181) (::0.171)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.216) (::0.241)))
+          (IOPATH B0 Y (::0.270) (::0.208))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.182) (::0.135)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.270) (::0.208)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.157) (::0.134)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.221) (::0.206)))
+          (IOPATH A1 Y (::0.250) (::0.241))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.197) (::0.136)))
+          (IOPATH B1 Y (::0.197) (::0.136))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.219) (::0.159)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.204) (::0.158)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.250) (::0.225)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.231) (::0.224)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.244) (::0.206)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8693__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.197) (::0.138))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.156) (::0.138)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.198) (::0.212)))
+          (IOPATH B0 Y (::0.245) (::0.190))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.248) (::0.186)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.245) (::0.190)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.221) (::0.185)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.199) (::0.189)))
+          (IOPATH A1 Y (::0.233) (::0.212))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.266) (::0.187)))
+          (IOPATH B1 Y (::0.266) (::0.187))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.197) (::0.127)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.181) (::0.126)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.233) (::0.199)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.214) (::0.198)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.221) (::0.189)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8694__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.115) (::0.140))
+          (IOPATH B Y (::0.109) (::0.130))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8695__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.226) (::0.177))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.188) (::0.177)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.220) (::0.246)))
+          (IOPATH B0 Y (::0.276) (::0.213))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.247) (::0.186)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.276) (::0.213)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.221) (::0.185)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.226) (::0.212)))
+          (IOPATH A1 Y (::0.255) (::0.246))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.265) (::0.186)))
+          (IOPATH B1 Y (::0.265) (::0.186))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.226) (::0.165)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.211) (::0.164)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.255) (::0.230)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.236) (::0.228)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.250) (::0.212)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8696__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.192) (::0.126))
+          (IOPATH B Y (::0.136) (::0.074))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8697__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.226) (::0.177))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.188) (::0.177)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.172) (::0.169)))
+          (IOPATH B0 Y (::0.208) (::0.143))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.182) (::0.143)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.208) (::0.143)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.156) (::0.142)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.167) (::0.141)))
+          (IOPATH A1 Y (::0.210) (::0.169))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.198) (::0.144)))
+          (IOPATH B1 Y (::0.198) (::0.144))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.226) (::0.165)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.211) (::0.165)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.210) (::0.158)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.190) (::0.157)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.187) (::0.142)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8698__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.119) (::0.145))
+          (IOPATH B Y (::0.112) (::0.134))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8699__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.181) (::0.188)))
+          (IOPATH A0 Y (::0.200) (::0.189))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.194) (::0.166)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.196) (::0.189)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.194) (::0.186)))
+          (IOPATH B0 Y (::0.194) (::0.186))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.149)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.204) (::0.147)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.164)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.192) (::0.155)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.199) (::0.156)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.201) (::0.181)))
+          (IOPATH A1 Y (::0.204) (::0.181))
+          (IOPATH B1 Y (::0.181) (::0.188))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.200) (::0.149)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.192) (::0.144)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8700__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.184) (::0.183)))
+          (IOPATH A0 Y (::0.202) (::0.186))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.162)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.198) (::0.186)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.187) (::0.187)))
+          (IOPATH B0 Y (::0.187) (::0.187))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.182) (::0.143)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.208) (::0.155)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.182) (::0.159)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.185) (::0.156)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.203) (::0.164)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.204) (::0.189)))
+          (IOPATH A1 Y (::0.208) (::0.189))
+          (IOPATH B1 Y (::0.184) (::0.183))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.202) (::0.144)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.185) (::0.145)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8701__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.202) (::0.194)))
+          (IOPATH A0 Y (::0.173) (::0.163))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.167) (::0.139)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.169) (::0.163)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.231) (::0.259)))
+          (IOPATH B0 Y (::0.231) (::0.259))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.200) (::0.155)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.239) (::0.157)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.201) (::0.170)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.229) (::0.213)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.233) (::0.165)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.235) (::0.191)))
+          (IOPATH A1 Y (::0.239) (::0.191))
+          (IOPATH B1 Y (::0.202) (::0.194))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.173) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.229) (::0.198)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8702__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.224) (::0.172))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.186) (::0.172)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.199) (::0.192)))
+          (IOPATH B0 Y (::0.233) (::0.176))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.213) (::0.155)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.233) (::0.176)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.189) (::0.155)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.189) (::0.175)))
+          (IOPATH A1 Y (::0.233) (::0.192))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.230) (::0.156)))
+          (IOPATH B1 Y (::0.230) (::0.156))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.224) (::0.160)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.209) (::0.160)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.233) (::0.180)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.214) (::0.179)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.210) (::0.175)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8703__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.177) (::0.178)))
+          (IOPATH A0 Y (::0.196) (::0.181))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.190) (::0.158)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.192) (::0.181)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.181) (::0.182)))
+          (IOPATH B0 Y (::0.181) (::0.182))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.176) (::0.140)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.202) (::0.151)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.176) (::0.155)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.179) (::0.151)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.196) (::0.159)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.198) (::0.184)))
+          (IOPATH A1 Y (::0.202) (::0.184))
+          (IOPATH B1 Y (::0.177) (::0.178))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.196) (::0.140)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.179) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8704__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.191) (::0.195)))
+          (IOPATH A0 Y (::0.210) (::0.194))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.205) (::0.172)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.206) (::0.194)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.228) (::0.256)))
+          (IOPATH B0 Y (::0.228) (::0.256))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.190) (::0.157)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.237) (::0.155)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.190) (::0.171)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.226) (::0.210)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.231) (::0.164)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.232) (::0.189)))
+          (IOPATH A1 Y (::0.237) (::0.189))
+          (IOPATH B1 Y (::0.191) (::0.195))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.210) (::0.156)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.226) (::0.196)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8705__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.181) (::0.188)))
+          (IOPATH A0 Y (::0.195) (::0.191))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.189) (::0.168)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.191) (::0.191)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.194) (::0.186)))
+          (IOPATH B0 Y (::0.194) (::0.186))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.149)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.204) (::0.147)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.164)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.192) (::0.155)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.199) (::0.156)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.201) (::0.181)))
+          (IOPATH A1 Y (::0.204) (::0.181))
+          (IOPATH B1 Y (::0.181) (::0.188))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.195) (::0.152)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.192) (::0.144)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8706__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.224) (::0.175))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.185) (::0.175)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.218) (::0.243)))
+          (IOPATH B0 Y (::0.272) (::0.210))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.179) (::0.140)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.272) (::0.210)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.154) (::0.140)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.223) (::0.208)))
+          (IOPATH A1 Y (::0.252) (::0.243))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.195) (::0.141)))
+          (IOPATH B1 Y (::0.195) (::0.141))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.224) (::0.163)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.208) (::0.162)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.252) (::0.227)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.233) (::0.226)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.246) (::0.208)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8707__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.204) (::0.159))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.159)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.184) (::0.179)))
+          (IOPATH B0 Y (::0.162) (::0.124))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.194) (::0.140)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.162) (::0.124)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.173) (::0.140)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.126) (::0.123)))
+          (IOPATH A1 Y (::0.214) (::0.179))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.209) (::0.141)))
+          (IOPATH B1 Y (::0.209) (::0.141))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.204) (::0.147)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.189) (::0.147)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.214) (::0.166)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.196) (::0.165)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.143) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8708__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.182) (::0.188)))
+          (IOPATH A0 Y (::0.170) (::0.159))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.165) (::0.136)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.166) (::0.159)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.194) (::0.186)))
+          (IOPATH B0 Y (::0.194) (::0.186))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.149)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.205) (::0.147)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.164)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.192) (::0.155)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.200) (::0.156)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.201) (::0.181)))
+          (IOPATH A1 Y (::0.205) (::0.181))
+          (IOPATH B1 Y (::0.182) (::0.188))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.170) (::0.112)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.192) (::0.144)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8709__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.239) (::0.184))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.209) (::0.184)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.183) (::0.178)))
+          (IOPATH B0 Y (::0.160) (::0.123))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.192) (::0.139)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.160) (::0.123)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.172) (::0.138)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.125) (::0.122)))
+          (IOPATH A1 Y (::0.212) (::0.178))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.208) (::0.140)))
+          (IOPATH B1 Y (::0.208) (::0.140))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.239) (::0.170)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.225) (::0.170)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.212) (::0.165)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.195) (::0.164)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.141) (::0.122)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8710__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.119) (::0.145))
+          (IOPATH B Y (::0.115) (::0.136))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8711__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.230) (::0.228)))
+          (IOPATH A0 Y (::0.224) (::0.209))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.219) (::0.186)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.220) (::0.209)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.345) (::0.335)))
+          (IOPATH B0 Y (::0.345) (::0.335))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.228) (::0.186)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.310) (::0.202)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.228) (::0.203)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.342) (::0.280)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.303) (::0.212)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.305) (::0.240)))
+          (IOPATH A1 Y (::0.310) (::0.240))
+          (IOPATH B1 Y (::0.230) (::0.228))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.224) (::0.166)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.343) (::0.261)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8712__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.197) (::0.157))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.157)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.141) (::0.144)))
+          (IOPATH B0 Y (::0.163) (::0.111))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.191) (::0.137)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.163) (::0.111)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.174) (::0.137)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.132) (::0.110)))
+          (IOPATH A1 Y (::0.167) (::0.144))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.209) (::0.138)))
+          (IOPATH B1 Y (::0.209) (::0.138))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.197) (::0.144)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.184) (::0.143)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.167) (::0.132)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.151) (::0.131)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.144) (::0.110)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8713__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.176) (::0.144))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.149) (::0.144)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.182) (::0.208)))
+          (IOPATH B0 Y (::0.215) (::0.156))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.191) (::0.139)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.215) (::0.156)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.174) (::0.138)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.174) (::0.154)))
+          (IOPATH A1 Y (::0.207) (::0.208))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.209) (::0.140)))
+          (IOPATH B1 Y (::0.209) (::0.140))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.176) (::0.132)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.163) (::0.132)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.207) (::0.189)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.191) (::0.188)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.190) (::0.154)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8714)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.098) (::0.085))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8715)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.096) (::0.095))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8716)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.085) (::0.068))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8717)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.098) (::0.088))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8718)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.080) (::0.080))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8719)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.084) (::0.076))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8720)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.085) (::0.068))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8721__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.154) (::0.158)))
+          (IOPATH A0 Y (::0.173) (::0.161))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.167) (::0.138)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.169) (::0.161)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.157) (::0.162)))
+          (IOPATH B0 Y (::0.157) (::0.162))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.152) (::0.123)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.179) (::0.134)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.152) (::0.136)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.156) (::0.131)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.174) (::0.140)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.175) (::0.164)))
+          (IOPATH A1 Y (::0.179) (::0.164))
+          (IOPATH B1 Y (::0.154) (::0.158))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.173) (::0.124)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.155) (::0.122)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8722__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.198) (::0.159))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.166) (::0.159)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.200) (::0.228)))
+          (IOPATH B0 Y (::0.241) (::0.181))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.154) (::0.123)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.241) (::0.181)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.135) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.197) (::0.179)))
+          (IOPATH A1 Y (::0.229) (::0.228))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.169) (::0.124)))
+          (IOPATH B1 Y (::0.169) (::0.124))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.198) (::0.147)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.184) (::0.146)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.229) (::0.210)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.212) (::0.209)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.216) (::0.179)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8723__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.163) (::0.166)))
+          (IOPATH A0 Y (::0.182) (::0.168))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.176) (::0.146)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.178) (::0.168)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.166) (::0.170)))
+          (IOPATH B0 Y (::0.166) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.161) (::0.129)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.188) (::0.140)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.161) (::0.143)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.165) (::0.139)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.182) (::0.147)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.184) (::0.172)))
+          (IOPATH A1 Y (::0.188) (::0.172))
+          (IOPATH B1 Y (::0.163) (::0.166))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.182) (::0.130)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.164) (::0.129)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8724__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.163) (::0.166)))
+          (IOPATH A0 Y (::0.152) (::0.145))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.147) (::0.122)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.148) (::0.145)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.166) (::0.170)))
+          (IOPATH B0 Y (::0.166) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.161) (::0.129)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.188) (::0.140)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.162) (::0.143)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.165) (::0.139)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.182) (::0.147)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.184) (::0.172)))
+          (IOPATH A1 Y (::0.188) (::0.172))
+          (IOPATH B1 Y (::0.163) (::0.166))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.152) (::0.102)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.164) (::0.129)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8725__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.154) (::0.158)))
+          (IOPATH A0 Y (::0.143) (::0.137))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.138) (::0.115)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.139) (::0.137)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.157) (::0.162)))
+          (IOPATH B0 Y (::0.157) (::0.162))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.152) (::0.123)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.179) (::0.134)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.152) (::0.135)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.156) (::0.131)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.174) (::0.140)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.175) (::0.164)))
+          (IOPATH A1 Y (::0.179) (::0.164))
+          (IOPATH B1 Y (::0.154) (::0.158))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.143) (::0.096)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.155) (::0.122)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8726__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.139) (::0.141)))
+          (IOPATH A0 Y (::0.205) (::0.180))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.200) (::0.157)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.201) (::0.180)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.210) (::0.238)))
+          (IOPATH B0 Y (::0.210) (::0.238))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.137) (::0.105)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.221) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.138) (::0.119)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.208) (::0.190)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.151)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.217) (::0.176)))
+          (IOPATH A1 Y (::0.221) (::0.176))
+          (IOPATH B1 Y (::0.139) (::0.141))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.205) (::0.144)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.208) (::0.178)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8727__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.199) (::0.159))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.167) (::0.159)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.201) (::0.228)))
+          (IOPATH B0 Y (::0.243) (::0.182))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.156) (::0.124)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.243) (::0.182)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.136) (::0.123)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.198) (::0.180)))
+          (IOPATH A1 Y (::0.230) (::0.228))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.171) (::0.125)))
+          (IOPATH B1 Y (::0.171) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.199) (::0.147)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.185) (::0.147)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.230) (::0.211)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.213) (::0.210)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.218) (::0.181)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8728__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.175) (::0.124))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.139) (::0.124)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.206) (::0.233)))
+          (IOPATH B0 Y (::0.249) (::0.188))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.161) (::0.127)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.249) (::0.188)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.140) (::0.127)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.204) (::0.186)))
+          (IOPATH A1 Y (::0.236) (::0.233))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.176) (::0.128)))
+          (IOPATH B1 Y (::0.176) (::0.128))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.175) (::0.113)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.160) (::0.112)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.236) (::0.216)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.218) (::0.214)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.224) (::0.186)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8729__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.162) (::0.171)))
+          (IOPATH A0 Y (::0.181) (::0.172))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.175) (::0.150)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.177) (::0.172)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.211) (::0.242)))
+          (IOPATH B0 Y (::0.211) (::0.242))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.160) (::0.135)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.230) (::0.148)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.160) (::0.148)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.209) (::0.193)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.223) (::0.154)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.225) (::0.180)))
+          (IOPATH A1 Y (::0.230) (::0.180))
+          (IOPATH B1 Y (::0.162) (::0.171))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.181) (::0.136)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.209) (::0.180)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8730__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.193) (::0.156))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.162) (::0.156)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.173) (::0.188)))
+          (IOPATH B0 Y (::0.208) (::0.158))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.150) (::0.120)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.208) (::0.158)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.120)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.169) (::0.156)))
+          (IOPATH A1 Y (::0.201) (::0.188))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.164) (::0.121)))
+          (IOPATH B1 Y (::0.164) (::0.121))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.193) (::0.144)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.179) (::0.143)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.201) (::0.174)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.185) (::0.173)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.186) (::0.156)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8731__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.165) (::0.174)))
+          (IOPATH A0 Y (::0.183) (::0.174))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.178) (::0.152)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.179) (::0.174)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.169) (::0.163)))
+          (IOPATH B0 Y (::0.169) (::0.163))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.163) (::0.137)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.180) (::0.120)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.163) (::0.150)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.168) (::0.133)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.174) (::0.129)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.176) (::0.153)))
+          (IOPATH A1 Y (::0.180) (::0.153))
+          (IOPATH B1 Y (::0.165) (::0.174))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.183) (::0.138)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8732__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.173)))
+          (IOPATH A0 Y (::0.179) (::0.164))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.173) (::0.141)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.175) (::0.164)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.165) (::0.159)))
+          (IOPATH B0 Y (::0.165) (::0.159))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.137)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.173) (::0.114)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.150)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.164) (::0.130)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.167) (::0.122)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.169) (::0.147)))
+          (IOPATH A1 Y (::0.173) (::0.147))
+          (IOPATH B1 Y (::0.156) (::0.173))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.179) (::0.126)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.164) (::0.121)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8733__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.162) (::0.117))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.129) (::0.117)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.147) (::0.142)))
+          (IOPATH B0 Y (::0.157) (::0.119))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.119) (::0.086)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.157) (::0.119)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.100) (::0.086)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.117)))
+          (IOPATH A1 Y (::0.177) (::0.142))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.134) (::0.087)))
+          (IOPATH B1 Y (::0.134) (::0.087))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.162) (::0.106)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.148) (::0.105)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.177) (::0.130)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.160) (::0.129)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.138) (::0.118)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8734__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.182) (::0.178)))
+          (IOPATH A0 Y (::0.202) (::0.177))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.155)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.198) (::0.177)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.207) (::0.234)))
+          (IOPATH B0 Y (::0.207) (::0.234))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.141)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.218) (::0.142)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.181) (::0.154)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.204) (::0.186)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.211) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.213) (::0.174)))
+          (IOPATH A1 Y (::0.218) (::0.174))
+          (IOPATH B1 Y (::0.182) (::0.178))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.202) (::0.142)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.204) (::0.174)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8735__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.161) (::0.170)))
+          (IOPATH A0 Y (::0.149) (::0.142))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.144) (::0.119)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.146) (::0.142)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.165) (::0.159)))
+          (IOPATH B0 Y (::0.165) (::0.159))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.159) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.173) (::0.114)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.159) (::0.147)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.164) (::0.130)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.167) (::0.122)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.169) (::0.147)))
+          (IOPATH A1 Y (::0.173) (::0.147))
+          (IOPATH B1 Y (::0.161) (::0.170))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.149) (::0.100)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.164) (::0.121)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8736__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.161) (::0.170)))
+          (IOPATH A0 Y (::0.150) (::0.142))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.144) (::0.119)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.146) (::0.142)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.210) (::0.240)))
+          (IOPATH B0 Y (::0.210) (::0.240))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.159) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.228) (::0.146)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.159) (::0.147)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.207) (::0.191)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.222) (::0.153)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.224) (::0.179)))
+          (IOPATH A1 Y (::0.228) (::0.179))
+          (IOPATH B1 Y (::0.161) (::0.170))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.150) (::0.100)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.207) (::0.178)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8737__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.172) (::0.125))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.137) (::0.125)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.158) (::0.159)))
+          (IOPATH B0 Y (::0.186) (::0.128))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.177) (::0.134)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.186) (::0.128)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.158) (::0.134)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.149) (::0.126)))
+          (IOPATH A1 Y (::0.190) (::0.159))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.192) (::0.135)))
+          (IOPATH B1 Y (::0.192) (::0.135))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.172) (::0.114)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.157) (::0.113)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.190) (::0.147)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.172) (::0.146)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.166) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8738__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.204) (::0.162))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.162)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.202) (::0.226)))
+          (IOPATH B0 Y (::0.249) (::0.188))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.161) (::0.127)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.249) (::0.188)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.140) (::0.127)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.203) (::0.186)))
+          (IOPATH A1 Y (::0.232) (::0.226))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.176) (::0.128)))
+          (IOPATH B1 Y (::0.176) (::0.128))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.204) (::0.151)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.190) (::0.150)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.232) (::0.210)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.215) (::0.208)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.224) (::0.186)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8739__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.163) (::0.166)))
+          (IOPATH A0 Y (::0.152) (::0.145))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.147) (::0.122)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.148) (::0.145)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.166) (::0.170)))
+          (IOPATH B0 Y (::0.166) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.161) (::0.129)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.188) (::0.140)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.162) (::0.143)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.165) (::0.139)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.182) (::0.147)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.184) (::0.172)))
+          (IOPATH A1 Y (::0.188) (::0.172))
+          (IOPATH B1 Y (::0.163) (::0.166))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.152) (::0.102)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.164) (::0.129)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8740__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.130) (::0.132)))
+          (IOPATH A0 Y (::0.147) (::0.140))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.142) (::0.117)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.143) (::0.140)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.206) (::0.237)))
+          (IOPATH B0 Y (::0.206) (::0.237))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.128) (::0.096)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.225) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.128) (::0.110)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.204) (::0.187)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.218) (::0.150)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.220) (::0.176)))
+          (IOPATH A1 Y (::0.225) (::0.176))
+          (IOPATH B1 Y (::0.130) (::0.132))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.147) (::0.098)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.204) (::0.175)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8741__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.161) (::0.170)))
+          (IOPATH A0 Y (::0.179) (::0.171))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.174) (::0.149)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.175) (::0.171)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.210) (::0.240)))
+          (IOPATH B0 Y (::0.210) (::0.240))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.159) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.228) (::0.146)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.159) (::0.147)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.207) (::0.191)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.222) (::0.153)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.224) (::0.179)))
+          (IOPATH A1 Y (::0.228) (::0.179))
+          (IOPATH B1 Y (::0.161) (::0.170))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.179) (::0.135)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.207) (::0.178)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8742__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.151) (::0.120))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.130) (::0.120)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.152) (::0.174)))
+          (IOPATH B0 Y (::0.173) (::0.113))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.108) (::0.085)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.173) (::0.113)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.098) (::0.084)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.136) (::0.111)))
+          (IOPATH A1 Y (::0.172) (::0.174))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.122) (::0.086)))
+          (IOPATH B1 Y (::0.122) (::0.086))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.151) (::0.107)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.138) (::0.106)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.172) (::0.153)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.157) (::0.152)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.148) (::0.111)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8743__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.226) (::0.176))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.187) (::0.176)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.220) (::0.244)))
+          (IOPATH B0 Y (::0.276) (::0.212))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.182) (::0.142)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.276) (::0.212)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.156) (::0.141)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.226) (::0.210)))
+          (IOPATH A1 Y (::0.254) (::0.244))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.198) (::0.143)))
+          (IOPATH B1 Y (::0.198) (::0.143))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.226) (::0.164)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.211) (::0.164)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.254) (::0.228)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.236) (::0.227)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.249) (::0.210)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8744__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.194) (::0.156))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.162) (::0.156)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.193) (::0.217)))
+          (IOPATH B0 Y (::0.236) (::0.176))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.150) (::0.120)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.236) (::0.176)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.120)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.192) (::0.174)))
+          (IOPATH A1 Y (::0.221) (::0.217))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.165) (::0.121)))
+          (IOPATH B1 Y (::0.165) (::0.121))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.194) (::0.144)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.179) (::0.143)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.221) (::0.200)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.204) (::0.199)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.210) (::0.174)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8745__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.186) (::0.191)))
+          (IOPATH A0 Y (::0.204) (::0.192))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.199) (::0.169)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.200) (::0.192)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.241) (::0.273)))
+          (IOPATH B0 Y (::0.241) (::0.273))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.152)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.257) (::0.166)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.167)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.239) (::0.225)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.251) (::0.175)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.252) (::0.202)))
+          (IOPATH A1 Y (::0.257) (::0.202))
+          (IOPATH B1 Y (::0.186) (::0.191))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.204) (::0.151)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.239) (::0.210)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8746__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.155)))
+          (IOPATH A0 Y (::0.204) (::0.192))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.199) (::0.169)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.200) (::0.192)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.191) (::0.180)))
+          (IOPATH B0 Y (::0.191) (::0.180))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.115)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.200) (::0.133)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.156) (::0.132)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.189) (::0.150)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.195) (::0.145)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.197) (::0.170)))
+          (IOPATH A1 Y (::0.200) (::0.170))
+          (IOPATH B1 Y (::0.157) (::0.155))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.204) (::0.151)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.189) (::0.139)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8747__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.202) (::0.195)))
+          (IOPATH A0 Y (::0.173) (::0.163))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.167) (::0.139)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.169) (::0.163)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.231) (::0.259)))
+          (IOPATH B0 Y (::0.231) (::0.259))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.201) (::0.156)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.239) (::0.157)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.201) (::0.171)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.229) (::0.213)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.233) (::0.165)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.235) (::0.191)))
+          (IOPATH A1 Y (::0.239) (::0.191))
+          (IOPATH B1 Y (::0.202) (::0.195))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.173) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.229) (::0.198)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8748__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.149) (::0.149)))
+          (IOPATH A0 Y (::0.195) (::0.181))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.190) (::0.158)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.192) (::0.181)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.181) (::0.182)))
+          (IOPATH B0 Y (::0.181) (::0.182))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.147) (::0.110)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.202) (::0.151)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.148) (::0.126)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.179) (::0.151)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.196) (::0.159)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.198) (::0.184)))
+          (IOPATH A1 Y (::0.202) (::0.184))
+          (IOPATH B1 Y (::0.149) (::0.149))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.195) (::0.140)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.179) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8749__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.206) (::0.198)))
+          (IOPATH A0 Y (::0.177) (::0.166))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.171) (::0.143)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.173) (::0.166)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.236) (::0.264)))
+          (IOPATH B0 Y (::0.236) (::0.264))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.205) (::0.158)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.244) (::0.160)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.205) (::0.174)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.234) (::0.218)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.238) (::0.169)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.240) (::0.195)))
+          (IOPATH A1 Y (::0.244) (::0.195))
+          (IOPATH B1 Y (::0.206) (::0.198))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.177) (::0.119)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.234) (::0.203)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8750__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.186) (::0.192)))
+          (IOPATH A0 Y (::0.204) (::0.192))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.199) (::0.169)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.200) (::0.192)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.241) (::0.273)))
+          (IOPATH B0 Y (::0.241) (::0.273))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.152)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.257) (::0.166)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.168)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.239) (::0.225)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.251) (::0.175)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.252) (::0.202)))
+          (IOPATH A1 Y (::0.257) (::0.202))
+          (IOPATH B1 Y (::0.186) (::0.192))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.204) (::0.151)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.239) (::0.210)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8751__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.182) (::0.188)))
+          (IOPATH A0 Y (::0.170) (::0.159))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.165) (::0.136)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.166) (::0.159)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.187) (::0.176)))
+          (IOPATH B0 Y (::0.187) (::0.176))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.149)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.196) (::0.131)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.164)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.185) (::0.147)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.191) (::0.142)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.167)))
+          (IOPATH A1 Y (::0.196) (::0.167))
+          (IOPATH B1 Y (::0.182) (::0.188))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.170) (::0.113)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.185) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8752__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.195) (::0.137))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.154) (::0.137)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.172) (::0.162)))
+          (IOPATH B0 Y (::0.189) (::0.141))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.180) (::0.137)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.189) (::0.141)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.155) (::0.136)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.147) (::0.139)))
+          (IOPATH A1 Y (::0.209) (::0.162))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.196) (::0.138)))
+          (IOPATH B1 Y (::0.196) (::0.138))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.195) (::0.126)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.180) (::0.125)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.209) (::0.150)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.190) (::0.150)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.168) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8753__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.228) (::0.175))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.190) (::0.175)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.221) (::0.250)))
+          (IOPATH B0 Y (::0.272) (::0.210))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.178) (::0.140)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.272) (::0.210)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.154) (::0.140)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.223) (::0.208)))
+          (IOPATH A1 Y (::0.255) (::0.250))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.194) (::0.141)))
+          (IOPATH B1 Y (::0.194) (::0.141))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.228) (::0.163)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.212) (::0.163)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.255) (::0.234)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.236) (::0.232)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.246) (::0.208)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8754__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.182) (::0.188)))
+          (IOPATH A0 Y (::0.200) (::0.189))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.195) (::0.166)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.196) (::0.189)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.236) (::0.268)))
+          (IOPATH B0 Y (::0.236) (::0.268))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.149)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.252) (::0.163)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.164)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.234) (::0.220)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.246) (::0.171)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.248) (::0.198)))
+          (IOPATH A1 Y (::0.252) (::0.198))
+          (IOPATH B1 Y (::0.182) (::0.188))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.200) (::0.149)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.234) (::0.205)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8755__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.138))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.155) (::0.138)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.198) (::0.212)))
+          (IOPATH B0 Y (::0.244) (::0.190))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.181) (::0.142)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.244) (::0.190)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.156) (::0.142)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.198) (::0.188)))
+          (IOPATH A1 Y (::0.233) (::0.212))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.197) (::0.143)))
+          (IOPATH B1 Y (::0.197) (::0.143))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.126)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.181) (::0.126)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.233) (::0.198)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.214) (::0.198)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.220) (::0.188)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8756__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.112) (::0.130)))
+          (IOPATH A0 Y (::0.132) (::0.131))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.126) (::0.110)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.128) (::0.131)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.119) (::0.125)))
+          (IOPATH B0 Y (::0.119) (::0.125))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.110) (::0.098)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.136) (::0.096)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.110) (::0.107)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.116) (::0.091)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.130) (::0.099)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.132) (::0.123)))
+          (IOPATH A1 Y (::0.136) (::0.123))
+          (IOPATH B1 Y (::0.112) (::0.130))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.132) (::0.103)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.116) (::0.085)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8757__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.182) (::0.188)))
+          (IOPATH A0 Y (::0.200) (::0.189))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.194) (::0.166)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.196) (::0.189)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.194) (::0.186)))
+          (IOPATH B0 Y (::0.194) (::0.186))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.149)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.204) (::0.147)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.164)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.192) (::0.155)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.199) (::0.156)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.201) (::0.181)))
+          (IOPATH A1 Y (::0.204) (::0.181))
+          (IOPATH B1 Y (::0.182) (::0.188))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.200) (::0.149)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.192) (::0.144)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8758__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.194) (::0.198)))
+          (IOPATH A0 Y (::0.212) (::0.196))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.207) (::0.173)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.209) (::0.196)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.231) (::0.259)))
+          (IOPATH B0 Y (::0.231) (::0.259))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.192) (::0.158)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.239) (::0.157)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.192) (::0.173)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.229) (::0.213)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.233) (::0.165)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.235) (::0.191)))
+          (IOPATH A1 Y (::0.239) (::0.191))
+          (IOPATH B1 Y (::0.194) (::0.198))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.212) (::0.158)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.229) (::0.198)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8759__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.208) (::0.198)))
+          (IOPATH A0 Y (::0.227) (::0.198))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.221) (::0.175)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.223) (::0.198)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.237) (::0.265)))
+          (IOPATH B0 Y (::0.237) (::0.265))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.206) (::0.159)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.245) (::0.161)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.206) (::0.174)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.235) (::0.219)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.239) (::0.170)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.241) (::0.196)))
+          (IOPATH A1 Y (::0.245) (::0.196))
+          (IOPATH B1 Y (::0.208) (::0.198))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.227) (::0.158)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.235) (::0.204)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8760__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.184) (::0.184)))
+          (IOPATH A0 Y (::0.202) (::0.186))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.197) (::0.162)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.199) (::0.186)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.188) (::0.187)))
+          (IOPATH B0 Y (::0.188) (::0.187))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.182) (::0.144)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.208) (::0.155)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.183) (::0.160)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.186) (::0.156)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.203) (::0.164)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.205) (::0.190)))
+          (IOPATH A1 Y (::0.208) (::0.190))
+          (IOPATH B1 Y (::0.184) (::0.184))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.202) (::0.144)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.186) (::0.145)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8761__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.221) (::0.174))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.184) (::0.174)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.220) (::0.248)))
+          (IOPATH B0 Y (::0.270) (::0.208))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.177) (::0.139)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.270) (::0.208)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.153) (::0.139)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.221) (::0.206)))
+          (IOPATH A1 Y (::0.253) (::0.248))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.193) (::0.140)))
+          (IOPATH B1 Y (::0.193) (::0.140))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.221) (::0.162)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.206) (::0.161)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.253) (::0.232)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.234) (::0.230)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.244) (::0.206)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8762__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.171) (::0.121))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.136) (::0.121)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.199) (::0.223)))
+          (IOPATH B0 Y (::0.244) (::0.183))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.157) (::0.125)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.244) (::0.183)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.137) (::0.124)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.199) (::0.181)))
+          (IOPATH A1 Y (::0.228) (::0.223))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.172) (::0.125)))
+          (IOPATH B1 Y (::0.172) (::0.125))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.171) (::0.110)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.156) (::0.110)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.228) (::0.206)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.211) (::0.205)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.219) (::0.182)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8763__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.179) (::0.186)))
+          (IOPATH A0 Y (::0.198) (::0.187))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.192) (::0.164)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.194) (::0.187)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.184) (::0.175)))
+          (IOPATH B0 Y (::0.184) (::0.175))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.177) (::0.147)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.194) (::0.129)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.178) (::0.162)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.182) (::0.145)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.188) (::0.140)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.190) (::0.165)))
+          (IOPATH A1 Y (::0.194) (::0.165))
+          (IOPATH B1 Y (::0.179) (::0.186))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.198) (::0.147)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.182) (::0.134)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8764__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.186) (::0.191)))
+          (IOPATH A0 Y (::0.204) (::0.192))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.199) (::0.169)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.200) (::0.192)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.241) (::0.273)))
+          (IOPATH B0 Y (::0.241) (::0.273))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.152)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.257) (::0.166)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.167)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.239) (::0.225)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.251) (::0.175)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.252) (::0.202)))
+          (IOPATH A1 Y (::0.257) (::0.202))
+          (IOPATH B1 Y (::0.186) (::0.191))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.204) (::0.151)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.239) (::0.210)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8765__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.179) (::0.186)))
+          (IOPATH A0 Y (::0.168) (::0.158))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.162) (::0.134)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.164) (::0.158)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.192) (::0.185)))
+          (IOPATH B0 Y (::0.192) (::0.185))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.177) (::0.147)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.202) (::0.146)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.178) (::0.162)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.190) (::0.153)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.197) (::0.154)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.198) (::0.179)))
+          (IOPATH A1 Y (::0.202) (::0.179))
+          (IOPATH B1 Y (::0.179) (::0.186))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.168) (::0.111)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.190) (::0.142)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8766__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.186) (::0.191)))
+          (IOPATH A0 Y (::0.204) (::0.192))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.199) (::0.169)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.200) (::0.192)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.198) (::0.190)))
+          (IOPATH B0 Y (::0.198) (::0.190))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.152)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.209) (::0.150)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.167)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.197) (::0.158)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.204) (::0.159)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.205) (::0.184)))
+          (IOPATH A1 Y (::0.209) (::0.184))
+          (IOPATH B1 Y (::0.186) (::0.191))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.204) (::0.151)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.196) (::0.147)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8767__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.226) (::0.177))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.188) (::0.177)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.172) (::0.169)))
+          (IOPATH B0 Y (::0.208) (::0.143))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.182) (::0.143)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.208) (::0.143)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.156) (::0.142)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.167) (::0.141)))
+          (IOPATH A1 Y (::0.210) (::0.169))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.198) (::0.144)))
+          (IOPATH B1 Y (::0.198) (::0.144))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.226) (::0.165)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.211) (::0.165)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.210) (::0.158)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.190) (::0.157)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.187) (::0.142)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8768__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.221) (::0.173))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.190) (::0.173)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.159) (::0.159)))
+          (IOPATH B0 Y (::0.186) (::0.128))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.178) (::0.135)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.186) (::0.128)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.158) (::0.134)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.150) (::0.127)))
+          (IOPATH A1 Y (::0.190) (::0.159))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.193) (::0.136)))
+          (IOPATH B1 Y (::0.193) (::0.136))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.221) (::0.160)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.207) (::0.160)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.190) (::0.147)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.173) (::0.147)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.166) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8769__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.186) (::0.192)))
+          (IOPATH A0 Y (::0.174) (::0.163))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.169) (::0.139)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.170) (::0.163)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.241) (::0.273)))
+          (IOPATH B0 Y (::0.241) (::0.273))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.152)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.257) (::0.166)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.168)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.239) (::0.225)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.251) (::0.175)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.252) (::0.202)))
+          (IOPATH A1 Y (::0.257) (::0.202))
+          (IOPATH B1 Y (::0.186) (::0.192))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.174) (::0.115)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.239) (::0.210)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8770__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.232) (::0.175))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.191) (::0.175)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.176) (::0.166)))
+          (IOPATH B0 Y (::0.195) (::0.146))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.187) (::0.142)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.195) (::0.146)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.160) (::0.141)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.152) (::0.145)))
+          (IOPATH A1 Y (::0.216) (::0.166))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.203) (::0.143)))
+          (IOPATH B1 Y (::0.203) (::0.143))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.232) (::0.164)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.216) (::0.163)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.216) (::0.155)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.196) (::0.154)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.174) (::0.145)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8771__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.198) (::0.139))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.156) (::0.139)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.224) (::0.254)))
+          (IOPATH B0 Y (::0.278) (::0.215))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.183) (::0.144)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.278) (::0.215)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.157) (::0.143)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.228) (::0.214)))
+          (IOPATH A1 Y (::0.259) (::0.254))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.199) (::0.145)))
+          (IOPATH B1 Y (::0.199) (::0.145))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.198) (::0.128)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.127)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.259) (::0.238)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.240) (::0.237)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.252) (::0.214)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8772__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.193) (::0.136))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.153) (::0.136)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.195) (::0.210)))
+          (IOPATH B0 Y (::0.241) (::0.187))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.178) (::0.141)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.241) (::0.187)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.154) (::0.140)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.196) (::0.186)))
+          (IOPATH A1 Y (::0.230) (::0.210))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.194) (::0.142)))
+          (IOPATH B1 Y (::0.194) (::0.142))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.193) (::0.125)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.178) (::0.124)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.230) (::0.196)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.211) (::0.196)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.217) (::0.186)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8773__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.174) (::0.189)))
+          (IOPATH A0 Y (::0.197) (::0.180))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.192) (::0.156)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.193) (::0.180)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.192) (::0.185)))
+          (IOPATH B0 Y (::0.192) (::0.185))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.172) (::0.150)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.202) (::0.146)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.173) (::0.165)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.190) (::0.153)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.197) (::0.154)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.198) (::0.179)))
+          (IOPATH A1 Y (::0.202) (::0.179))
+          (IOPATH B1 Y (::0.174) (::0.189))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.197) (::0.138)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.190) (::0.142)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8774__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.181) (::0.188)))
+          (IOPATH A0 Y (::0.170) (::0.159))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.164) (::0.136)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.166) (::0.159)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.186) (::0.177)))
+          (IOPATH B0 Y (::0.186) (::0.177))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.149)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.193) (::0.127)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.164)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.184) (::0.147)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.188) (::0.138)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.189) (::0.164)))
+          (IOPATH A1 Y (::0.193) (::0.164))
+          (IOPATH B1 Y (::0.181) (::0.188))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.170) (::0.113)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.184) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8775__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.244) (::0.188))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.207) (::0.188)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.176) (::0.174)))
+          (IOPATH B0 Y (::0.208) (::0.145))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.200) (::0.152)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.208) (::0.145)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.176) (::0.151)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.167) (::0.143)))
+          (IOPATH A1 Y (::0.212) (::0.174))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.216) (::0.153)))
+          (IOPATH B1 Y (::0.216) (::0.153))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.244) (::0.176)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.228) (::0.176)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.212) (::0.162)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.162)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.187) (::0.144)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8776__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.194) (::0.136))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.154) (::0.136)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.170) (::0.167)))
+          (IOPATH B0 Y (::0.206) (::0.141))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.179) (::0.141)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.206) (::0.141)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.154) (::0.140)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.165) (::0.139)))
+          (IOPATH A1 Y (::0.207) (::0.167))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.195) (::0.142)))
+          (IOPATH B1 Y (::0.195) (::0.142))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.194) (::0.125)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.178) (::0.124)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.207) (::0.156)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.187) (::0.155)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.184) (::0.140)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8777__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.194) (::0.136))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.153) (::0.136)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.221) (::0.250)))
+          (IOPATH B0 Y (::0.273) (::0.210))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.179) (::0.140)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.273) (::0.210)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.154) (::0.140)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.224) (::0.208)))
+          (IOPATH A1 Y (::0.255) (::0.250))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.195) (::0.141)))
+          (IOPATH B1 Y (::0.195) (::0.141))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.194) (::0.125)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.178) (::0.124)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.255) (::0.234)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.236) (::0.232)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.247) (::0.208)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8778__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.198) (::0.140))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.157) (::0.140)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.178) (::0.176)))
+          (IOPATH B0 Y (::0.211) (::0.146))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.203) (::0.154)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.211) (::0.146)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.178) (::0.153)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.169) (::0.145)))
+          (IOPATH A1 Y (::0.215) (::0.176))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.219) (::0.155)))
+          (IOPATH B1 Y (::0.219) (::0.155))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.198) (::0.129)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.128)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.164)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.196) (::0.163)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.189) (::0.145)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8779__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.226) (::0.174))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.189) (::0.174)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.216) (::0.241)))
+          (IOPATH B0 Y (::0.270) (::0.208))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.177) (::0.139)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.270) (::0.208)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.153) (::0.139)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.221) (::0.206)))
+          (IOPATH A1 Y (::0.250) (::0.241))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.193) (::0.140)))
+          (IOPATH B1 Y (::0.193) (::0.140))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.226) (::0.162)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.211) (::0.161)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.250) (::0.225)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.231) (::0.224)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.244) (::0.206)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8780__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.226) (::0.177))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.188) (::0.177)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.224) (::0.253)))
+          (IOPATH B0 Y (::0.276) (::0.214))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.182) (::0.143)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.276) (::0.214)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.156) (::0.142)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.227) (::0.212)))
+          (IOPATH A1 Y (::0.258) (::0.253))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.198) (::0.143)))
+          (IOPATH B1 Y (::0.198) (::0.143))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.226) (::0.165)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.211) (::0.164)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.258) (::0.236)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.239) (::0.235)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.250) (::0.212)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8781__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.186) (::0.192)))
+          (IOPATH A0 Y (::0.204) (::0.192))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.199) (::0.169)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.200) (::0.192)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.198) (::0.190)))
+          (IOPATH B0 Y (::0.198) (::0.190))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.152)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.209) (::0.150)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.168)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.197) (::0.158)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.204) (::0.159)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.205) (::0.184)))
+          (IOPATH A1 Y (::0.209) (::0.184))
+          (IOPATH B1 Y (::0.186) (::0.192))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.204) (::0.151)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.196) (::0.147)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8782__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.202) (::0.195)))
+          (IOPATH A0 Y (::0.221) (::0.194))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.216) (::0.171)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.218) (::0.194)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.231) (::0.259)))
+          (IOPATH B0 Y (::0.231) (::0.259))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.201) (::0.156)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.239) (::0.157)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.201) (::0.171)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.229) (::0.213)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.233) (::0.165)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.235) (::0.191)))
+          (IOPATH A1 Y (::0.239) (::0.191))
+          (IOPATH B1 Y (::0.202) (::0.195))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.221) (::0.155)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.229) (::0.198)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8783__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.182) (::0.188)))
+          (IOPATH A0 Y (::0.199) (::0.189))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.194) (::0.166)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.196) (::0.189)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.194) (::0.186)))
+          (IOPATH B0 Y (::0.194) (::0.186))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.149)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.204) (::0.147)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.164)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.192) (::0.155)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.199) (::0.156)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.201) (::0.181)))
+          (IOPATH A1 Y (::0.204) (::0.181))
+          (IOPATH B1 Y (::0.182) (::0.188))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.199) (::0.148)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.192) (::0.144)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8784__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.186) (::0.191)))
+          (IOPATH A0 Y (::0.204) (::0.192))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.199) (::0.169)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.200) (::0.192)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.241) (::0.273)))
+          (IOPATH B0 Y (::0.241) (::0.273))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.152)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.257) (::0.166)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.167)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.239) (::0.225)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.251) (::0.175)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.252) (::0.202)))
+          (IOPATH A1 Y (::0.257) (::0.202))
+          (IOPATH B1 Y (::0.186) (::0.191))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.204) (::0.151)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.239) (::0.210)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8785__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.216) (::0.170))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.180) (::0.170)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.212) (::0.237)))
+          (IOPATH B0 Y (::0.264) (::0.202))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.172) (::0.136)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.264) (::0.202)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.149) (::0.135)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.216) (::0.200)))
+          (IOPATH A1 Y (::0.245) (::0.237))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.188) (::0.136)))
+          (IOPATH B1 Y (::0.188) (::0.136))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.216) (::0.159)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.202) (::0.158)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.245) (::0.220)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.226) (::0.219)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.238) (::0.200)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8786__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.193) (::0.139))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.153) (::0.139)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.174) (::0.173)))
+          (IOPATH B0 Y (::0.206) (::0.143))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.198) (::0.150)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.206) (::0.143)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.174) (::0.150)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.166) (::0.142)))
+          (IOPATH A1 Y (::0.210) (::0.173))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.214) (::0.151)))
+          (IOPATH B1 Y (::0.214) (::0.151))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.193) (::0.127)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.178) (::0.127)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.210) (::0.161)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.192) (::0.160)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.185) (::0.142)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8787__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.172) (::0.121))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.136) (::0.121)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.179) (::0.192)))
+          (IOPATH B0 Y (::0.217) (::0.163))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.128) (::0.090)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.217) (::0.163)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.107) (::0.090)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.176) (::0.162)))
+          (IOPATH A1 Y (::0.209) (::0.192))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.143) (::0.091)))
+          (IOPATH B1 Y (::0.143) (::0.091))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.172) (::0.110)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.157) (::0.109)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.209) (::0.178)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.192) (::0.177)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.194) (::0.162)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8788__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.221) (::0.174))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.184) (::0.174)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.220) (::0.248)))
+          (IOPATH B0 Y (::0.270) (::0.208))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.177) (::0.139)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.270) (::0.208)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.153) (::0.139)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.221) (::0.206)))
+          (IOPATH A1 Y (::0.253) (::0.248))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.193) (::0.140)))
+          (IOPATH B1 Y (::0.193) (::0.140))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.221) (::0.162)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.206) (::0.161)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.253) (::0.232)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.234) (::0.230)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.244) (::0.206)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8789__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.183) (::0.182)))
+          (IOPATH A0 Y (::0.197) (::0.188))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.192) (::0.164)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.193) (::0.188)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.187) (::0.187)))
+          (IOPATH B0 Y (::0.187) (::0.187))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.181) (::0.143)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.208) (::0.155)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.182) (::0.159)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.185) (::0.156)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.202) (::0.164)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.204) (::0.189)))
+          (IOPATH A1 Y (::0.208) (::0.189))
+          (IOPATH B1 Y (::0.183) (::0.182))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.197) (::0.146)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.185) (::0.144)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8790__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.227) (::0.177))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.188) (::0.177)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.198) (::0.213)))
+          (IOPATH B0 Y (::0.245) (::0.191))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.182) (::0.143)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.245) (::0.191)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.157) (::0.143)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.199) (::0.189)))
+          (IOPATH A1 Y (::0.234) (::0.213))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.198) (::0.144)))
+          (IOPATH B1 Y (::0.198) (::0.144))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.227) (::0.166)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.211) (::0.165)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.234) (::0.199)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.215) (::0.198)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.221) (::0.190)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8791__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.178) (::0.193)))
+          (IOPATH A0 Y (::0.201) (::0.183))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.160)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.197) (::0.183)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.238) (::0.270)))
+          (IOPATH B0 Y (::0.238) (::0.270))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.177) (::0.153)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.254) (::0.165)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.177) (::0.169)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.235) (::0.222)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.248) (::0.173)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.249) (::0.200)))
+          (IOPATH A1 Y (::0.254) (::0.200))
+          (IOPATH B1 Y (::0.178) (::0.193))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.201) (::0.141)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.235) (::0.207)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8792__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.186) (::0.191)))
+          (IOPATH A0 Y (::0.204) (::0.192))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.199) (::0.169)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.200) (::0.192)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.191) (::0.180)))
+          (IOPATH B0 Y (::0.191) (::0.180))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.152)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.200) (::0.133)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.168)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.189) (::0.150)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.195) (::0.145)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.197) (::0.170)))
+          (IOPATH A1 Y (::0.200) (::0.170))
+          (IOPATH B1 Y (::0.186) (::0.191))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.204) (::0.151)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.189) (::0.139)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8793__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.191) (::0.135))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.151) (::0.135)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.168) (::0.160)))
+          (IOPATH B0 Y (::0.184) (::0.138))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.176) (::0.134)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.184) (::0.138)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.152) (::0.134)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.144) (::0.137)))
+          (IOPATH A1 Y (::0.205) (::0.160))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.192) (::0.135)))
+          (IOPATH B1 Y (::0.192) (::0.135))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.191) (::0.123)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.175) (::0.123)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.205) (::0.148)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.186) (::0.147)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.164) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8794__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.182) (::0.188)))
+          (IOPATH A0 Y (::0.170) (::0.159))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.165) (::0.136)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.166) (::0.159)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.187) (::0.176)))
+          (IOPATH B0 Y (::0.187) (::0.176))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.149)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.196) (::0.131)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.180) (::0.164)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.185) (::0.147)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.191) (::0.142)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.167)))
+          (IOPATH A1 Y (::0.196) (::0.167))
+          (IOPATH B1 Y (::0.182) (::0.188))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.170) (::0.113)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.185) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8795__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.199) (::0.201)))
+          (IOPATH A0 Y (::0.209) (::0.190))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.203) (::0.167)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.205) (::0.190)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.237) (::0.264)))
+          (IOPATH B0 Y (::0.237) (::0.264))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.197) (::0.161)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.245) (::0.160)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.197) (::0.177)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.235) (::0.218)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.239) (::0.169)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.240) (::0.195)))
+          (IOPATH A1 Y (::0.245) (::0.195))
+          (IOPATH B1 Y (::0.199) (::0.201))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.209) (::0.148)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.235) (::0.204)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8796)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.084) (::0.070))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8797__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.129) (::0.156))
+          (IOPATH B Y (::0.103) (::0.133))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8798__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.091) (::0.060))
+          (IOPATH B Y (::0.093) (::0.061))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8799__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.138) (::0.171))
+          (IOPATH B Y (::0.103) (::0.133))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8800__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.109) (::0.096))
+          (IOPATH B Y (::0.130) (::0.137))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8801__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.145) (::0.186))
+          (IOPATH B Y (::0.103) (::0.133))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8802__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.232) (::0.170)))
+          (IOPATH A0 Y (::0.139) (::0.122))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.234) (::0.217)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.232) (::0.195)))
+          (IOPATH B0 Y (::0.234) (::0.195))
+          (IOPATH A1 Y (::0.162) (::0.126))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8803)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.067) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8804)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.075) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8805)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.076) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8806)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.076) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8807)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.076) (::0.063))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8808__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.170) (::0.145)))
+          (COND ~B (IOPATH A Y (::0.138) (::0.118)))
+          (COND A (IOPATH B Y (::0.174) (::0.160)))
+          (COND B (IOPATH A Y (::0.182) (::0.162)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8809__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.141) (::0.121)))
+          (IOPATH A0 Y (::0.135) (::0.118))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.142) (::0.151)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.141) (::0.138)))
+          (IOPATH B0 Y (::0.142) (::0.138))
+          (IOPATH A1 Y (::0.162) (::0.125))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8810__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.181) (::0.144)))
+          (IOPATH A0 Y (::0.139) (::0.122))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.183) (::0.182)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.181) (::0.165)))
+          (IOPATH B0 Y (::0.183) (::0.165))
+          (IOPATH A1 Y (::0.162) (::0.126))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8811__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.187) (::0.152)))
+          (IOPATH A0 Y (::0.140) (::0.122))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.189) (::0.191)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.187) (::0.175)))
+          (IOPATH B0 Y (::0.189) (::0.175))
+          (IOPATH A1 Y (::0.168) (::0.128))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8812__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.181) (::0.146)))
+          (IOPATH A0 Y (::0.139) (::0.122))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.183) (::0.185)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.181) (::0.168)))
+          (IOPATH B0 Y (::0.183) (::0.168))
+          (IOPATH A1 Y (::0.162) (::0.126))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8813__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.181) (::0.146)))
+          (IOPATH A0 Y (::0.135) (::0.118))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.183) (::0.185)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.181) (::0.168)))
+          (IOPATH B0 Y (::0.183) (::0.168))
+          (IOPATH A1 Y (::0.162) (::0.126))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8814__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.182) (::0.146)))
+          (IOPATH A0 Y (::0.139) (::0.122))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.183) (::0.185)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.182) (::0.168)))
+          (IOPATH B0 Y (::0.183) (::0.168))
+          (IOPATH A1 Y (::0.162) (::0.126))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8815)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.094) (::0.077))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8816)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.094) (::0.077))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8817)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.097) (::0.085))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8818)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.186) (::0.200))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8819)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.138) (::0.126))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8820__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.129) (::0.117))
+          (IOPATH B Y (::0.143) (::0.131))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8821__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.173) (::0.171))
+          (IOPATH B Y (::0.156) (::0.160))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8822__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.173) (::0.171))
+          (IOPATH B Y (::0.179) (::0.178))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8823__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.190) (::0.192))
+          (IOPATH B Y (::0.141) (::0.136))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8824__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.107) (::0.122))
+          (IOPATH B Y (::0.190) (::0.169))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8825__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.211) (::0.145))
+          (IOPATH B Y (::0.224) (::0.168))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8826__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.211) (::0.145))
+          (IOPATH B Y (::0.303) (::0.193))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8827__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.211) (::0.145))
+          (IOPATH B Y (::0.180) (::0.116))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8828__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.370) (::0.202))
+          (IOPATH B Y (::0.463) (::0.316))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8829__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.296) (::0.284))
+          (IOPATH B Y (::0.265) (::0.248))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8830)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.050) (::0.047))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8831)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.163) (::0.154))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8832)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.191) (::0.149))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8833)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.216) (::0.175))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8834)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.217) (::0.228))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8835)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.172) (::0.183))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8836)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.116) (::0.076))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8837__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.060) (::0.052)))
+          (IOPATH A0 Y (::0.099) (::0.092))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.061) (::0.071)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.060) (::0.060)))
+          (IOPATH B0 Y (::0.061) (::0.060))
+          (IOPATH A1 Y (::0.109) (::0.090))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8838__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.118) (::0.126)))
+          (IOPATH A0 Y (::0.172) (::0.160))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.167) (::0.139)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.168) (::0.160)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.097) (::0.099)))
+          (IOPATH B0 Y (::0.097) (::0.099))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.116) (::0.093)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.126) (::0.091)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.116) (::0.104)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.096) (::0.076)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.121) (::0.098)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.122) (::0.121)))
+          (IOPATH A1 Y (::0.126) (::0.121))
+          (IOPATH B1 Y (::0.118) (::0.126))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.172) (::0.129)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.095) (::0.069)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8839__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.161) (::0.137)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.135)))
+          (COND A (IOPATH B Y (::0.144) (::0.136)))
+          (COND B (IOPATH A Y (::0.131) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8840__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.159) (::0.133)))
+          (COND ~B (IOPATH A Y (::0.154) (::0.135)))
+          (COND A (IOPATH B Y (::0.140) (::0.133)))
+          (COND B (IOPATH A Y (::0.131) (::0.108)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8841__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.125) (::0.138))
+          (IOPATH A1 Y (::0.124) (::0.134))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.113) (::0.092)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.114) (::0.134)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8842__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.246) (::0.269))
+          (IOPATH B Y (::0.245) (::0.268))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8843__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.226) (::0.289))
+          (IOPATH B Y (::0.326) (::0.413))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8844__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.213) (::0.266))
+          (IOPATH B Y (::0.294) (::0.366))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8845__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.274) (::0.157))
+          (IOPATH B Y (::0.328) (::0.226))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8846__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.394) (::0.213))
+          (IOPATH B Y (::0.488) (::0.332))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8847__9315)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.287) (::0.371))
+          (IOPATH B Y (::0.487) (::0.544))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8848)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8849)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.068) (::0.057))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8850)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8851)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.070) (::0.063))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8852)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8853)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.067) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8854)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8855)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.080) (::0.067))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8856)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8857)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8858)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.065) (::0.059))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8859)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.080) (::0.067))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8860)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8861)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.081) (::0.061))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8862)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.069) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8863)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.065) (::0.059))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8864)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.065) (::0.061))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8865)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.268) (::0.261))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8866)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.140) (::0.086))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8867)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.216) (::0.204))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8868)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.239) (::0.226))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8869)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.236) (::0.249))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8870)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.220) (::0.230))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8871)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.240) (::0.226))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8872__9945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.139) (::0.158))
+          (IOPATH B Y (::0.103) (::0.133))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8873__2883)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.229) (::0.335))
+          (IOPATH B Y (::0.139) (::0.142))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8874__2346)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.230) (::0.346))
+          (IOPATH B Y (::0.140) (::0.143))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8875__1666)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.103) (::0.089))
+          (IOPATH B Y (::0.086) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8876__7410)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.117) (::0.102)))
+          (IOPATH A0 Y (::0.115) (::0.086))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.151) (::0.104)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.128) (::0.102)))
+          (IOPATH B0 Y (::0.151) (::0.104))
+          (IOPATH A1 Y (::0.181) (::0.147))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8877__6417)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.117) (::0.102)))
+          (IOPATH A0 Y (::0.116) (::0.087))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.151) (::0.104)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.128) (::0.102)))
+          (IOPATH B0 Y (::0.151) (::0.104))
+          (IOPATH A1 Y (::0.181) (::0.147))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8878__5477)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.113) (::0.099)))
+          (IOPATH A0 Y (::0.116) (::0.086))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.145) (::0.100)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.123) (::0.099)))
+          (IOPATH B0 Y (::0.145) (::0.100))
+          (IOPATH A1 Y (::0.181) (::0.147))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8879__2398)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.117) (::0.101)))
+          (IOPATH A0 Y (::0.121) (::0.092))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.151) (::0.103)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.128) (::0.101)))
+          (IOPATH B0 Y (::0.151) (::0.103))
+          (IOPATH A1 Y (::0.181) (::0.147))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8880__5107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.118) (::0.102)))
+          (IOPATH A0 Y (::0.116) (::0.087))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.151) (::0.104)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.128) (::0.102)))
+          (IOPATH B0 Y (::0.151) (::0.104))
+          (IOPATH A1 Y (::0.181) (::0.147))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8881__6260)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.094) (::0.087)))
+          (IOPATH A0 Y (::0.117) (::0.087))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.121) (::0.089)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.102) (::0.087)))
+          (IOPATH B0 Y (::0.121) (::0.089))
+          (IOPATH A1 Y (::0.181) (::0.147))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8882__4319)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.118) (::0.102)))
+          (IOPATH A0 Y (::0.117) (::0.088))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.151) (::0.104)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.128) (::0.102)))
+          (IOPATH B0 Y (::0.151) (::0.104))
+          (IOPATH A1 Y (::0.181) (::0.147))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8883__8428)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.061) (::0.047)))
+          (IOPATH A0 Y (::0.194) (::0.131))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.062) (::0.066)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.061) (::0.055)))
+          (IOPATH B0 Y (::0.062) (::0.055))
+          (IOPATH A1 Y (::0.200) (::0.154))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8884__5526)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.119) (::0.090))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.096) (::0.090)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.166) (::0.168)))
+          (IOPATH B0 Y (::0.094) (::0.067))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.148) (::0.101)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.094) (::0.067)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.136) (::0.100)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.072) (::0.066)))
+          (IOPATH A1 Y (::0.188) (::0.168))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.166) (::0.102)))
+          (IOPATH B1 Y (::0.166) (::0.102))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.119) (::0.078)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.106) (::0.078)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.188) (::0.149)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.171) (::0.147)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.079) (::0.066)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8885__6783)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.119) (::0.090))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.096) (::0.090)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.166) (::0.168)))
+          (IOPATH B0 Y (::0.096) (::0.068))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.149) (::0.101)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.096) (::0.068)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.137) (::0.101)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.073) (::0.067)))
+          (IOPATH A1 Y (::0.187) (::0.168))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.167) (::0.102)))
+          (IOPATH B1 Y (::0.167) (::0.102))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.119) (::0.078)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.107) (::0.078)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.187) (::0.148)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.170) (::0.147)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.081) (::0.068)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8886__3680)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.119) (::0.090))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.096) (::0.090)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.166) (::0.168)))
+          (IOPATH B0 Y (::0.094) (::0.067))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.149) (::0.101)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.094) (::0.067)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.137) (::0.101)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.072) (::0.066)))
+          (IOPATH A1 Y (::0.187) (::0.168))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.167) (::0.102)))
+          (IOPATH B1 Y (::0.167) (::0.102))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.119) (::0.078)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.106) (::0.078)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.187) (::0.148)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.170) (::0.147)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.079) (::0.066)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8887__1617)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.086) (::0.097)))
+          (IOPATH A0 Y (::0.246) (::0.223))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.236) (::0.185)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.239) (::0.223)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.137) (::0.147)))
+          (IOPATH B0 Y (::0.137) (::0.147))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.084) (::0.069)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.104) (::0.073)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.084) (::0.077)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.135) (::0.104)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.098) (::0.078)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.099) (::0.099)))
+          (IOPATH A1 Y (::0.104) (::0.099))
+          (IOPATH B1 Y (::0.086) (::0.097))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.246) (::0.180)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.135) (::0.096)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8888__2802)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.121) (::0.091))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.098) (::0.091)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.136) (::0.138)))
+          (IOPATH B0 Y (::0.096) (::0.068))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.096) (::0.068)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.133) (::0.101)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.074) (::0.067)))
+          (IOPATH A1 Y (::0.155) (::0.138))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.162) (::0.102)))
+          (IOPATH B1 Y (::0.162) (::0.102))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.121) (::0.079)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.108) (::0.079)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.155) (::0.123)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.141) (::0.122)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.081) (::0.068)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8889__1705)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.086) (::0.097)))
+          (IOPATH A0 Y (::0.180) (::0.168))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.173) (::0.141)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.175) (::0.168)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.138) (::0.149)))
+          (IOPATH B0 Y (::0.138) (::0.149))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.084) (::0.069)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.105) (::0.074)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.085) (::0.077)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.135) (::0.105)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.099) (::0.078)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.101) (::0.100)))
+          (IOPATH A1 Y (::0.105) (::0.100))
+          (IOPATH B1 Y (::0.086) (::0.097))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.180) (::0.136)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.135) (::0.098)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8890__5122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.102) (::0.141))
+          (IOPATH B Y (::0.103) (::0.133))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8891__8246)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.082) (::0.093)))
+          (IOPATH A0 Y (::0.158) (::0.147))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.152) (::0.124)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.154) (::0.147)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.170) (::0.172)))
+          (IOPATH B0 Y (::0.170) (::0.172))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.081) (::0.065)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.110) (::0.078)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.081) (::0.073)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.118)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.104) (::0.082)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.106) (::0.104)))
+          (IOPATH A1 Y (::0.110) (::0.104))
+          (IOPATH B1 Y (::0.082) (::0.093))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.158) (::0.119)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.168) (::0.109)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8892__7098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.132) (::0.100)))
+          (IOPATH A0 Y (::0.237) (::0.172))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.133) (::0.127)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.132) (::0.114)))
+          (IOPATH B0 Y (::0.133) (::0.114))
+          (IOPATH A1 Y (::0.173) (::0.140))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8893__6131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.123) (::0.099)))
+          (IOPATH A0 Y (::0.153) (::0.123))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.124) (::0.127)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.123) (::0.114)))
+          (IOPATH B0 Y (::0.124) (::0.114))
+          (IOPATH A1 Y (::0.259) (::0.201))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8894__1881)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.078) (::0.061)))
+          (IOPATH A0 Y (::0.147) (::0.120))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.079) (::0.084)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.078) (::0.074)))
+          (IOPATH B0 Y (::0.079) (::0.074))
+          (IOPATH A1 Y (::0.259) (::0.201))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8895__5115)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.123) (::0.099)))
+          (IOPATH A0 Y (::0.152) (::0.123))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.124) (::0.127)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.123) (::0.114)))
+          (IOPATH B0 Y (::0.124) (::0.114))
+          (IOPATH A1 Y (::0.259) (::0.201))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8896__7482)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.123) (::0.100)))
+          (IOPATH A0 Y (::0.153) (::0.123))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.124) (::0.127)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.123) (::0.114)))
+          (IOPATH B0 Y (::0.124) (::0.114))
+          (IOPATH A1 Y (::0.259) (::0.201))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8897__4733)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.079) (::0.062)))
+          (IOPATH A0 Y (::0.237) (::0.172))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.080) (::0.084)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.079) (::0.075)))
+          (IOPATH B0 Y (::0.080) (::0.075))
+          (IOPATH A1 Y (::0.166) (::0.135))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8898__6161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.114) (::0.094)))
+          (IOPATH A0 Y (::0.152) (::0.123))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.115) (::0.120)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.114) (::0.108)))
+          (IOPATH B0 Y (::0.115) (::0.108))
+          (IOPATH A1 Y (::0.259) (::0.201))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8899)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.151) (::0.162)))
+          (IOPATH A0 Y (::0.158) (::0.154))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.152) (::0.132)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.154) (::0.154)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.170)))
+          (IOPATH B0 Y (::0.168) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.149) (::0.128)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.200) (::0.145)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.149) (::0.139)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.133)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.193) (::0.149)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.195) (::0.179)))
+          (IOPATH A1 Y (::0.200) (::0.179))
+          (IOPATH B1 Y (::0.151) (::0.162))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.158) (::0.122)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8900)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.115) (::0.094)))
+          (IOPATH A0 Y (::0.153) (::0.123))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.116) (::0.121)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.115) (::0.109)))
+          (IOPATH B0 Y (::0.116) (::0.109))
+          (IOPATH A1 Y (::0.259) (::0.201))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8901)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.129) (::0.103)))
+          (IOPATH A0 Y (::0.153) (::0.123))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.130) (::0.131)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.129) (::0.118)))
+          (IOPATH B0 Y (::0.130) (::0.118))
+          (IOPATH A1 Y (::0.259) (::0.201))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8902)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.130) (::0.104)))
+          (IOPATH A0 Y (::0.152) (::0.123))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.131) (::0.132)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.130) (::0.119)))
+          (IOPATH B0 Y (::0.131) (::0.119))
+          (IOPATH A1 Y (::0.259) (::0.201))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8903)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.137) (::0.103)))
+          (IOPATH A0 Y (::0.236) (::0.171))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.138) (::0.132)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.137) (::0.118)))
+          (IOPATH B0 Y (::0.138) (::0.118))
+          (IOPATH A1 Y (::0.172) (::0.139))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8904)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.399) (::0.176)))
+          (IOPATH A0 Y (::0.147) (::0.120))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.402) (::0.266)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.394) (::0.218)))
+          (IOPATH B0 Y (::0.402) (::0.218))
+          (IOPATH A1 Y (::0.260) (::0.202))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8905)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.129) (::0.103)))
+          (IOPATH A0 Y (::0.152) (::0.123))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.130) (::0.131)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.129) (::0.118)))
+          (IOPATH B0 Y (::0.130) (::0.118))
+          (IOPATH A1 Y (::0.259) (::0.201))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8906)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.128) (::0.103)))
+          (IOPATH A0 Y (::0.152) (::0.123))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.130) (::0.131)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.129) (::0.118)))
+          (IOPATH B0 Y (::0.130) (::0.118))
+          (IOPATH A1 Y (::0.259) (::0.201))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8907)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.078) (::0.062)))
+          (IOPATH A0 Y (::0.236) (::0.171))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.079) (::0.084)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.078) (::0.074)))
+          (IOPATH B0 Y (::0.079) (::0.074))
+          (IOPATH A1 Y (::0.166) (::0.135))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8908)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.198) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.172) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.196) (::0.190)))
+          (IOPATH B0 Y (::0.185) (::0.134))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.132) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.185) (::0.134)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.117) (::0.100)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.150) (::0.133)))
+          (IOPATH A1 Y (::0.221) (::0.190))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.146) (::0.101)))
+          (IOPATH B1 Y (::0.146) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.198) (::0.140)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.184) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.221) (::0.173)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.204) (::0.172)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.164) (::0.133)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8909)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.191) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.156) (::0.138)))
+          (IOPATH A1 Y (::0.215) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.140)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.199) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8910)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.186) (::0.201)))
+          (IOPATH A0 Y (::0.154) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.142) (::0.145)))
+          (IOPATH B0 Y (::0.142) (::0.145))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.158)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.171)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.140) (::0.115)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.178)))
+          (IOPATH A1 Y (::0.199) (::0.178))
+          (IOPATH B1 Y (::0.186) (::0.201))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.140) (::0.107)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8911)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.197) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.192) (::0.185)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.100)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.217) (::0.185))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.197) (::0.140)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.184) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.217) (::0.169)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.200) (::0.168)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8912)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.220) (::0.176))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.194) (::0.176)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.154) (::0.149)))
+          (IOPATH B0 Y (::0.154) (::0.116))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.136) (::0.104)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.154) (::0.116)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.120) (::0.104)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.115)))
+          (IOPATH A1 Y (::0.178) (::0.149))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.150) (::0.105)))
+          (IOPATH B1 Y (::0.150) (::0.105))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.220) (::0.161)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.206) (::0.160)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.178) (::0.137)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.163) (::0.136)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.135) (::0.115)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8913)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.150) (::0.162)))
+          (IOPATH A0 Y (::0.156) (::0.152))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.151) (::0.131)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.152) (::0.152)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.170)))
+          (IOPATH B0 Y (::0.168) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.148) (::0.128)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.149) (::0.139)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.178)))
+          (IOPATH A1 Y (::0.198) (::0.178))
+          (IOPATH B1 Y (::0.150) (::0.162))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.156) (::0.121)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8914)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.151))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.151)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.190) (::0.182)))
+          (IOPATH B0 Y (::0.191) (::0.138))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.130) (::0.099)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.191) (::0.138)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.115) (::0.098)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.136)))
+          (IOPATH A1 Y (::0.214) (::0.182))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.144) (::0.100)))
+          (IOPATH B1 Y (::0.144) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.214) (::0.166)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.198) (::0.165)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.169) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8915)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.192) (::0.185)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.216) (::0.185))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.216) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.200) (::0.168)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8916)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.186) (::0.201)))
+          (IOPATH A0 Y (::0.215) (::0.203))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.208) (::0.176)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.210) (::0.203)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.135) (::0.140)))
+          (IOPATH B0 Y (::0.135) (::0.140))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.158)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.143) (::0.106)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.170)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.134) (::0.111)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.137) (::0.112)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.138) (::0.135)))
+          (IOPATH A1 Y (::0.143) (::0.135))
+          (IOPATH B1 Y (::0.186) (::0.201))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.215) (::0.169)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.134) (::0.103)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8917)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.228) (::0.180))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.203) (::0.180)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.154) (::0.149)))
+          (IOPATH B0 Y (::0.137) (::0.104))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.191) (::0.139)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.137) (::0.104)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.173) (::0.138)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.108) (::0.102)))
+          (IOPATH A1 Y (::0.178) (::0.149))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.208) (::0.140)))
+          (IOPATH B1 Y (::0.208) (::0.140))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.228) (::0.165)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.214) (::0.164)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.178) (::0.137)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.163) (::0.136)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.120) (::0.103)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8918)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.167)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.127)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.171)))
+          (IOPATH B0 Y (::0.168) (::0.171))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.178)))
+          (IOPATH A1 Y (::0.198) (::0.178))
+          (IOPATH B1 Y (::0.156) (::0.167))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8919)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.168)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.127)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.167) (::0.170)))
+          (IOPATH B0 Y (::0.167) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.165) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.178)))
+          (IOPATH A1 Y (::0.199) (::0.178))
+          (IOPATH B1 Y (::0.156) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.165) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8920)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.150) (::0.161)))
+          (IOPATH A0 Y (::0.157) (::0.153))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.151) (::0.131)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.153) (::0.153)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.170)))
+          (IOPATH B0 Y (::0.168) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.148) (::0.127)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.148) (::0.138)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.178)))
+          (IOPATH A1 Y (::0.198) (::0.178))
+          (IOPATH B1 Y (::0.150) (::0.161))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.157) (::0.121)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8921)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.196) (::0.189)))
+          (IOPATH B0 Y (::0.184) (::0.134))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.132) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.184) (::0.134)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.149) (::0.132)))
+          (IOPATH A1 Y (::0.221) (::0.189))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.146) (::0.101)))
+          (IOPATH B1 Y (::0.146) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.221) (::0.173)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.204) (::0.172)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.163) (::0.133)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8922)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.190) (::0.146))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.164) (::0.146)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.191) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.135) (::0.103)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.119) (::0.103)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.215) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.149) (::0.104)))
+          (IOPATH B1 Y (::0.149) (::0.104))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.190) (::0.134)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.176) (::0.134)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.199) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8923)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.229) (::0.230)))
+          (IOPATH B0 Y (::0.229) (::0.230))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.143)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.226) (::0.174)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.193) (::0.147)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.176)))
+          (IOPATH A1 Y (::0.199) (::0.176))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.227) (::0.162)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8924)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.155) (::0.167)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.127)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.171)))
+          (IOPATH B0 Y (::0.168) (::0.171))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.153) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.143)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.178)))
+          (IOPATH A1 Y (::0.198) (::0.178))
+          (IOPATH B1 Y (::0.155) (::0.167))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.116)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8925)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.170)))
+          (IOPATH B0 Y (::0.168) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.149)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.179)))
+          (IOPATH A1 Y (::0.199) (::0.179))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8926)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.192) (::0.185)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.216) (::0.185))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.140)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.216) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.200) (::0.168)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8927)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.162) (::0.167)))
+          (IOPATH B0 Y (::0.162) (::0.167))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.160) (::0.121)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.160) (::0.130)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.154) (::0.125)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.156) (::0.149)))
+          (IOPATH A1 Y (::0.160) (::0.149))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.160) (::0.121)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8928)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.229) (::0.230)))
+          (IOPATH B0 Y (::0.229) (::0.230))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.143)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.226) (::0.174)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.193) (::0.147)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.176)))
+          (IOPATH A1 Y (::0.199) (::0.176))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.227) (::0.162)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8929)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.229) (::0.181))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.203) (::0.181)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.154) (::0.149)))
+          (IOPATH B0 Y (::0.137) (::0.104))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.190) (::0.138)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.137) (::0.104)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.173) (::0.138)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.108) (::0.102)))
+          (IOPATH A1 Y (::0.178) (::0.149))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.208) (::0.139)))
+          (IOPATH B1 Y (::0.208) (::0.139))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.229) (::0.166)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.215) (::0.165)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.178) (::0.137)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.163) (::0.136)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.120) (::0.103)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8930)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.195) (::0.151))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.169) (::0.151)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.260) (::0.251)))
+          (IOPATH B0 Y (::0.191) (::0.137))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.191) (::0.137)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.115) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.135)))
+          (IOPATH A1 Y (::0.287) (::0.251))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.195) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.287) (::0.228)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.267) (::0.226)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.169) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8931)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.167)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.127)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.171)))
+          (IOPATH B0 Y (::0.168) (::0.171))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.178)))
+          (IOPATH A1 Y (::0.198) (::0.178))
+          (IOPATH B1 Y (::0.156) (::0.167))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8932)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.192) (::0.185)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.216) (::0.185))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.216) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.200) (::0.168)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8933)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.190) (::0.147))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.164) (::0.147)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.260) (::0.251)))
+          (IOPATH B0 Y (::0.191) (::0.137))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.134) (::0.103)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.191) (::0.137)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.119) (::0.103)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.135)))
+          (IOPATH A1 Y (::0.287) (::0.251))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.148) (::0.104)))
+          (IOPATH B1 Y (::0.148) (::0.104))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.190) (::0.135)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.177) (::0.134)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.287) (::0.228)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.267) (::0.226)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.169) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8934)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.261) (::0.252)))
+          (IOPATH B0 Y (::0.192) (::0.137))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.137)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.136)))
+          (IOPATH A1 Y (::0.288) (::0.252))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.288) (::0.228)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.268) (::0.227)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8935)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.167)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.127)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.170)))
+          (IOPATH B0 Y (::0.168) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.178)))
+          (IOPATH A1 Y (::0.198) (::0.178))
+          (IOPATH B1 Y (::0.156) (::0.167))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8936)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.186) (::0.201)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.127)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.142) (::0.145)))
+          (IOPATH B0 Y (::0.142) (::0.145))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.158)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.184) (::0.170)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.140) (::0.115)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.178)))
+          (IOPATH A1 Y (::0.198) (::0.178))
+          (IOPATH B1 Y (::0.186) (::0.201))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.140) (::0.107)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8937)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.194) (::0.151))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.169) (::0.151)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.194) (::0.188)))
+          (IOPATH B0 Y (::0.183) (::0.133))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.130) (::0.099)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.183) (::0.133)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.115) (::0.098)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.148) (::0.131)))
+          (IOPATH A1 Y (::0.219) (::0.188))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.144) (::0.100)))
+          (IOPATH B1 Y (::0.144) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.194) (::0.138)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.181) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.219) (::0.172)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.202) (::0.170)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.162) (::0.131)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8938)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.190) (::0.147))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.164) (::0.147)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.190) (::0.183)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.134) (::0.103)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.119) (::0.103)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.215) (::0.183))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.148) (::0.104)))
+          (IOPATH B1 Y (::0.148) (::0.104))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.190) (::0.135)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.177) (::0.134)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.167)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.198) (::0.166)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8939)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.151))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.151)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.191) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.215) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.199) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8940)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.151) (::0.162)))
+          (IOPATH A0 Y (::0.157) (::0.153))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.152) (::0.132)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.153) (::0.153)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.162) (::0.167)))
+          (IOPATH B0 Y (::0.162) (::0.167))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.149) (::0.128)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.160) (::0.121)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.150) (::0.139)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.160) (::0.130)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.154) (::0.125)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.156) (::0.149)))
+          (IOPATH A1 Y (::0.160) (::0.149))
+          (IOPATH B1 Y (::0.151) (::0.162))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.157) (::0.122)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.160) (::0.121)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8941)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.210) (::0.147))
+          (IOPATH B Y (::0.133) (::0.098))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8943)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.328) (::0.303)))
+          (IOPATH A0 Y (::0.327) (::0.294))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.322) (::0.263)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.324) (::0.294)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.388) (::0.356)))
+          (IOPATH B0 Y (::0.388) (::0.356))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.326) (::0.239)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.413) (::0.306)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.326) (::0.274)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.386) (::0.313)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.408) (::0.329)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.410) (::0.364)))
+          (IOPATH A1 Y (::0.413) (::0.364))
+          (IOPATH B1 Y (::0.328) (::0.303))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.327) (::0.213)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.385) (::0.286)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__mux2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8944)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT S0 (::0.000))
+          (IOPATH A0 Y (::0.346) (::0.321))
+          (IOPATH A1 Y (::0.268) (::0.252))
+          (COND (A0&~A1) (IOPATH S0 Y (::0.249) (::0.239)))
+          (COND (~A0&A1) (IOPATH S0 Y (::0.244) (::0.260)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8945)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.207) (::0.234))
+          (IOPATH B Y (::0.189) (::0.210))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8946)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.430) (::0.387)))
+          (IOPATH A0 Y (::0.427) (::0.377))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.422) (::0.342)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.424) (::0.377)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.488) (::0.437)))
+          (IOPATH B0 Y (::0.488) (::0.437))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.427) (::0.308)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.514) (::0.373)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.427) (::0.356)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.485) (::0.389)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.509) (::0.407)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.511) (::0.448)))
+          (IOPATH A1 Y (::0.514) (::0.448))
+          (IOPATH B1 Y (::0.430) (::0.387))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.427) (::0.274)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.485) (::0.351)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8947)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.481) (::0.319))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.380) (::0.319)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.439) (::0.402)))
+          (IOPATH B0 Y (::0.514) (::0.384))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.410) (::0.271)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.514) (::0.384)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.328) (::0.271)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.402) (::0.382)))
+          (IOPATH A1 Y (::0.533) (::0.402))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.436) (::0.273)))
+          (IOPATH B1 Y (::0.436) (::0.273))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.481) (::0.308)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.455) (::0.307)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.533) (::0.391)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.496) (::0.390)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.473) (::0.383)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8948)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.511) (::0.338))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.404) (::0.338)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.447) (::0.412)))
+          (IOPATH B0 Y (::0.486) (::0.343))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.438) (::0.289)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.486) (::0.343)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.349) (::0.289)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.366) (::0.341)))
+          (IOPATH A1 Y (::0.548) (::0.412))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.465) (::0.290)))
+          (IOPATH B1 Y (::0.465) (::0.290))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.511) (::0.327)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.484) (::0.326)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.548) (::0.401)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.509) (::0.400)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.444) (::0.341)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8949)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.429) (::0.387)))
+          (IOPATH A0 Y (::0.428) (::0.378))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.423) (::0.343)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.425) (::0.378)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.488) (::0.438)))
+          (IOPATH B0 Y (::0.488) (::0.438))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.427) (::0.308)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.516) (::0.373)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.427) (::0.355)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.486) (::0.389)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.510) (::0.408)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.512) (::0.449)))
+          (IOPATH A1 Y (::0.516) (::0.449))
+          (IOPATH B1 Y (::0.429) (::0.387))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.428) (::0.275)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.486) (::0.351)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8950)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8951)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.065) (::0.055))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8952)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.068) (::0.057))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8953)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8954)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.069) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8955)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.075) (::0.063))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8956)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.065) (::0.059))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8957)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.065) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8958)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8959)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8960)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.080) (::0.067))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8961)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.068) (::0.063))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8962)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.065) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8963)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.065) (::0.060))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8964)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.064))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8965)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8966)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8967)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.081) (::0.061))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8968)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8969)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8970)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.081) (::0.068))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8971)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8972)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.065) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8973)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.063))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8974)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8975)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8976)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.069) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8977)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8978)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8979)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.066) (::0.058))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8980)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.065) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8981)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.262) (::0.212))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.236) (::0.212)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.187) (::0.180)))
+          (IOPATH B0 Y (::0.139) (::0.093))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.153) (::0.104)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.139) (::0.093)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.140) (::0.103)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.109) (::0.092)))
+          (IOPATH A1 Y (::0.210) (::0.180))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.172) (::0.105)))
+          (IOPATH B1 Y (::0.172) (::0.105))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.262) (::0.187)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.243) (::0.186)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.210) (::0.158)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.192) (::0.157)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.118) (::0.092)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8983)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.156))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.175) (::0.156)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.187) (::0.180)))
+          (IOPATH B0 Y (::0.139) (::0.093))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.153) (::0.105)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.139) (::0.093)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.140) (::0.104)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.109) (::0.092)))
+          (IOPATH A1 Y (::0.210) (::0.180))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.172) (::0.106)))
+          (IOPATH B1 Y (::0.172) (::0.106))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.140)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.210) (::0.158)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.192) (::0.157)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.118) (::0.092)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8984)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.156))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.174) (::0.156)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.187) (::0.180)))
+          (IOPATH B0 Y (::0.139) (::0.093))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.154) (::0.105)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.139) (::0.093)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.141) (::0.104)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.109) (::0.092)))
+          (IOPATH A1 Y (::0.210) (::0.180))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.172) (::0.106)))
+          (IOPATH B1 Y (::0.172) (::0.106))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.181) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.210) (::0.158)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.192) (::0.157)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.118) (::0.092)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8985)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.152) (::0.173)))
+          (IOPATH A0 Y (::0.184) (::0.176))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.177) (::0.147)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.179) (::0.176)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.153) (::0.157)))
+          (IOPATH B0 Y (::0.153) (::0.157))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.150) (::0.130)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.149) (::0.102)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.150) (::0.140)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.151) (::0.108)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.142) (::0.105)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.144) (::0.132)))
+          (IOPATH A1 Y (::0.149) (::0.132))
+          (IOPATH B1 Y (::0.152) (::0.173))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.184) (::0.142)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.151) (::0.101)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8986)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.156))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.174) (::0.156)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.187) (::0.180)))
+          (IOPATH B0 Y (::0.139) (::0.093))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.154) (::0.105)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.139) (::0.093)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.141) (::0.104)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.109) (::0.092)))
+          (IOPATH A1 Y (::0.210) (::0.180))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.172) (::0.106)))
+          (IOPATH B1 Y (::0.172) (::0.106))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.181) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.210) (::0.158)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.192) (::0.157)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.118) (::0.092)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8987)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.188) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.167) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.187) (::0.180)))
+          (IOPATH B0 Y (::0.123) (::0.089))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.138) (::0.095)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.123) (::0.089)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.126) (::0.094)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.096) (::0.087)))
+          (IOPATH A1 Y (::0.210) (::0.180))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.154) (::0.096)))
+          (IOPATH B1 Y (::0.154) (::0.096))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.188) (::0.136)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.174) (::0.135)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.210) (::0.158)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.192) (::0.157)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.105) (::0.088)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8989)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.151) (::0.162)))
+          (IOPATH A0 Y (::0.157) (::0.153))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.152) (::0.132)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.153) (::0.153)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.169) (::0.171)))
+          (IOPATH B0 Y (::0.169) (::0.171))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.149) (::0.128)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.200) (::0.145)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.150) (::0.139)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.133)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.193) (::0.149)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.195) (::0.179)))
+          (IOPATH A1 Y (::0.200) (::0.179))
+          (IOPATH B1 Y (::0.151) (::0.162))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.157) (::0.122)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8990)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.189) (::0.146))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.163) (::0.146)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.182) (::0.178)))
+          (IOPATH B0 Y (::0.153) (::0.116))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.134) (::0.103)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.153) (::0.116)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.119) (::0.102)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.122) (::0.114)))
+          (IOPATH A1 Y (::0.207) (::0.178))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.148) (::0.103)))
+          (IOPATH B1 Y (::0.148) (::0.103))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.189) (::0.134)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.176) (::0.133)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.207) (::0.163)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.190) (::0.162)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.135) (::0.114)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8991)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.192) (::0.148))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.165) (::0.148)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.196) (::0.190)))
+          (IOPATH B0 Y (::0.185) (::0.134))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.136) (::0.104)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.185) (::0.134)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.120) (::0.103)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.150) (::0.133)))
+          (IOPATH A1 Y (::0.221) (::0.190))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.150) (::0.104)))
+          (IOPATH B1 Y (::0.150) (::0.104))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.192) (::0.135)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.178) (::0.135)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.221) (::0.173)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.204) (::0.172)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.164) (::0.133)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8992)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.151) (::0.162)))
+          (IOPATH A0 Y (::0.157) (::0.153))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.151) (::0.131)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.153) (::0.153)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.170)))
+          (IOPATH B0 Y (::0.168) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.149) (::0.128)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.149) (::0.139)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.178)))
+          (IOPATH A1 Y (::0.198) (::0.178))
+          (IOPATH B1 Y (::0.151) (::0.162))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.157) (::0.121)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8993)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.155) (::0.167)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.127)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.170)))
+          (IOPATH B0 Y (::0.168) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.153) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.143)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.178)))
+          (IOPATH A1 Y (::0.198) (::0.178))
+          (IOPATH B1 Y (::0.155) (::0.167))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.116)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8994)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.183) (::0.179)))
+          (IOPATH B0 Y (::0.154) (::0.116))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.154) (::0.116)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.115)))
+          (IOPATH A1 Y (::0.207) (::0.179))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.207) (::0.163)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.191) (::0.162)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.135) (::0.115)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8995)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.150) (::0.162)))
+          (IOPATH A0 Y (::0.156) (::0.152))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.151) (::0.131)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.152) (::0.152)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.171)))
+          (IOPATH B0 Y (::0.168) (::0.171))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.148) (::0.128)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.149) (::0.139)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.178)))
+          (IOPATH A1 Y (::0.198) (::0.178))
+          (IOPATH B1 Y (::0.150) (::0.162))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.156) (::0.121)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8996)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.152) (::0.163)))
+          (IOPATH A0 Y (::0.158) (::0.154))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.153) (::0.132)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.154) (::0.154)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.173) (::0.176)))
+          (IOPATH B0 Y (::0.173) (::0.176))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.150) (::0.129)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.191) (::0.140)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.150) (::0.140)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.137)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.185) (::0.144)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.187) (::0.172)))
+          (IOPATH A1 Y (::0.191) (::0.172))
+          (IOPATH B1 Y (::0.152) (::0.163))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.158) (::0.122)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8997)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.158) (::0.169)))
+          (IOPATH A0 Y (::0.155) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.149) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.151) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.173) (::0.176)))
+          (IOPATH B0 Y (::0.173) (::0.176))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.156) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.191) (::0.140)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.156) (::0.145)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.137)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.185) (::0.144)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.187) (::0.172)))
+          (IOPATH A1 Y (::0.191) (::0.172))
+          (IOPATH B1 Y (::0.158) (::0.169))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.155) (::0.118)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8998)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.197) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.191) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.100)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.156) (::0.138)))
+          (IOPATH A1 Y (::0.215) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.197) (::0.140)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.184) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.199) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g8999)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.189) (::0.146))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.163) (::0.146)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.194) (::0.188)))
+          (IOPATH B0 Y (::0.183) (::0.133))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.134) (::0.103)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.183) (::0.133)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.119) (::0.102)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.148) (::0.131)))
+          (IOPATH A1 Y (::0.219) (::0.188))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.148) (::0.103)))
+          (IOPATH B1 Y (::0.148) (::0.103))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.189) (::0.134)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.176) (::0.133)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.219) (::0.172)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.202) (::0.170)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.162) (::0.131)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9000)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.168)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.127)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.170)))
+          (IOPATH B0 Y (::0.168) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.178)))
+          (IOPATH A1 Y (::0.198) (::0.178))
+          (IOPATH B1 Y (::0.156) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9001)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.304) (::0.246))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.277) (::0.246)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.154) (::0.149)))
+          (IOPATH B0 Y (::0.192) (::0.137))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.135) (::0.104)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.137)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.120) (::0.103)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.136)))
+          (IOPATH A1 Y (::0.179) (::0.149))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.149) (::0.104)))
+          (IOPATH B1 Y (::0.149) (::0.104))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.304) (::0.225)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.287) (::0.223)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.179) (::0.137)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.164) (::0.136)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9002)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.162) (::0.167)))
+          (IOPATH B0 Y (::0.162) (::0.167))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.160) (::0.121)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.160) (::0.130)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.154) (::0.125)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.156) (::0.149)))
+          (IOPATH A1 Y (::0.160) (::0.149))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.160) (::0.121)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9003)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.197) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.183) (::0.179)))
+          (IOPATH B0 Y (::0.154) (::0.116))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.154) (::0.116)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.115)))
+          (IOPATH A1 Y (::0.207) (::0.179))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.197) (::0.140)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.184) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.207) (::0.163)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.191) (::0.162)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.135) (::0.115)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9004)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.183) (::0.179)))
+          (IOPATH B0 Y (::0.154) (::0.117))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.154) (::0.117)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.115)))
+          (IOPATH A1 Y (::0.208) (::0.179))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.208) (::0.164)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.192) (::0.163)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.136) (::0.116)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9005)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.170)))
+          (IOPATH B0 Y (::0.168) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.200) (::0.145)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.133)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.193) (::0.149)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.195) (::0.179)))
+          (IOPATH A1 Y (::0.200) (::0.179))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9006)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.190) (::0.146))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.164) (::0.146)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.260) (::0.251)))
+          (IOPATH B0 Y (::0.191) (::0.137))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.135) (::0.103)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.191) (::0.137)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.119) (::0.103)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.135)))
+          (IOPATH A1 Y (::0.287) (::0.251))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.149) (::0.104)))
+          (IOPATH B1 Y (::0.149) (::0.104))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.190) (::0.134)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.176) (::0.134)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.287) (::0.228)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.267) (::0.226)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.169) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9007)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.151))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.151)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.190) (::0.183)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.215) (::0.183))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.167)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.198) (::0.166)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9008)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.151) (::0.162)))
+          (IOPATH A0 Y (::0.158) (::0.154))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.152) (::0.132)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.154) (::0.154)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.169) (::0.172)))
+          (IOPATH B0 Y (::0.169) (::0.172))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.149) (::0.128)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.145)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.149) (::0.139)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.133)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.193) (::0.149)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.179)))
+          (IOPATH A1 Y (::0.199) (::0.179))
+          (IOPATH B1 Y (::0.151) (::0.162))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.158) (::0.122)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9009)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.192) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.216) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.216) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.200) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9010)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.197) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.192) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.216) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.197) (::0.140)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.184) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.216) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.200) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9011)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.149) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.229) (::0.230)))
+          (IOPATH B0 Y (::0.229) (::0.230))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.156) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.143)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.156) (::0.145)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.226) (::0.174)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.193) (::0.147)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.176)))
+          (IOPATH A1 Y (::0.199) (::0.176))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.227) (::0.162)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9012)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.191) (::0.147))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.165) (::0.147)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.183) (::0.179)))
+          (IOPATH B0 Y (::0.154) (::0.116))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.135) (::0.103)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.154) (::0.116)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.119) (::0.103)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.115)))
+          (IOPATH A1 Y (::0.207) (::0.179))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.149) (::0.104)))
+          (IOPATH B1 Y (::0.149) (::0.104))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.191) (::0.135)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.177) (::0.134)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.207) (::0.163)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.191) (::0.162)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.135) (::0.115)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9013)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.172) (::0.175)))
+          (IOPATH B0 Y (::0.172) (::0.175))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.190) (::0.139)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.170) (::0.136)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.184) (::0.143)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.186) (::0.171)))
+          (IOPATH A1 Y (::0.190) (::0.171))
+          (IOPATH B1 Y (::0.156) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.170) (::0.126)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9014)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.151))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.151)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.260) (::0.251)))
+          (IOPATH B0 Y (::0.191) (::0.137))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.191) (::0.137)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.135)))
+          (IOPATH A1 Y (::0.287) (::0.251))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.287) (::0.228)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.267) (::0.226)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.169) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9015)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.151))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.151)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.192) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.216) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.216) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.200) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9016)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.158) (::0.169)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.149) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.173) (::0.176)))
+          (IOPATH B0 Y (::0.173) (::0.176))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.156) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.191) (::0.140)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.156) (::0.145)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.137)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.185) (::0.144)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.187) (::0.172)))
+          (IOPATH A1 Y (::0.191) (::0.172))
+          (IOPATH B1 Y (::0.158) (::0.169))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.118)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9017)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.167)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.127)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.228) (::0.228)))
+          (IOPATH B0 Y (::0.228) (::0.228))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.142)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.225) (::0.172)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.146)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.176)))
+          (IOPATH A1 Y (::0.198) (::0.176))
+          (IOPATH B1 Y (::0.156) (::0.167))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.116)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.225) (::0.160)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9018)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.183) (::0.179)))
+          (IOPATH B0 Y (::0.154) (::0.117))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.154) (::0.117)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.115)))
+          (IOPATH A1 Y (::0.208) (::0.179))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.208) (::0.164)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.192) (::0.163)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.136) (::0.116)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9019)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.167)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.161) (::0.166)))
+          (IOPATH B0 Y (::0.161) (::0.166))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.159) (::0.120)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.159) (::0.130)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.154) (::0.125)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.155) (::0.148)))
+          (IOPATH A1 Y (::0.159) (::0.148))
+          (IOPATH B1 Y (::0.156) (::0.167))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.159) (::0.121)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9020)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.170)))
+          (IOPATH B0 Y (::0.168) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.156) (::0.145)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.149)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.179)))
+          (IOPATH A1 Y (::0.199) (::0.179))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9021)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.191) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.215) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.199) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9022)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.152) (::0.163)))
+          (IOPATH A0 Y (::0.158) (::0.154))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.152) (::0.132)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.154) (::0.154)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.169) (::0.172)))
+          (IOPATH B0 Y (::0.169) (::0.172))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.150) (::0.129)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.145)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.150) (::0.140)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.133)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.193) (::0.149)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.179)))
+          (IOPATH A1 Y (::0.199) (::0.179))
+          (IOPATH B1 Y (::0.152) (::0.163))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.158) (::0.122)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9023)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.169) (::0.171)))
+          (IOPATH B0 Y (::0.169) (::0.171))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.145)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.133)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.149)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.179)))
+          (IOPATH A1 Y (::0.199) (::0.179))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9024)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.261) (::0.252)))
+          (IOPATH B0 Y (::0.192) (::0.137))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.137)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.136)))
+          (IOPATH A1 Y (::0.288) (::0.252))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.140)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.288) (::0.228)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.268) (::0.227)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9025)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.191) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.215) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.199) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9026)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.190) (::0.183)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.215) (::0.183))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.167)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.198) (::0.166)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9027)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.169) (::0.171)))
+          (IOPATH B0 Y (::0.169) (::0.171))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.200) (::0.145)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.133)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.193) (::0.149)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.195) (::0.179)))
+          (IOPATH A1 Y (::0.200) (::0.179))
+          (IOPATH B1 Y (::0.156) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9028)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.167)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.127)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.167) (::0.170)))
+          (IOPATH B0 Y (::0.167) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.165) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.178)))
+          (IOPATH A1 Y (::0.199) (::0.178))
+          (IOPATH B1 Y (::0.156) (::0.167))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.116)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.165) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9029)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.229) (::0.180))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.203) (::0.180)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.154) (::0.149)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.135) (::0.104)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.120) (::0.103)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.156) (::0.138)))
+          (IOPATH A1 Y (::0.179) (::0.149))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.149) (::0.104)))
+          (IOPATH B1 Y (::0.149) (::0.104))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.229) (::0.165)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.214) (::0.164)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.179) (::0.137)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.164) (::0.136)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9030)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.167)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.127)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.228) (::0.228)))
+          (IOPATH B0 Y (::0.228) (::0.228))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.142)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.225) (::0.172)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.146)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.176)))
+          (IOPATH A1 Y (::0.198) (::0.176))
+          (IOPATH B1 Y (::0.156) (::0.167))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.225) (::0.160)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9031)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.304) (::0.246))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.277) (::0.246)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.154) (::0.149)))
+          (IOPATH B0 Y (::0.191) (::0.137))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.136) (::0.104)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.191) (::0.137)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.120) (::0.104)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.135)))
+          (IOPATH A1 Y (::0.178) (::0.149))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.150) (::0.105)))
+          (IOPATH B1 Y (::0.150) (::0.105))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.304) (::0.224)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.286) (::0.223)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.178) (::0.137)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.163) (::0.136)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.169) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9032)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.228) (::0.229)))
+          (IOPATH B0 Y (::0.228) (::0.229))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.142)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.226) (::0.173)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.147)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.176)))
+          (IOPATH A1 Y (::0.199) (::0.176))
+          (IOPATH B1 Y (::0.156) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.226) (::0.161)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9033)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.195) (::0.151))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.169) (::0.151)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.190) (::0.183)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.115) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.215) (::0.183))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.195) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.167)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.198) (::0.166)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9034)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.152) (::0.163)))
+          (IOPATH A0 Y (::0.158) (::0.154))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.152) (::0.132)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.154) (::0.154)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.169) (::0.171)))
+          (IOPATH B0 Y (::0.169) (::0.171))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.150) (::0.129)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.200) (::0.145)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.150) (::0.140)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.133)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.193) (::0.149)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.195) (::0.179)))
+          (IOPATH A1 Y (::0.200) (::0.179))
+          (IOPATH B1 Y (::0.152) (::0.163))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.158) (::0.122)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9035)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.228) (::0.180))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.202) (::0.180)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.161) (::0.154)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.185) (::0.154))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.228) (::0.165)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.214) (::0.164)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.185) (::0.142)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.170) (::0.141)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9036)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.167)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.127)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.170)))
+          (IOPATH B0 Y (::0.168) (::0.170))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.178)))
+          (IOPATH A1 Y (::0.198) (::0.178))
+          (IOPATH B1 Y (::0.156) (::0.167))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.116)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.123)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9037)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.183) (::0.179)))
+          (IOPATH B0 Y (::0.154) (::0.117))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.154) (::0.117)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.115)))
+          (IOPATH A1 Y (::0.208) (::0.179))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.140)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.208) (::0.164)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.192) (::0.163)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.136) (::0.116)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9038)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.169) (::0.171)))
+          (IOPATH B0 Y (::0.169) (::0.171))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.133)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.154) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.133)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.178)))
+          (IOPATH A1 Y (::0.199) (::0.178))
+          (IOPATH B1 Y (::0.156) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9039)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.149) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.173) (::0.176)))
+          (IOPATH B0 Y (::0.173) (::0.176))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.156) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.191) (::0.140)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.156) (::0.145)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.137)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.185) (::0.144)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.187) (::0.172)))
+          (IOPATH A1 Y (::0.191) (::0.172))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9040)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.191) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.215) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.199) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9041)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.156) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.149) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.173) (::0.176)))
+          (IOPATH B0 Y (::0.173) (::0.176))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.191) (::0.140)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.137)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.185) (::0.144)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.187) (::0.172)))
+          (IOPATH A1 Y (::0.191) (::0.172))
+          (IOPATH B1 Y (::0.156) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9042)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.197) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.183) (::0.179)))
+          (IOPATH B0 Y (::0.154) (::0.116))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.154) (::0.116)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.115)))
+          (IOPATH A1 Y (::0.207) (::0.179))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.197) (::0.140)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.184) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.207) (::0.163)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.191) (::0.162)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.135) (::0.115)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9043)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.191) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.156) (::0.138)))
+          (IOPATH A1 Y (::0.216) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.216) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.199) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9044)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.191) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.215) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.199) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9045)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.197) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.191) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.100)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.156) (::0.138)))
+          (IOPATH A1 Y (::0.216) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.197) (::0.140)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.184) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.216) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.199) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9046)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.195) (::0.151))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.151)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.194) (::0.188)))
+          (IOPATH B0 Y (::0.183) (::0.133))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.130) (::0.099)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.183) (::0.133)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.115) (::0.098)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.148) (::0.131)))
+          (IOPATH A1 Y (::0.219) (::0.188))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.144) (::0.100)))
+          (IOPATH B1 Y (::0.144) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.195) (::0.138)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.219) (::0.172)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.202) (::0.170)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.162) (::0.131)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9047)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.169) (::0.171)))
+          (IOPATH B0 Y (::0.169) (::0.171))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.145)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.133)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.149)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.179)))
+          (IOPATH A1 Y (::0.199) (::0.179))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9048)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.152) (::0.164)))
+          (IOPATH A0 Y (::0.159) (::0.155))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.154) (::0.133)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.155) (::0.155)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.173) (::0.176)))
+          (IOPATH B0 Y (::0.173) (::0.176))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.150) (::0.130)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.191) (::0.140)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.150) (::0.140)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.137)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.185) (::0.144)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.187) (::0.172)))
+          (IOPATH A1 Y (::0.191) (::0.172))
+          (IOPATH B1 Y (::0.152) (::0.164))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.159) (::0.124)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9049)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.149) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.173) (::0.176)))
+          (IOPATH B0 Y (::0.173) (::0.176))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.191) (::0.140)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.145)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.137)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.185) (::0.144)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.187) (::0.172)))
+          (IOPATH A1 Y (::0.191) (::0.172))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9050)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.149) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.173) (::0.176)))
+          (IOPATH B0 Y (::0.173) (::0.176))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.156) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.191) (::0.140)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.156) (::0.145)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.137)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.185) (::0.144)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.187) (::0.172)))
+          (IOPATH A1 Y (::0.191) (::0.172))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.171) (::0.127)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9051)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.157) (::0.168)))
+          (IOPATH A0 Y (::0.154) (::0.150))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.148) (::0.128)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.150) (::0.150)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.169) (::0.171)))
+          (IOPATH B0 Y (::0.169) (::0.171))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.134)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.199) (::0.145)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.155) (::0.144)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.133)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.149)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.194) (::0.179)))
+          (IOPATH A1 Y (::0.199) (::0.179))
+          (IOPATH B1 Y (::0.157) (::0.168))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.154) (::0.117)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.167) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9052)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.228) (::0.180))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.202) (::0.180)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.154) (::0.149)))
+          (IOPATH B0 Y (::0.137) (::0.104))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.191) (::0.138)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.137) (::0.104)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.173) (::0.138)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.108) (::0.102)))
+          (IOPATH A1 Y (::0.178) (::0.149))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.208) (::0.140)))
+          (IOPATH B1 Y (::0.208) (::0.140))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.228) (::0.165)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.214) (::0.164)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.178) (::0.137)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.163) (::0.136)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.120) (::0.103)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9053)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.183) (::0.179)))
+          (IOPATH B0 Y (::0.154) (::0.116))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.154) (::0.116)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.115)))
+          (IOPATH A1 Y (::0.207) (::0.179))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.207) (::0.163)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.191) (::0.162)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.135) (::0.115)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9054)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (COND (A0&~A1&~B0) (IOPATH B1 Y (::0.155) (::0.167)))
+          (IOPATH A0 Y (::0.153) (::0.149))
+          (COND (~A1&B0&~B1) (IOPATH A0 Y (::0.147) (::0.127)))
+          (COND (~A1&~B0&B1) (IOPATH A0 Y (::0.149) (::0.149)))
+          (COND (A0&~A1&~B1) (IOPATH B0 Y (::0.168) (::0.171)))
+          (IOPATH B0 Y (::0.168) (::0.171))
+          (COND (A0&A1&~B0) (IOPATH B1 Y (::0.153) (::0.132)))
+          (COND (~A0&B0&B1) (IOPATH A1 Y (::0.198) (::0.144)))
+          (COND (~A0&A1&~B0) (IOPATH B1 Y (::0.153) (::0.143)))
+          (COND (~A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.132)))
+          (COND (~A0&B0&~B1) (IOPATH A1 Y (::0.192) (::0.148)))
+          (COND (~A0&~B0&B1) (IOPATH A1 Y (::0.193) (::0.178)))
+          (IOPATH A1 Y (::0.198) (::0.178))
+          (IOPATH B1 Y (::0.155) (::0.167))
+          (COND (~A1&B0&B1) (IOPATH A0 Y (::0.153) (::0.116)))
+          (COND (A0&A1&~B1) (IOPATH B0 Y (::0.166) (::0.124)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9055)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.304) (::0.246))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.277) (::0.246)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.161) (::0.154)))
+          (IOPATH B0 Y (::0.191) (::0.137))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.191) (::0.137)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.135)))
+          (IOPATH A1 Y (::0.185) (::0.154))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.304) (::0.224)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.286) (::0.223)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.185) (::0.142)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.170) (::0.141)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.169) (::0.136)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9056)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.192) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.216) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.216) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.200) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9057)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.191) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.156) (::0.138)))
+          (IOPATH A1 Y (::0.215) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.183) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.199) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.138)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9058)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.196) (::0.151))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.170) (::0.151)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.191) (::0.184)))
+          (IOPATH B0 Y (::0.192) (::0.139))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.192) (::0.139)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.099)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.155) (::0.137)))
+          (IOPATH A1 Y (::0.215) (::0.184))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.100)))
+          (IOPATH B1 Y (::0.145) (::0.100))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.196) (::0.139)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.182) (::0.138)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.215) (::0.168)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.199) (::0.167)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.170) (::0.137)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9059)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.197) (::0.152))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.171) (::0.152)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.183) (::0.179)))
+          (IOPATH B0 Y (::0.154) (::0.117))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.131) (::0.100)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.154) (::0.117)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.116) (::0.100)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.123) (::0.115)))
+          (IOPATH A1 Y (::0.208) (::0.179))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.145) (::0.101)))
+          (IOPATH B1 Y (::0.145) (::0.101))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.197) (::0.140)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.184) (::0.139)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.208) (::0.164)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.192) (::0.163)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.136) (::0.116)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9060)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.057) (::0.061))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9061)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.095) (::0.082))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9062)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.103) (::0.091))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9063)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.110) (::0.072))
+          (IOPATH B Y (::0.156) (::0.094))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9064)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.096) (::0.066))
+          (IOPATH B Y (::0.147) (::0.082))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9065)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.095) (::0.066))
+          (IOPATH B Y (::0.147) (::0.082))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9066)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.108) (::0.071))
+          (IOPATH B Y (::0.175) (::0.099))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9067)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.113) (::0.076))
+          (IOPATH B Y (::0.175) (::0.099))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9068)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.108) (::0.071))
+          (IOPATH B Y (::0.175) (::0.099))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9069)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.107) (::0.070))
+          (IOPATH B Y (::0.175) (::0.099))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9070)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.094) (::0.065))
+          (IOPATH B Y (::0.147) (::0.082))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9071)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.080) (::0.053))
+          (IOPATH B Y (::0.125) (::0.077))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9072)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.197) (::0.130))
+          (IOPATH B Y (::0.209) (::0.138))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9073)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.132) (::0.145))
+          (IOPATH B Y (::0.221) (::0.207))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9074)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.114) (::0.123))
+          (IOPATH B Y (::0.193) (::0.174))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9075)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.143) (::0.159))
+          (IOPATH B Y (::0.239) (::0.228))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9077)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.095) (::0.082))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9078)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.058) (::0.061))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9079)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::2.422) (::2.383))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9080)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.058) (::0.061))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9081)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.099) (::0.085))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9082)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.102) (::0.082))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9083)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.060) (::0.062))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9084)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.117) (::0.126))
+          (IOPATH B Y (::0.197) (::0.178))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9085)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.220) (::0.150))
+          (IOPATH B Y (::0.165) (::0.106))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9086)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.146) (::0.163))
+          (IOPATH B Y (::0.243) (::0.234))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9087)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.131) (::0.144))
+          (IOPATH B Y (::0.221) (::0.207))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9088)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.226) (::0.151))
+          (IOPATH B Y (::0.185) (::0.122))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9089)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.144) (::0.161))
+          (IOPATH B Y (::0.241) (::0.231))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__or2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9090)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::1.708) (::1.658))
+          (IOPATH B Y (::1.706) (::1.666))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9091)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.226) (::0.151))
+          (IOPATH B Y (::0.184) (::0.121))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9092)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.232) (::0.236))
+          (IOPATH B Y (::0.150) (::0.160))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9093)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.133) (::0.146))
+          (IOPATH B Y (::0.223) (::0.209))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9094)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.211) (::0.210))
+          (IOPATH B Y (::0.138) (::0.144))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nor2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9095)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.226) (::0.151))
+          (IOPATH B Y (::0.222) (::0.148))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__nand2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9096)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.144) (::0.161))
+          (IOPATH B Y (::0.241) (::0.231))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9097)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.063) (::0.055))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9098)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.072) (::0.067))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9099)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.074) (::0.066))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9100)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.076) (::0.067))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9101)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.063) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9105)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.074) (::0.066))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9106)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.076) (::0.068))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_2")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9107)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::2.452) (::2.416))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9112)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::1.720) (::1.623))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9113)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::1.645) (::1.562))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9120)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.100) (::0.089))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9121)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.174) (::0.161))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9122)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.176) (::0.162))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9123)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.174) (::0.161))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9124)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.175) (::0.161))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9125)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.176) (::0.162))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9126)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.185) (::0.172))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9127)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.182) (::0.168))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9128)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.175) (::0.161))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9129)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.183) (::0.169))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9130)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.180) (::0.163))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9131)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.289) (::0.254))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9132)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.331) (::0.299))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9133)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.372) (::0.354))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_4")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9134)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.631) (::0.602))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9135)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.312) (::0.293))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9136)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.375) (::0.358))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9138)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.056) (::0.051))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9139)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.072) (::0.067))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9140)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.072) (::0.067))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9141)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.085) (::0.079))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9142)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.074) (::0.066))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9143)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.075) (::0.067))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9146)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::1.666) (::1.574))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9148)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::1.663) (::1.583))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_2")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9156)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::2.453) (::2.408))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9157)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::1.690) (::1.602))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__buf_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9158)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::1.645) (::1.562))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9159)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.176) (::0.162))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9160)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.176) (::0.162))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9161)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.182) (::0.168))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9162)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.176) (::0.162))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9163)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.174) (::0.161))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9164)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.176) (::0.162))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9165)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.370) (::0.353))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9166)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.374) (::0.357))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9167)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.385) (::0.366))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g3)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.057) (::0.049))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g2)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.074) (::0.070)))
+          (IOPATH A0 Y (::0.121) (::0.103))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.097) (::0.071)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.080) (::0.070)))
+          (IOPATH B0 Y (::0.097) (::0.071))
+          (IOPATH A1 Y (::0.128) (::0.107))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9168)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.060) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9169)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.093) (::0.071)))
+          (IOPATH A0 Y (::0.099) (::0.088))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.095) (::0.100)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.094) (::0.081)))
+          (IOPATH B0 Y (::0.095) (::0.081))
+          (IOPATH A1 Y (::0.143) (::0.120))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9170)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.056) (::0.048))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9171)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.069) (::0.067)))
+          (IOPATH A0 Y (::0.119) (::0.103))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.091) (::0.069)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.076) (::0.068)))
+          (IOPATH B0 Y (::0.091) (::0.069))
+          (IOPATH A1 Y (::0.104) (::0.100))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9172)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.058) (::0.052))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9173)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.075) (::0.065)))
+          (IOPATH A0 Y (::0.099) (::0.088))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.076) (::0.091)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.076) (::0.074)))
+          (IOPATH B0 Y (::0.076) (::0.074))
+          (IOPATH A1 Y (::0.143) (::0.114))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9174)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.056) (::0.050))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9175)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.077) (::0.074)))
+          (IOPATH A0 Y (::0.119) (::0.102))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.101) (::0.075)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.084) (::0.074)))
+          (IOPATH B0 Y (::0.101) (::0.075))
+          (IOPATH A1 Y (::0.109) (::0.101))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9176)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.059) (::0.054))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9177)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.093) (::0.074)))
+          (IOPATH A0 Y (::0.099) (::0.088))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.095) (::0.103)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.093) (::0.084)))
+          (IOPATH B0 Y (::0.095) (::0.084))
+          (IOPATH A1 Y (::0.119) (::0.106))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9178)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.056) (::0.048))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9179)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.069) (::0.070)))
+          (IOPATH A0 Y (::0.119) (::0.103))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.091) (::0.072)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.075) (::0.071)))
+          (IOPATH B0 Y (::0.091) (::0.072))
+          (IOPATH A1 Y (::0.109) (::0.101))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9180)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.058) (::0.052))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9181)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.075) (::0.065)))
+          (IOPATH A0 Y (::0.099) (::0.088))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.076) (::0.091)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.075) (::0.074)))
+          (IOPATH B0 Y (::0.076) (::0.074))
+          (IOPATH A1 Y (::0.143) (::0.114))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9182)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.056) (::0.048))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9183)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.069) (::0.067)))
+          (IOPATH A0 Y (::0.119) (::0.102))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.091) (::0.069)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.075) (::0.068)))
+          (IOPATH B0 Y (::0.091) (::0.069))
+          (IOPATH A1 Y (::0.105) (::0.100))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9184)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.058) (::0.052))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9185)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.082) (::0.069)))
+          (IOPATH A0 Y (::0.099) (::0.088))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.084) (::0.096)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.082) (::0.078)))
+          (IOPATH B0 Y (::0.084) (::0.078))
+          (IOPATH A1 Y (::0.118) (::0.105))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9186)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.056) (::0.048))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9187)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (~A0&~A1) (IOPATH B0 Y (::0.069) (::0.072)))
+          (IOPATH A0 Y (::0.121) (::0.102))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.091) (::0.073)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.075) (::0.072)))
+          (IOPATH B0 Y (::0.091) (::0.073))
+          (IOPATH A1 Y (::0.107) (::0.099))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9188)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.058) (::0.052))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9189)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.081) (::0.068)))
+          (IOPATH A0 Y (::0.099) (::0.087))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.082) (::0.095)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.081) (::0.077)))
+          (IOPATH B0 Y (::0.082) (::0.077))
+          (IOPATH A1 Y (::0.132) (::0.115))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9190)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.115) (::0.101))
+          (IOPATH B Y (::0.110) (::0.102))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9191)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.115) (::0.101))
+          (IOPATH B Y (::0.110) (::0.102))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9192)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.115) (::0.101))
+          (IOPATH B Y (::0.110) (::0.102))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9193)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.152) (::0.137)))
+          (COND ~B (IOPATH A Y (::0.140) (::0.121)))
+          (COND A (IOPATH B Y (::0.143) (::0.126)))
+          (COND B (IOPATH A Y (::0.115) (::0.089)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9194)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.200) (::0.172)))
+          (COND ~B (IOPATH A Y (::0.170) (::0.144)))
+          (COND A (IOPATH B Y (::0.204) (::0.183)))
+          (COND B (IOPATH A Y (::0.213) (::0.186)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9195)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.182) (::0.154)))
+          (COND ~B (IOPATH A Y (::0.157) (::0.138)))
+          (COND A (IOPATH B Y (::0.187) (::0.169)))
+          (COND B (IOPATH A Y (::0.204) (::0.177)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9196)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.213) (::0.177)))
+          (COND ~B (IOPATH A Y (::0.159) (::0.135)))
+          (COND A (IOPATH B Y (::0.202) (::0.196)))
+          (COND B (IOPATH A Y (::0.201) (::0.179)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__and2_1")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9197)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (IOPATH A Y (::0.132) (::0.112))
+          (IOPATH B Y (::0.117) (::0.107))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__xnor2_l")
+     (INSTANCE csa_tree_add1_add_30_16_groupi_g9198)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (COND ~A (IOPATH B Y (::0.149) (::0.131)))
+          (COND ~B (IOPATH A Y (::0.148) (::0.124)))
+          (COND A (IOPATH B Y (::0.153) (::0.145)))
+          (COND B (IOPATH A Y (::0.179) (::0.175)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE g2)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.084) (::0.071)))
+          (IOPATH A0 Y (::0.190) (::0.128))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.085) (::0.098)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.084) (::0.081)))
+          (IOPATH B0 Y (::0.085) (::0.081))
+          (IOPATH A1 Y (::0.115) (::0.102))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE g9202)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.084) (::0.071)))
+          (IOPATH A0 Y (::0.095) (::0.085))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.085) (::0.098)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.084) (::0.081)))
+          (IOPATH B0 Y (::0.085) (::0.081))
+          (IOPATH A1 Y (::0.217) (::0.169))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__inv_l")
+     (INSTANCE g3)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (IOPATH A Y (::0.077) (::0.072))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__oai21_l")
+     (INSTANCE g9204)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (COND (A0&A1) (IOPATH B0 Y (::0.135) (::0.122)))
+          (IOPATH A0 Y (::0.168) (::0.146))
+          (COND (~A0&A1) (IOPATH B0 Y (::0.136) (::0.151)))
+          (COND (A0&~A1) (IOPATH B0 Y (::0.135) (::0.143)))
+          (IOPATH B0 Y (::0.136) (::0.143))
+          (IOPATH A1 Y (::0.170) (::0.132))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE g9205)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.170) (::0.136))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.142) (::0.136)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.139) (::0.147)))
+          (IOPATH B0 Y (::0.111) (::0.076))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.112) (::0.080)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.111) (::0.076)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.096) (::0.080)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.082) (::0.075)))
+          (IOPATH A1 Y (::0.166) (::0.147))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.126) (::0.081)))
+          (IOPATH B1 Y (::0.126) (::0.081))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.170) (::0.124)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.157) (::0.124)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.166) (::0.135)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.150) (::0.134)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.095) (::0.076)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__aoi22_l")
+     (INSTANCE g9206)
+     (DELAY
+        (ABSOLUTE
+          (PORT A0 (::0.000))
+          (PORT A1 (::0.000))
+          (PORT B0 (::0.000))
+          (PORT B1 (::0.000))
+          (IOPATH A0 Y (::0.154) (::0.111))
+          (COND (A1&~B0&~B1) (IOPATH A0 Y (::0.124) (::0.111)))
+          (COND (A0&~B0&~B1) (IOPATH A1 Y (::0.117) (::0.112)))
+          (IOPATH B0 Y (::0.146) (::0.115))
+          (COND (A0&~A1&B0) (IOPATH B1 Y (::0.128) (::0.101)))
+          (COND (~A0&A1&B1) (IOPATH B0 Y (::0.146) (::0.115)))
+          (COND (~A0&~A1&B0) (IOPATH B1 Y (::0.113) (::0.100)))
+          (COND (~A0&~A1&B1) (IOPATH B0 Y (::0.116) (::0.114)))
+          (IOPATH A1 Y (::0.145) (::0.112))
+          (COND (~A0&A1&B0) (IOPATH B1 Y (::0.143) (::0.102)))
+          (IOPATH B1 Y (::0.143) (::0.102))
+          (COND (A1&B0&~B1) (IOPATH A0 Y (::0.154) (::0.099)))
+          (COND (A1&~B0&B1) (IOPATH A0 Y (::0.140) (::0.099)))
+          (COND (A0&B0&~B1) (IOPATH A1 Y (::0.145) (::0.101)))
+          (COND (A0&~B0&B1) (IOPATH A1 Y (::0.129) (::0.100)))
+          (COND (A0&~A1&B1) (IOPATH B0 Y (::0.128) (::0.114)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__addf_l")
+     (INSTANCE g9207)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (PORT CI (::0.000))
+          (COND (~A&~B&CI) (IOPATH CON CO (::0.107) ()))
+          (COND (~A&B&~CI) (IOPATH CON CO (::0.107) ()))
+          (COND (A&~B&CI) (IOPATH CON CO () (::0.107)))
+          (COND (A&B&~CI) (IOPATH CON CO () (::0.107)))
+          (IOPATH B CO (::0.291) (::0.334))
+          (COND (A&~CI) (IOPATH B CO (::0.306) (::0.342)))
+          (IOPATH CI CO (::0.308) (::0.332))
+          (COND (~A&B) (IOPATH CI CO (::0.279) (::0.332)))
+          (COND (~A&~B&~CI) (IOPATH CON CO (::0.107) ()))
+          (COND (A&~B&~CI) (IOPATH CON CO (::0.107) ()))
+          (IOPATH CON CO (::0.107) (::0.107))
+          (IOPATH A CO (::0.317) (::0.361))
+          (COND (~A&B&CI) (IOPATH CON CO () (::0.107)))
+          (COND (B&~CI) (IOPATH A CO (::0.298) (::0.361)))
+          (COND (~B&CI) (IOPATH A CO (::0.317) (::0.346)))
+          (COND (~A&CI) (IOPATH B CO (::0.291) (::0.334)))
+          (COND (A&~B) (IOPATH CI CO (::0.308) (::0.315)))
+          (COND (A&B&CI) (IOPATH CON CO () (::0.107)))
+          (COND (~A&B) (IOPATH CI CON (::0.141) (::0.107)))
+          (COND (A&~B) (IOPATH CI CON (::0.126) (::0.133)))
+          (IOPATH CI CON (::0.141) (::0.133))
+          (COND (~A&CI) (IOPATH B CON (::0.152) (::0.120)))
+          (COND (A&~CI) (IOPATH B CON (::0.154) (::0.142)))
+          (COND (~B&CI) (IOPATH A CON (::0.163) (::0.140)))
+          (COND (B&~CI) (IOPATH A CON (::0.169) (::0.134)))
+          (IOPATH A CON (::0.169) (::0.140))
+          (IOPATH B CON (::0.152) (::0.142))
+          (COND (~A&~B&CI) (IOPATH CON S () (::0.156)))
+          (COND (~A&B&~CI) (IOPATH CON S () (::0.144)))
+          (COND (A&~B&CI) (IOPATH CON S (::0.154) ()))
+          (COND (A&B&~CI) (IOPATH CON S (::0.151) ()))
+          (COND (~B&~CI) (IOPATH A S (::0.197) (::0.246)))
+          (IOPATH B S (::0.405) (::0.331))
+          (COND (~A&~CI) (IOPATH B S (::0.167) (::0.205)))
+          (COND (~A&B) (IOPATH CI S (::0.343) (::0.319)))
+          (COND (A&~CI) (IOPATH B S (::0.390) (::0.329)))
+          (IOPATH CI S (::0.357) (::0.336))
+          (COND (A&B) (IOPATH CI S (::0.197) (::0.189)))
+          (COND (B&CI) (IOPATH A S (::0.201) (::0.211)))
+          (COND (A&~B&~CI) (IOPATH CON S () (::0.152)))
+          (IOPATH CON S (::0.151) (::0.156))
+          (IOPATH A S (::0.394) (::0.346))
+          (COND (~A&B&CI) (IOPATH CON S (::0.150) ()))
+          (COND (~A&~B) (IOPATH CI S (::0.173) (::0.226)))
+          (COND (A&~B) (IOPATH CI S (::0.361) (::0.336)))
+          (COND (B&~CI) (IOPATH A S (::0.374) (::0.322)))
+          (COND (~B&CI) (IOPATH A S (::0.370) (::0.346)))
+          (COND (~A&CI) (IOPATH B S (::0.355) (::0.331)))
+          (COND (A&CI) (IOPATH B S (::0.210) (::0.200)))
+        )
+     )
+  )
+  (CELL
+     (CELLTYPE "sky130_osu_sc_18T_ms__addf_l")
+     (INSTANCE g9208)
+     (DELAY
+        (ABSOLUTE
+          (PORT A (::0.000))
+          (PORT B (::0.000))
+          (PORT CI (::0.000))
+          (COND (~A&~B&CI) (IOPATH CON CO (::0.076) ()))
+          (COND (~A&B&~CI) (IOPATH CON CO (::0.076) ()))
+          (COND (A&~B&CI) (IOPATH CON CO () (::0.074)))
+          (COND (A&B&~CI) (IOPATH CON CO () (::0.074)))
+          (IOPATH B CO (::0.208) (::0.248))
+          (COND (A&~CI) (IOPATH B CO (::0.230) (::0.254)))
+          (IOPATH CI CO (::0.221) (::0.232))
+          (COND (~A&B) (IOPATH CI CO (::0.196) (::0.232)))
+          (COND (~A&~B&~CI) (IOPATH CON CO (::0.076) ()))
+          (COND (A&~B&~CI) (IOPATH CON CO (::0.076) ()))
+          (IOPATH CON CO (::0.076) (::0.074))
+          (IOPATH A CO (::0.222) (::0.249))
+          (COND (~A&B&CI) (IOPATH CON CO () (::0.074)))
+          (COND (B&~CI) (IOPATH A CO (::0.212) (::0.249)))
+          (COND (~B&CI) (IOPATH A CO (::0.222) (::0.241)))
+          (COND (~A&CI) (IOPATH B CO (::0.208) (::0.248)))
+          (COND (A&~B) (IOPATH CI CO (::0.221) (::0.219)))
+          (COND (A&B&CI) (IOPATH CON CO () (::0.074)))
+          (COND (~A&B) (IOPATH CI CON (::0.187) (::0.143)))
+          (COND (A&~B) (IOPATH CI CON (::0.170) (::0.169)))
+          (IOPATH CI CON (::0.187) (::0.169))
+          (COND (~A&CI) (IOPATH B CON (::0.203) (::0.157)))
+          (COND (A&~CI) (IOPATH B CON (::0.207) (::0.180)))
+          (COND (~B&CI) (IOPATH A CON (::0.196) (::0.171)))
+          (COND (B&~CI) (IOPATH A CON (::0.204) (::0.162)))
+          (IOPATH A CON (::0.204) (::0.171))
+          (IOPATH B CON (::0.203) (::0.180))
+          (COND (~A&~B&CI) (IOPATH CON S () (::0.196)))
+          (COND (~A&B&~CI) (IOPATH CON S () (::0.181)))
+          (COND (A&~B&CI) (IOPATH CON S (::0.196) ()))
+          (COND (A&B&~CI) (IOPATH CON S (::0.195) ()))
+          (COND (~B&~CI) (IOPATH A S (::0.236) (::0.280)))
+          (IOPATH B S (::0.515) (::0.420))
+          (COND (~A&~CI) (IOPATH B S (::0.209) (::0.257)))
+          (COND (~A&B) (IOPATH CI S (::0.447) (::0.405)))
+          (COND (A&~CI) (IOPATH B S (::0.502) (::0.418)))
+          (IOPATH CI S (::0.459) (::0.428))
+          (COND (A&B) (IOPATH CI S (::0.240) (::0.232)))
+          (COND (B&CI) (IOPATH A S (::0.239) (::0.243)))
+          (COND (A&~B&~CI) (IOPATH CON S () (::0.194)))
+          (IOPATH CON S (::0.195) (::0.196))
+          (IOPATH A S (::0.492) (::0.432))
+          (COND (~A&B&CI) (IOPATH CON S (::0.192) ()))
+          (COND (~A&~B) (IOPATH CI S (::0.216) (::0.272)))
+          (COND (A&~B) (IOPATH CI S (::0.466) (::0.428)))
+          (COND (B&~CI) (IOPATH A S (::0.467) (::0.399)))
+          (COND (~B&CI) (IOPATH A S (::0.460) (::0.432)))
+          (COND (~A&CI) (IOPATH B S (::0.464) (::0.420)))
+          (COND (A&CI) (IOPATH B S (::0.256) (::0.253)))
+        )
+     )
+  )
+)
diff --git a/sky130_cds/synth/mult_seq.vh b/sky130_cds/synth/mult_seq.vh
new file mode 100755
index 000000000..e2a5867f9
--- /dev/null
+++ b/sky130_cds/synth/mult_seq.vh
@@ -0,0 +1,7964 @@
+
+// Generated by Cadence Genus(TM) Synthesis Solution 20.11-s111_1
+// Generated on: Aug  6 2022 12:33:09 CDT (Aug  6 2022 17:33:09 UTC)
+
+// Verification Directory fv/mult_seq 
+
+module flopenr_WIDTH32(clk, reset, en, d, q);
+  input clk, reset, en;
+  input [31:0] d;
+  output [31:0] q;
+  wire clk, reset, en;
+  wire [31:0] d;
+  wire [31:0] q;
+  wire UNCONNECTED, UNCONNECTED0, UNCONNECTED1, UNCONNECTED2,
+       UNCONNECTED3, UNCONNECTED4, UNCONNECTED5, UNCONNECTED6;
+  wire UNCONNECTED7, UNCONNECTED8, UNCONNECTED9, UNCONNECTED10,
+       UNCONNECTED11, UNCONNECTED12, UNCONNECTED13, UNCONNECTED14;
+  wire UNCONNECTED15, UNCONNECTED16, UNCONNECTED17, UNCONNECTED18,
+       UNCONNECTED19, UNCONNECTED20, UNCONNECTED21, UNCONNECTED22;
+  wire UNCONNECTED23, UNCONNECTED24, UNCONNECTED25, UNCONNECTED26,
+       UNCONNECTED27, UNCONNECTED28, UNCONNECTED29, UNCONNECTED30;
+  wire n_17, n_28, n_29, n_30, n_31, n_32, n_33, n_34;
+  wire n_35, n_36, n_37, n_38, n_39, n_40, n_41, n_42;
+  wire n_43, n_44, n_45, n_46, n_47, n_48, n_49, n_50;
+  wire n_51, n_52, n_53, n_54, n_55, n_56, n_57, n_58;
+  wire n_59, n_60, n_61, n_62, n_63, n_64, n_65, n_66;
+  wire n_67, n_68, n_69, n_70, n_71, n_72, n_73, n_74;
+  wire n_75, n_76, n_77, n_78, n_79, n_80, n_81, n_82;
+  wire n_83, n_84, n_85, n_86, n_87, n_88, n_89, n_90;
+  wire n_91, \q[0]_226 , \q[1]_227 , \q[3]_229 , \q[4]_230 , \q[5]_231
+       , \q[6]_232 , \q[7]_233 ;
+  wire \q[8]_234 , \q[9]_235 , \q[10]_236 , \q[11]_237 , \q[12]_238 ,
+       \q[13]_239 , \q[14]_240 , \q[15]_241 ;
+  wire \q[16]_242 , \q[19]_245 , \q[21]_247 , \q[23]_249 , \q[25]_251 ,
+       \q[26]_252 , \q[27]_253 , \q[28]_254 ;
+  wire \q[29]_255 , \q[30]_256 ;
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[22] (.CK (clk), .D (n_60), .Q
+       (q[22]), .QN (UNCONNECTED));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[1] (.CK (clk), .D (n_87), .Q
+       (UNCONNECTED0), .QN (\q[1]_227 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[11] (.CK (clk), .D (n_75), .Q
+       (UNCONNECTED1), .QN (\q[11]_237 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[12] (.CK (clk), .D (n_90), .Q
+       (UNCONNECTED2), .QN (\q[12]_238 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[13] (.CK (clk), .D (n_89), .Q
+       (UNCONNECTED3), .QN (\q[13]_239 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[14] (.CK (clk), .D (n_88), .Q
+       (UNCONNECTED4), .QN (\q[14]_240 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[15] (.CK (clk), .D (n_86), .Q
+       (UNCONNECTED5), .QN (\q[15]_241 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[16] (.CK (clk), .D (n_85), .Q
+       (UNCONNECTED6), .QN (\q[16]_242 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[17] (.CK (clk), .D (n_83), .Q
+       (q[17]), .QN (UNCONNECTED7));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[2] (.CK (clk), .D (n_84), .Q
+       (q[2]), .QN (UNCONNECTED8));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[18] (.CK (clk), .D (n_82), .Q
+       (q[18]), .QN (UNCONNECTED9));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[19] (.CK (clk), .D (n_79), .Q
+       (UNCONNECTED10), .QN (\q[19]_245 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[20] (.CK (clk), .D (n_78), .Q
+       (q[20]), .QN (UNCONNECTED11));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[3] (.CK (clk), .D (n_80), .Q
+       (UNCONNECTED12), .QN (\q[3]_229 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[21] (.CK (clk), .D (n_77), .Q
+       (UNCONNECTED13), .QN (\q[21]_247 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[0] (.CK (clk), .D (n_76), .Q
+       (UNCONNECTED14), .QN (\q[0]_226 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[10] (.CK (clk), .D (n_61), .Q
+       (UNCONNECTED15), .QN (\q[10]_236 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[23] (.CK (clk), .D (n_74), .Q
+       (UNCONNECTED16), .QN (\q[23]_249 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[5] (.CK (clk), .D (n_73), .Q
+       (UNCONNECTED17), .QN (\q[5]_231 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[6] (.CK (clk), .D (n_70), .Q
+       (UNCONNECTED18), .QN (\q[6]_232 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[24] (.CK (clk), .D (n_72), .Q
+       (q[24]), .QN (UNCONNECTED19));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[25] (.CK (clk), .D (n_71), .Q
+       (UNCONNECTED20), .QN (\q[25]_251 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[26] (.CK (clk), .D (n_69), .Q
+       (UNCONNECTED21), .QN (\q[26]_252 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[7] (.CK (clk), .D (n_65), .Q
+       (UNCONNECTED22), .QN (\q[7]_233 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[27] (.CK (clk), .D (n_68), .Q
+       (UNCONNECTED23), .QN (\q[27]_253 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[28] (.CK (clk), .D (n_67), .Q
+       (UNCONNECTED24), .QN (\q[28]_254 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[29] (.CK (clk), .D (n_66), .Q
+       (UNCONNECTED25), .QN (\q[29]_255 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[30] (.CK (clk), .D (n_81), .Q
+       (UNCONNECTED26), .QN (\q[30]_256 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[8] (.CK (clk), .D (n_64), .Q
+       (UNCONNECTED27), .QN (\q[8]_234 ));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[9] (.CK (clk), .D (n_62), .Q
+       (UNCONNECTED28), .QN (\q[9]_235 ));
+  sky130_osu_sc_18T_ms__dff_l \q_reg[31] (.CK (clk), .D (n_63), .Q
+       (q[31]), .QN (UNCONNECTED29));
+  sky130_osu_sc_18T_ms__dff_1 \q_reg[4] (.CK (clk), .D (n_91), .Q
+       (UNCONNECTED30), .QN (\q[4]_230 ));
+  sky130_osu_sc_18T_ms__nor2_1 g99__2398(.A (reset), .B (n_28), .Y
+       (n_91));
+  sky130_osu_sc_18T_ms__nor2_1 g100__5107(.A (reset), .B (n_44), .Y
+       (n_90));
+  sky130_osu_sc_18T_ms__nor2_1 g101__6260(.A (reset), .B (n_58), .Y
+       (n_89));
+  sky130_osu_sc_18T_ms__nor2_1 g102__4319(.A (reset), .B (n_57), .Y
+       (n_88));
+  sky130_osu_sc_18T_ms__nor2_1 g103__8428(.A (reset), .B (n_55), .Y
+       (n_87));
+  sky130_osu_sc_18T_ms__nor2_1 g104__5526(.A (reset), .B (n_54), .Y
+       (n_86));
+  sky130_osu_sc_18T_ms__nor2_1 g105__6783(.A (reset), .B (n_53), .Y
+       (n_85));
+  sky130_osu_sc_18T_ms__nor2_1 g106__3680(.A (reset), .B (n_48), .Y
+       (n_84));
+  sky130_osu_sc_18T_ms__nor2_1 g107__1617(.A (reset), .B (n_52), .Y
+       (n_83));
+  sky130_osu_sc_18T_ms__nor2_1 g108__2802(.A (reset), .B (n_50), .Y
+       (n_82));
+  sky130_osu_sc_18T_ms__nor2_1 g109__1705(.A (reset), .B (n_33), .Y
+       (n_81));
+  sky130_osu_sc_18T_ms__nor2_1 g110__5122(.A (reset), .B (n_47), .Y
+       (n_80));
+  sky130_osu_sc_18T_ms__nor2_1 g111__8246(.A (reset), .B (n_49), .Y
+       (n_79));
+  sky130_osu_sc_18T_ms__nor2_1 g112__7098(.A (reset), .B (n_46), .Y
+       (n_78));
+  sky130_osu_sc_18T_ms__nor2_1 g113__6131(.A (reset), .B (n_45), .Y
+       (n_77));
+  sky130_osu_sc_18T_ms__nor2_1 g114__1881(.A (reset), .B (n_51), .Y
+       (n_76));
+  sky130_osu_sc_18T_ms__nor2_1 g115__5115(.A (reset), .B (n_43), .Y
+       (n_75));
+  sky130_osu_sc_18T_ms__nor2_1 g116__7482(.A (reset), .B (n_41), .Y
+       (n_74));
+  sky130_osu_sc_18T_ms__nor2_1 g117__4733(.A (reset), .B (n_40), .Y
+       (n_73));
+  sky130_osu_sc_18T_ms__nor2_1 g118__6161(.A (reset), .B (n_56), .Y
+       (n_72));
+  sky130_osu_sc_18T_ms__nor2_1 g119__9315(.A (reset), .B (n_39), .Y
+       (n_71));
+  sky130_osu_sc_18T_ms__nor2_1 g120__9945(.A (reset), .B (n_38), .Y
+       (n_70));
+  sky130_osu_sc_18T_ms__nor2_1 g121__2883(.A (reset), .B (n_37), .Y
+       (n_69));
+  sky130_osu_sc_18T_ms__nor2_1 g122__2346(.A (reset), .B (n_36), .Y
+       (n_68));
+  sky130_osu_sc_18T_ms__nor2_1 g123__1666(.A (reset), .B (n_34), .Y
+       (n_67));
+  sky130_osu_sc_18T_ms__nor2_1 g124__7410(.A (reset), .B (n_42), .Y
+       (n_66));
+  sky130_osu_sc_18T_ms__nor2_1 g125__6417(.A (reset), .B (n_35), .Y
+       (n_65));
+  sky130_osu_sc_18T_ms__nor2_1 g126__5477(.A (reset), .B (n_32), .Y
+       (n_64));
+  sky130_osu_sc_18T_ms__nor2_1 g127__2398(.A (reset), .B (n_30), .Y
+       (n_63));
+  sky130_osu_sc_18T_ms__nor2_1 g128__5107(.A (reset), .B (n_31), .Y
+       (n_62));
+  sky130_osu_sc_18T_ms__nor2_1 g129__6260(.A (reset), .B (n_29), .Y
+       (n_61));
+  sky130_osu_sc_18T_ms__nor2_1 g130__4319(.A (reset), .B (n_59), .Y
+       (n_60));
+  sky130_osu_sc_18T_ms__aoi22_l g131__8428(.A0 (n_17), .A1 (q[22]), .B0
+       (d[22]), .B1 (en), .Y (n_59));
+  sky130_osu_sc_18T_ms__aoi22_l g132__5526(.A0 (n_17), .A1 (q[13]), .B0
+       (d[13]), .B1 (en), .Y (n_58));
+  sky130_osu_sc_18T_ms__aoi22_l g133__6783(.A0 (n_17), .A1 (q[14]), .B0
+       (d[14]), .B1 (en), .Y (n_57));
+  sky130_osu_sc_18T_ms__aoi22_l g134__3680(.A0 (n_17), .A1 (q[24]), .B0
+       (d[24]), .B1 (en), .Y (n_56));
+  sky130_osu_sc_18T_ms__aoi22_l g135__1617(.A0 (n_17), .A1 (q[1]), .B0
+       (d[1]), .B1 (en), .Y (n_55));
+  sky130_osu_sc_18T_ms__aoi22_l g136__2802(.A0 (n_17), .A1 (q[15]), .B0
+       (d[15]), .B1 (en), .Y (n_54));
+  sky130_osu_sc_18T_ms__aoi22_l g137__1705(.A0 (n_17), .A1 (q[16]), .B0
+       (d[16]), .B1 (en), .Y (n_53));
+  sky130_osu_sc_18T_ms__aoi22_l g138__5122(.A0 (n_17), .A1 (q[17]), .B0
+       (d[17]), .B1 (en), .Y (n_52));
+  sky130_osu_sc_18T_ms__aoi22_l g139__8246(.A0 (n_17), .A1 (q[0]), .B0
+       (d[0]), .B1 (en), .Y (n_51));
+  sky130_osu_sc_18T_ms__aoi22_l g140__7098(.A0 (n_17), .A1 (q[18]), .B0
+       (d[18]), .B1 (en), .Y (n_50));
+  sky130_osu_sc_18T_ms__aoi22_l g141__6131(.A0 (n_17), .A1 (q[19]), .B0
+       (d[19]), .B1 (en), .Y (n_49));
+  sky130_osu_sc_18T_ms__aoi22_l g142__1881(.A0 (n_17), .A1 (q[2]), .B0
+       (d[2]), .B1 (en), .Y (n_48));
+  sky130_osu_sc_18T_ms__aoi22_l g143__5115(.A0 (n_17), .A1 (q[3]), .B0
+       (d[3]), .B1 (en), .Y (n_47));
+  sky130_osu_sc_18T_ms__aoi22_l g144__7482(.A0 (n_17), .A1 (q[20]), .B0
+       (d[20]), .B1 (en), .Y (n_46));
+  sky130_osu_sc_18T_ms__aoi22_l g145__4733(.A0 (n_17), .A1 (q[21]), .B0
+       (d[21]), .B1 (en), .Y (n_45));
+  sky130_osu_sc_18T_ms__aoi22_l g146__6161(.A0 (n_17), .A1 (q[12]), .B0
+       (d[12]), .B1 (en), .Y (n_44));
+  sky130_osu_sc_18T_ms__aoi22_l g147__9315(.A0 (n_17), .A1 (q[11]), .B0
+       (d[11]), .B1 (en), .Y (n_43));
+  sky130_osu_sc_18T_ms__aoi22_l g148__9945(.A0 (n_17), .A1 (q[29]), .B0
+       (d[29]), .B1 (en), .Y (n_42));
+  sky130_osu_sc_18T_ms__aoi22_l g149__2883(.A0 (n_17), .A1 (q[23]), .B0
+       (d[23]), .B1 (en), .Y (n_41));
+  sky130_osu_sc_18T_ms__aoi22_l g150__2346(.A0 (n_17), .A1 (q[5]), .B0
+       (d[5]), .B1 (en), .Y (n_40));
+  sky130_osu_sc_18T_ms__aoi22_l g151__1666(.A0 (n_17), .A1 (q[25]), .B0
+       (d[25]), .B1 (en), .Y (n_39));
+  sky130_osu_sc_18T_ms__aoi22_l g152__7410(.A0 (n_17), .A1 (q[6]), .B0
+       (d[6]), .B1 (en), .Y (n_38));
+  sky130_osu_sc_18T_ms__aoi22_l g153__6417(.A0 (n_17), .A1 (q[26]), .B0
+       (d[26]), .B1 (en), .Y (n_37));
+  sky130_osu_sc_18T_ms__aoi22_l g154__5477(.A0 (n_17), .A1 (q[27]), .B0
+       (d[27]), .B1 (en), .Y (n_36));
+  sky130_osu_sc_18T_ms__aoi22_l g155__2398(.A0 (n_17), .A1 (q[7]), .B0
+       (d[7]), .B1 (en), .Y (n_35));
+  sky130_osu_sc_18T_ms__aoi22_l g156__5107(.A0 (n_17), .A1 (q[28]), .B0
+       (d[28]), .B1 (en), .Y (n_34));
+  sky130_osu_sc_18T_ms__aoi22_l g157__6260(.A0 (n_17), .A1 (q[30]), .B0
+       (d[30]), .B1 (en), .Y (n_33));
+  sky130_osu_sc_18T_ms__aoi22_l g158__4319(.A0 (n_17), .A1 (q[8]), .B0
+       (d[8]), .B1 (en), .Y (n_32));
+  sky130_osu_sc_18T_ms__aoi22_l g159__8428(.A0 (n_17), .A1 (q[9]), .B0
+       (d[9]), .B1 (en), .Y (n_31));
+  sky130_osu_sc_18T_ms__aoi22_l g160__5526(.A0 (n_17), .A1 (q[31]), .B0
+       (d[31]), .B1 (en), .Y (n_30));
+  sky130_osu_sc_18T_ms__aoi22_l g161__6783(.A0 (n_17), .A1 (q[10]), .B0
+       (d[10]), .B1 (en), .Y (n_29));
+  sky130_osu_sc_18T_ms__aoi22_l g162__3680(.A0 (n_17), .A1 (q[4]), .B0
+       (d[4]), .B1 (en), .Y (n_28));
+  sky130_osu_sc_18T_ms__inv_1 g163(.A (\q[25]_251 ), .Y (q[25]));
+  sky130_osu_sc_18T_ms__inv_1 g165(.A (\q[30]_256 ), .Y (q[30]));
+  sky130_osu_sc_18T_ms__inv_1 g166(.A (\q[11]_237 ), .Y (q[11]));
+  sky130_osu_sc_18T_ms__inv_1 g167(.A (\q[19]_245 ), .Y (q[19]));
+  sky130_osu_sc_18T_ms__inv_1 g168(.A (\q[16]_242 ), .Y (q[16]));
+  sky130_osu_sc_18T_ms__inv_1 g169(.A (\q[15]_241 ), .Y (q[15]));
+  sky130_osu_sc_18T_ms__inv_1 g170(.A (\q[4]_230 ), .Y (q[4]));
+  sky130_osu_sc_18T_ms__inv_1 g172(.A (\q[28]_254 ), .Y (q[28]));
+  sky130_osu_sc_18T_ms__inv_1 g173(.A (\q[23]_249 ), .Y (q[23]));
+  sky130_osu_sc_18T_ms__inv_1 g174(.A (en), .Y (n_17));
+  sky130_osu_sc_18T_ms__inv_1 g175(.A (\q[27]_253 ), .Y (q[27]));
+  sky130_osu_sc_18T_ms__inv_1 g176(.A (\q[3]_229 ), .Y (q[3]));
+  sky130_osu_sc_18T_ms__inv_1 g177(.A (\q[10]_236 ), .Y (q[10]));
+  sky130_osu_sc_18T_ms__inv_1 g178(.A (\q[21]_247 ), .Y (q[21]));
+  sky130_osu_sc_18T_ms__inv_1 g179(.A (\q[8]_234 ), .Y (q[8]));
+  sky130_osu_sc_18T_ms__inv_1 g182(.A (\q[13]_239 ), .Y (q[13]));
+  sky130_osu_sc_18T_ms__inv_1 g184(.A (\q[26]_252 ), .Y (q[26]));
+  sky130_osu_sc_18T_ms__inv_1 g185(.A (\q[5]_231 ), .Y (q[5]));
+  sky130_osu_sc_18T_ms__inv_1 g186(.A (\q[6]_232 ), .Y (q[6]));
+  sky130_osu_sc_18T_ms__inv_1 g187(.A (\q[29]_255 ), .Y (q[29]));
+  sky130_osu_sc_18T_ms__inv_1 g188(.A (\q[0]_226 ), .Y (q[0]));
+  sky130_osu_sc_18T_ms__inv_1 g189(.A (\q[9]_235 ), .Y (q[9]));
+  sky130_osu_sc_18T_ms__inv_1 g190(.A (\q[14]_240 ), .Y (q[14]));
+  sky130_osu_sc_18T_ms__inv_1 g191(.A (\q[12]_238 ), .Y (q[12]));
+  sky130_osu_sc_18T_ms__inv_1 g192(.A (\q[1]_227 ), .Y (q[1]));
+  sky130_osu_sc_18T_ms__inv_1 g193(.A (\q[7]_233 ), .Y (q[7]));
+endmodule
+
+module mult_seq(a, b, clk, reset, en, sum_q);
+  input [15:0] a, b;
+  input clk, reset, en;
+  output [31:0] sum_q;
+  wire [15:0] a, b;
+  wire clk, reset, en;
+  wire [31:0] sum_q;
+  wire [31:0] sum;
+  wire csa_tree_add1_add_30_16_groupi_n_0,
+       csa_tree_add1_add_30_16_groupi_n_1,
+       csa_tree_add1_add_30_16_groupi_n_2,
+       csa_tree_add1_add_30_16_groupi_n_3,
+       csa_tree_add1_add_30_16_groupi_n_4,
+       csa_tree_add1_add_30_16_groupi_n_5,
+       csa_tree_add1_add_30_16_groupi_n_6,
+       csa_tree_add1_add_30_16_groupi_n_7;
+  wire csa_tree_add1_add_30_16_groupi_n_8,
+       csa_tree_add1_add_30_16_groupi_n_9,
+       csa_tree_add1_add_30_16_groupi_n_10,
+       csa_tree_add1_add_30_16_groupi_n_11,
+       csa_tree_add1_add_30_16_groupi_n_12,
+       csa_tree_add1_add_30_16_groupi_n_13,
+       csa_tree_add1_add_30_16_groupi_n_14,
+       csa_tree_add1_add_30_16_groupi_n_15;
+  wire csa_tree_add1_add_30_16_groupi_n_16,
+       csa_tree_add1_add_30_16_groupi_n_17,
+       csa_tree_add1_add_30_16_groupi_n_18,
+       csa_tree_add1_add_30_16_groupi_n_19,
+       csa_tree_add1_add_30_16_groupi_n_20,
+       csa_tree_add1_add_30_16_groupi_n_21,
+       csa_tree_add1_add_30_16_groupi_n_22,
+       csa_tree_add1_add_30_16_groupi_n_23;
+  wire csa_tree_add1_add_30_16_groupi_n_24,
+       csa_tree_add1_add_30_16_groupi_n_25,
+       csa_tree_add1_add_30_16_groupi_n_26,
+       csa_tree_add1_add_30_16_groupi_n_27,
+       csa_tree_add1_add_30_16_groupi_n_28,
+       csa_tree_add1_add_30_16_groupi_n_29,
+       csa_tree_add1_add_30_16_groupi_n_30,
+       csa_tree_add1_add_30_16_groupi_n_31;
+  wire csa_tree_add1_add_30_16_groupi_n_32,
+       csa_tree_add1_add_30_16_groupi_n_33,
+       csa_tree_add1_add_30_16_groupi_n_34,
+       csa_tree_add1_add_30_16_groupi_n_36,
+       csa_tree_add1_add_30_16_groupi_n_38,
+       csa_tree_add1_add_30_16_groupi_n_39,
+       csa_tree_add1_add_30_16_groupi_n_41,
+       csa_tree_add1_add_30_16_groupi_n_42;
+  wire csa_tree_add1_add_30_16_groupi_n_43,
+       csa_tree_add1_add_30_16_groupi_n_44,
+       csa_tree_add1_add_30_16_groupi_n_45,
+       csa_tree_add1_add_30_16_groupi_n_46,
+       csa_tree_add1_add_30_16_groupi_n_47,
+       csa_tree_add1_add_30_16_groupi_n_48,
+       csa_tree_add1_add_30_16_groupi_n_49,
+       csa_tree_add1_add_30_16_groupi_n_50;
+  wire csa_tree_add1_add_30_16_groupi_n_51,
+       csa_tree_add1_add_30_16_groupi_n_53,
+       csa_tree_add1_add_30_16_groupi_n_54,
+       csa_tree_add1_add_30_16_groupi_n_55,
+       csa_tree_add1_add_30_16_groupi_n_56,
+       csa_tree_add1_add_30_16_groupi_n_57,
+       csa_tree_add1_add_30_16_groupi_n_58,
+       csa_tree_add1_add_30_16_groupi_n_59;
+  wire csa_tree_add1_add_30_16_groupi_n_60,
+       csa_tree_add1_add_30_16_groupi_n_61,
+       csa_tree_add1_add_30_16_groupi_n_62,
+       csa_tree_add1_add_30_16_groupi_n_63,
+       csa_tree_add1_add_30_16_groupi_n_64,
+       csa_tree_add1_add_30_16_groupi_n_65,
+       csa_tree_add1_add_30_16_groupi_n_66,
+       csa_tree_add1_add_30_16_groupi_n_67;
+  wire csa_tree_add1_add_30_16_groupi_n_68,
+       csa_tree_add1_add_30_16_groupi_n_69,
+       csa_tree_add1_add_30_16_groupi_n_70,
+       csa_tree_add1_add_30_16_groupi_n_71,
+       csa_tree_add1_add_30_16_groupi_n_72,
+       csa_tree_add1_add_30_16_groupi_n_73,
+       csa_tree_add1_add_30_16_groupi_n_74,
+       csa_tree_add1_add_30_16_groupi_n_75;
+  wire csa_tree_add1_add_30_16_groupi_n_76,
+       csa_tree_add1_add_30_16_groupi_n_77,
+       csa_tree_add1_add_30_16_groupi_n_78,
+       csa_tree_add1_add_30_16_groupi_n_79,
+       csa_tree_add1_add_30_16_groupi_n_80,
+       csa_tree_add1_add_30_16_groupi_n_81,
+       csa_tree_add1_add_30_16_groupi_n_82,
+       csa_tree_add1_add_30_16_groupi_n_83;
+  wire csa_tree_add1_add_30_16_groupi_n_84,
+       csa_tree_add1_add_30_16_groupi_n_85,
+       csa_tree_add1_add_30_16_groupi_n_86,
+       csa_tree_add1_add_30_16_groupi_n_87,
+       csa_tree_add1_add_30_16_groupi_n_88,
+       csa_tree_add1_add_30_16_groupi_n_89,
+       csa_tree_add1_add_30_16_groupi_n_90,
+       csa_tree_add1_add_30_16_groupi_n_91;
+  wire csa_tree_add1_add_30_16_groupi_n_92,
+       csa_tree_add1_add_30_16_groupi_n_93,
+       csa_tree_add1_add_30_16_groupi_n_94,
+       csa_tree_add1_add_30_16_groupi_n_95,
+       csa_tree_add1_add_30_16_groupi_n_96,
+       csa_tree_add1_add_30_16_groupi_n_97,
+       csa_tree_add1_add_30_16_groupi_n_98,
+       csa_tree_add1_add_30_16_groupi_n_99;
+  wire csa_tree_add1_add_30_16_groupi_n_100,
+       csa_tree_add1_add_30_16_groupi_n_101,
+       csa_tree_add1_add_30_16_groupi_n_102,
+       csa_tree_add1_add_30_16_groupi_n_103,
+       csa_tree_add1_add_30_16_groupi_n_104,
+       csa_tree_add1_add_30_16_groupi_n_105,
+       csa_tree_add1_add_30_16_groupi_n_106,
+       csa_tree_add1_add_30_16_groupi_n_107;
+  wire csa_tree_add1_add_30_16_groupi_n_108,
+       csa_tree_add1_add_30_16_groupi_n_109,
+       csa_tree_add1_add_30_16_groupi_n_110,
+       csa_tree_add1_add_30_16_groupi_n_111,
+       csa_tree_add1_add_30_16_groupi_n_112,
+       csa_tree_add1_add_30_16_groupi_n_113,
+       csa_tree_add1_add_30_16_groupi_n_114,
+       csa_tree_add1_add_30_16_groupi_n_115;
+  wire csa_tree_add1_add_30_16_groupi_n_116,
+       csa_tree_add1_add_30_16_groupi_n_117,
+       csa_tree_add1_add_30_16_groupi_n_118,
+       csa_tree_add1_add_30_16_groupi_n_119,
+       csa_tree_add1_add_30_16_groupi_n_120,
+       csa_tree_add1_add_30_16_groupi_n_121,
+       csa_tree_add1_add_30_16_groupi_n_122,
+       csa_tree_add1_add_30_16_groupi_n_123;
+  wire csa_tree_add1_add_30_16_groupi_n_124,
+       csa_tree_add1_add_30_16_groupi_n_125,
+       csa_tree_add1_add_30_16_groupi_n_126,
+       csa_tree_add1_add_30_16_groupi_n_128,
+       csa_tree_add1_add_30_16_groupi_n_129,
+       csa_tree_add1_add_30_16_groupi_n_130,
+       csa_tree_add1_add_30_16_groupi_n_131,
+       csa_tree_add1_add_30_16_groupi_n_132;
+  wire csa_tree_add1_add_30_16_groupi_n_133,
+       csa_tree_add1_add_30_16_groupi_n_134,
+       csa_tree_add1_add_30_16_groupi_n_135,
+       csa_tree_add1_add_30_16_groupi_n_136,
+       csa_tree_add1_add_30_16_groupi_n_137,
+       csa_tree_add1_add_30_16_groupi_n_138,
+       csa_tree_add1_add_30_16_groupi_n_139,
+       csa_tree_add1_add_30_16_groupi_n_140;
+  wire csa_tree_add1_add_30_16_groupi_n_141,
+       csa_tree_add1_add_30_16_groupi_n_142,
+       csa_tree_add1_add_30_16_groupi_n_143,
+       csa_tree_add1_add_30_16_groupi_n_144,
+       csa_tree_add1_add_30_16_groupi_n_145,
+       csa_tree_add1_add_30_16_groupi_n_146,
+       csa_tree_add1_add_30_16_groupi_n_147,
+       csa_tree_add1_add_30_16_groupi_n_148;
+  wire csa_tree_add1_add_30_16_groupi_n_149,
+       csa_tree_add1_add_30_16_groupi_n_150,
+       csa_tree_add1_add_30_16_groupi_n_151,
+       csa_tree_add1_add_30_16_groupi_n_152,
+       csa_tree_add1_add_30_16_groupi_n_153,
+       csa_tree_add1_add_30_16_groupi_n_154,
+       csa_tree_add1_add_30_16_groupi_n_155,
+       csa_tree_add1_add_30_16_groupi_n_156;
+  wire csa_tree_add1_add_30_16_groupi_n_157,
+       csa_tree_add1_add_30_16_groupi_n_158,
+       csa_tree_add1_add_30_16_groupi_n_159,
+       csa_tree_add1_add_30_16_groupi_n_160,
+       csa_tree_add1_add_30_16_groupi_n_161,
+       csa_tree_add1_add_30_16_groupi_n_162,
+       csa_tree_add1_add_30_16_groupi_n_163,
+       csa_tree_add1_add_30_16_groupi_n_164;
+  wire csa_tree_add1_add_30_16_groupi_n_165,
+       csa_tree_add1_add_30_16_groupi_n_166,
+       csa_tree_add1_add_30_16_groupi_n_167,
+       csa_tree_add1_add_30_16_groupi_n_168,
+       csa_tree_add1_add_30_16_groupi_n_169,
+       csa_tree_add1_add_30_16_groupi_n_170,
+       csa_tree_add1_add_30_16_groupi_n_171,
+       csa_tree_add1_add_30_16_groupi_n_172;
+  wire csa_tree_add1_add_30_16_groupi_n_173,
+       csa_tree_add1_add_30_16_groupi_n_174,
+       csa_tree_add1_add_30_16_groupi_n_175,
+       csa_tree_add1_add_30_16_groupi_n_176,
+       csa_tree_add1_add_30_16_groupi_n_177,
+       csa_tree_add1_add_30_16_groupi_n_178,
+       csa_tree_add1_add_30_16_groupi_n_179,
+       csa_tree_add1_add_30_16_groupi_n_180;
+  wire csa_tree_add1_add_30_16_groupi_n_181,
+       csa_tree_add1_add_30_16_groupi_n_182,
+       csa_tree_add1_add_30_16_groupi_n_183,
+       csa_tree_add1_add_30_16_groupi_n_184,
+       csa_tree_add1_add_30_16_groupi_n_185,
+       csa_tree_add1_add_30_16_groupi_n_186,
+       csa_tree_add1_add_30_16_groupi_n_187,
+       csa_tree_add1_add_30_16_groupi_n_188;
+  wire csa_tree_add1_add_30_16_groupi_n_189,
+       csa_tree_add1_add_30_16_groupi_n_190,
+       csa_tree_add1_add_30_16_groupi_n_191,
+       csa_tree_add1_add_30_16_groupi_n_192,
+       csa_tree_add1_add_30_16_groupi_n_193,
+       csa_tree_add1_add_30_16_groupi_n_194,
+       csa_tree_add1_add_30_16_groupi_n_195,
+       csa_tree_add1_add_30_16_groupi_n_196;
+  wire csa_tree_add1_add_30_16_groupi_n_197,
+       csa_tree_add1_add_30_16_groupi_n_198,
+       csa_tree_add1_add_30_16_groupi_n_199,
+       csa_tree_add1_add_30_16_groupi_n_200,
+       csa_tree_add1_add_30_16_groupi_n_201,
+       csa_tree_add1_add_30_16_groupi_n_202,
+       csa_tree_add1_add_30_16_groupi_n_203,
+       csa_tree_add1_add_30_16_groupi_n_204;
+  wire csa_tree_add1_add_30_16_groupi_n_205,
+       csa_tree_add1_add_30_16_groupi_n_206,
+       csa_tree_add1_add_30_16_groupi_n_207,
+       csa_tree_add1_add_30_16_groupi_n_208,
+       csa_tree_add1_add_30_16_groupi_n_209,
+       csa_tree_add1_add_30_16_groupi_n_210,
+       csa_tree_add1_add_30_16_groupi_n_211,
+       csa_tree_add1_add_30_16_groupi_n_212;
+  wire csa_tree_add1_add_30_16_groupi_n_213,
+       csa_tree_add1_add_30_16_groupi_n_214,
+       csa_tree_add1_add_30_16_groupi_n_215,
+       csa_tree_add1_add_30_16_groupi_n_216,
+       csa_tree_add1_add_30_16_groupi_n_217,
+       csa_tree_add1_add_30_16_groupi_n_218,
+       csa_tree_add1_add_30_16_groupi_n_219,
+       csa_tree_add1_add_30_16_groupi_n_220;
+  wire csa_tree_add1_add_30_16_groupi_n_221,
+       csa_tree_add1_add_30_16_groupi_n_222,
+       csa_tree_add1_add_30_16_groupi_n_223,
+       csa_tree_add1_add_30_16_groupi_n_224,
+       csa_tree_add1_add_30_16_groupi_n_225,
+       csa_tree_add1_add_30_16_groupi_n_226,
+       csa_tree_add1_add_30_16_groupi_n_227,
+       csa_tree_add1_add_30_16_groupi_n_228;
+  wire csa_tree_add1_add_30_16_groupi_n_229,
+       csa_tree_add1_add_30_16_groupi_n_230,
+       csa_tree_add1_add_30_16_groupi_n_231,
+       csa_tree_add1_add_30_16_groupi_n_232,
+       csa_tree_add1_add_30_16_groupi_n_233,
+       csa_tree_add1_add_30_16_groupi_n_234,
+       csa_tree_add1_add_30_16_groupi_n_235,
+       csa_tree_add1_add_30_16_groupi_n_236;
+  wire csa_tree_add1_add_30_16_groupi_n_237,
+       csa_tree_add1_add_30_16_groupi_n_238,
+       csa_tree_add1_add_30_16_groupi_n_239,
+       csa_tree_add1_add_30_16_groupi_n_240,
+       csa_tree_add1_add_30_16_groupi_n_241,
+       csa_tree_add1_add_30_16_groupi_n_242,
+       csa_tree_add1_add_30_16_groupi_n_243,
+       csa_tree_add1_add_30_16_groupi_n_244;
+  wire csa_tree_add1_add_30_16_groupi_n_245,
+       csa_tree_add1_add_30_16_groupi_n_246,
+       csa_tree_add1_add_30_16_groupi_n_247,
+       csa_tree_add1_add_30_16_groupi_n_248,
+       csa_tree_add1_add_30_16_groupi_n_249,
+       csa_tree_add1_add_30_16_groupi_n_250,
+       csa_tree_add1_add_30_16_groupi_n_251,
+       csa_tree_add1_add_30_16_groupi_n_252;
+  wire csa_tree_add1_add_30_16_groupi_n_253,
+       csa_tree_add1_add_30_16_groupi_n_254,
+       csa_tree_add1_add_30_16_groupi_n_255,
+       csa_tree_add1_add_30_16_groupi_n_256,
+       csa_tree_add1_add_30_16_groupi_n_257,
+       csa_tree_add1_add_30_16_groupi_n_258,
+       csa_tree_add1_add_30_16_groupi_n_259,
+       csa_tree_add1_add_30_16_groupi_n_260;
+  wire csa_tree_add1_add_30_16_groupi_n_261,
+       csa_tree_add1_add_30_16_groupi_n_262,
+       csa_tree_add1_add_30_16_groupi_n_263,
+       csa_tree_add1_add_30_16_groupi_n_264,
+       csa_tree_add1_add_30_16_groupi_n_265,
+       csa_tree_add1_add_30_16_groupi_n_266,
+       csa_tree_add1_add_30_16_groupi_n_267,
+       csa_tree_add1_add_30_16_groupi_n_268;
+  wire csa_tree_add1_add_30_16_groupi_n_269,
+       csa_tree_add1_add_30_16_groupi_n_270,
+       csa_tree_add1_add_30_16_groupi_n_271,
+       csa_tree_add1_add_30_16_groupi_n_272,
+       csa_tree_add1_add_30_16_groupi_n_273,
+       csa_tree_add1_add_30_16_groupi_n_274,
+       csa_tree_add1_add_30_16_groupi_n_275,
+       csa_tree_add1_add_30_16_groupi_n_276;
+  wire csa_tree_add1_add_30_16_groupi_n_277,
+       csa_tree_add1_add_30_16_groupi_n_278,
+       csa_tree_add1_add_30_16_groupi_n_279,
+       csa_tree_add1_add_30_16_groupi_n_280,
+       csa_tree_add1_add_30_16_groupi_n_281,
+       csa_tree_add1_add_30_16_groupi_n_282,
+       csa_tree_add1_add_30_16_groupi_n_283,
+       csa_tree_add1_add_30_16_groupi_n_284;
+  wire csa_tree_add1_add_30_16_groupi_n_285,
+       csa_tree_add1_add_30_16_groupi_n_286,
+       csa_tree_add1_add_30_16_groupi_n_287,
+       csa_tree_add1_add_30_16_groupi_n_288,
+       csa_tree_add1_add_30_16_groupi_n_289,
+       csa_tree_add1_add_30_16_groupi_n_290,
+       csa_tree_add1_add_30_16_groupi_n_291,
+       csa_tree_add1_add_30_16_groupi_n_292;
+  wire csa_tree_add1_add_30_16_groupi_n_293,
+       csa_tree_add1_add_30_16_groupi_n_294,
+       csa_tree_add1_add_30_16_groupi_n_295,
+       csa_tree_add1_add_30_16_groupi_n_296,
+       csa_tree_add1_add_30_16_groupi_n_297,
+       csa_tree_add1_add_30_16_groupi_n_298,
+       csa_tree_add1_add_30_16_groupi_n_299,
+       csa_tree_add1_add_30_16_groupi_n_300;
+  wire csa_tree_add1_add_30_16_groupi_n_301,
+       csa_tree_add1_add_30_16_groupi_n_302,
+       csa_tree_add1_add_30_16_groupi_n_303,
+       csa_tree_add1_add_30_16_groupi_n_304,
+       csa_tree_add1_add_30_16_groupi_n_305,
+       csa_tree_add1_add_30_16_groupi_n_306,
+       csa_tree_add1_add_30_16_groupi_n_307,
+       csa_tree_add1_add_30_16_groupi_n_308;
+  wire csa_tree_add1_add_30_16_groupi_n_309,
+       csa_tree_add1_add_30_16_groupi_n_310,
+       csa_tree_add1_add_30_16_groupi_n_311,
+       csa_tree_add1_add_30_16_groupi_n_312,
+       csa_tree_add1_add_30_16_groupi_n_313,
+       csa_tree_add1_add_30_16_groupi_n_314,
+       csa_tree_add1_add_30_16_groupi_n_315,
+       csa_tree_add1_add_30_16_groupi_n_316;
+  wire csa_tree_add1_add_30_16_groupi_n_317,
+       csa_tree_add1_add_30_16_groupi_n_318,
+       csa_tree_add1_add_30_16_groupi_n_319,
+       csa_tree_add1_add_30_16_groupi_n_320,
+       csa_tree_add1_add_30_16_groupi_n_321,
+       csa_tree_add1_add_30_16_groupi_n_322,
+       csa_tree_add1_add_30_16_groupi_n_323,
+       csa_tree_add1_add_30_16_groupi_n_324;
+  wire csa_tree_add1_add_30_16_groupi_n_325,
+       csa_tree_add1_add_30_16_groupi_n_326,
+       csa_tree_add1_add_30_16_groupi_n_327,
+       csa_tree_add1_add_30_16_groupi_n_328,
+       csa_tree_add1_add_30_16_groupi_n_329,
+       csa_tree_add1_add_30_16_groupi_n_330,
+       csa_tree_add1_add_30_16_groupi_n_331,
+       csa_tree_add1_add_30_16_groupi_n_332;
+  wire csa_tree_add1_add_30_16_groupi_n_333,
+       csa_tree_add1_add_30_16_groupi_n_334,
+       csa_tree_add1_add_30_16_groupi_n_335,
+       csa_tree_add1_add_30_16_groupi_n_336,
+       csa_tree_add1_add_30_16_groupi_n_337,
+       csa_tree_add1_add_30_16_groupi_n_338,
+       csa_tree_add1_add_30_16_groupi_n_339,
+       csa_tree_add1_add_30_16_groupi_n_340;
+  wire csa_tree_add1_add_30_16_groupi_n_341,
+       csa_tree_add1_add_30_16_groupi_n_342,
+       csa_tree_add1_add_30_16_groupi_n_343,
+       csa_tree_add1_add_30_16_groupi_n_344,
+       csa_tree_add1_add_30_16_groupi_n_345,
+       csa_tree_add1_add_30_16_groupi_n_346,
+       csa_tree_add1_add_30_16_groupi_n_347,
+       csa_tree_add1_add_30_16_groupi_n_348;
+  wire csa_tree_add1_add_30_16_groupi_n_350,
+       csa_tree_add1_add_30_16_groupi_n_351,
+       csa_tree_add1_add_30_16_groupi_n_352,
+       csa_tree_add1_add_30_16_groupi_n_353,
+       csa_tree_add1_add_30_16_groupi_n_354,
+       csa_tree_add1_add_30_16_groupi_n_355,
+       csa_tree_add1_add_30_16_groupi_n_356,
+       csa_tree_add1_add_30_16_groupi_n_357;
+  wire csa_tree_add1_add_30_16_groupi_n_358,
+       csa_tree_add1_add_30_16_groupi_n_359,
+       csa_tree_add1_add_30_16_groupi_n_360,
+       csa_tree_add1_add_30_16_groupi_n_361,
+       csa_tree_add1_add_30_16_groupi_n_362,
+       csa_tree_add1_add_30_16_groupi_n_363,
+       csa_tree_add1_add_30_16_groupi_n_364,
+       csa_tree_add1_add_30_16_groupi_n_365;
+  wire csa_tree_add1_add_30_16_groupi_n_366,
+       csa_tree_add1_add_30_16_groupi_n_367,
+       csa_tree_add1_add_30_16_groupi_n_368,
+       csa_tree_add1_add_30_16_groupi_n_369,
+       csa_tree_add1_add_30_16_groupi_n_370,
+       csa_tree_add1_add_30_16_groupi_n_371,
+       csa_tree_add1_add_30_16_groupi_n_372,
+       csa_tree_add1_add_30_16_groupi_n_373;
+  wire csa_tree_add1_add_30_16_groupi_n_374,
+       csa_tree_add1_add_30_16_groupi_n_375,
+       csa_tree_add1_add_30_16_groupi_n_376,
+       csa_tree_add1_add_30_16_groupi_n_377,
+       csa_tree_add1_add_30_16_groupi_n_378,
+       csa_tree_add1_add_30_16_groupi_n_379,
+       csa_tree_add1_add_30_16_groupi_n_380,
+       csa_tree_add1_add_30_16_groupi_n_381;
+  wire csa_tree_add1_add_30_16_groupi_n_382,
+       csa_tree_add1_add_30_16_groupi_n_383,
+       csa_tree_add1_add_30_16_groupi_n_384,
+       csa_tree_add1_add_30_16_groupi_n_385,
+       csa_tree_add1_add_30_16_groupi_n_386,
+       csa_tree_add1_add_30_16_groupi_n_387,
+       csa_tree_add1_add_30_16_groupi_n_388,
+       csa_tree_add1_add_30_16_groupi_n_389;
+  wire csa_tree_add1_add_30_16_groupi_n_390,
+       csa_tree_add1_add_30_16_groupi_n_391,
+       csa_tree_add1_add_30_16_groupi_n_392,
+       csa_tree_add1_add_30_16_groupi_n_393,
+       csa_tree_add1_add_30_16_groupi_n_394,
+       csa_tree_add1_add_30_16_groupi_n_395,
+       csa_tree_add1_add_30_16_groupi_n_396,
+       csa_tree_add1_add_30_16_groupi_n_397;
+  wire csa_tree_add1_add_30_16_groupi_n_398,
+       csa_tree_add1_add_30_16_groupi_n_399,
+       csa_tree_add1_add_30_16_groupi_n_400,
+       csa_tree_add1_add_30_16_groupi_n_401,
+       csa_tree_add1_add_30_16_groupi_n_402,
+       csa_tree_add1_add_30_16_groupi_n_403,
+       csa_tree_add1_add_30_16_groupi_n_404,
+       csa_tree_add1_add_30_16_groupi_n_405;
+  wire csa_tree_add1_add_30_16_groupi_n_406,
+       csa_tree_add1_add_30_16_groupi_n_407,
+       csa_tree_add1_add_30_16_groupi_n_408,
+       csa_tree_add1_add_30_16_groupi_n_409,
+       csa_tree_add1_add_30_16_groupi_n_410,
+       csa_tree_add1_add_30_16_groupi_n_411,
+       csa_tree_add1_add_30_16_groupi_n_412,
+       csa_tree_add1_add_30_16_groupi_n_413;
+  wire csa_tree_add1_add_30_16_groupi_n_414,
+       csa_tree_add1_add_30_16_groupi_n_415,
+       csa_tree_add1_add_30_16_groupi_n_416,
+       csa_tree_add1_add_30_16_groupi_n_417,
+       csa_tree_add1_add_30_16_groupi_n_418,
+       csa_tree_add1_add_30_16_groupi_n_419,
+       csa_tree_add1_add_30_16_groupi_n_420,
+       csa_tree_add1_add_30_16_groupi_n_421;
+  wire csa_tree_add1_add_30_16_groupi_n_422,
+       csa_tree_add1_add_30_16_groupi_n_423,
+       csa_tree_add1_add_30_16_groupi_n_424,
+       csa_tree_add1_add_30_16_groupi_n_425,
+       csa_tree_add1_add_30_16_groupi_n_426,
+       csa_tree_add1_add_30_16_groupi_n_427,
+       csa_tree_add1_add_30_16_groupi_n_428,
+       csa_tree_add1_add_30_16_groupi_n_429;
+  wire csa_tree_add1_add_30_16_groupi_n_430,
+       csa_tree_add1_add_30_16_groupi_n_431,
+       csa_tree_add1_add_30_16_groupi_n_432,
+       csa_tree_add1_add_30_16_groupi_n_433,
+       csa_tree_add1_add_30_16_groupi_n_434,
+       csa_tree_add1_add_30_16_groupi_n_435,
+       csa_tree_add1_add_30_16_groupi_n_436,
+       csa_tree_add1_add_30_16_groupi_n_437;
+  wire csa_tree_add1_add_30_16_groupi_n_438,
+       csa_tree_add1_add_30_16_groupi_n_439,
+       csa_tree_add1_add_30_16_groupi_n_440,
+       csa_tree_add1_add_30_16_groupi_n_441,
+       csa_tree_add1_add_30_16_groupi_n_442,
+       csa_tree_add1_add_30_16_groupi_n_443,
+       csa_tree_add1_add_30_16_groupi_n_444,
+       csa_tree_add1_add_30_16_groupi_n_445;
+  wire csa_tree_add1_add_30_16_groupi_n_446,
+       csa_tree_add1_add_30_16_groupi_n_447,
+       csa_tree_add1_add_30_16_groupi_n_448,
+       csa_tree_add1_add_30_16_groupi_n_449,
+       csa_tree_add1_add_30_16_groupi_n_450,
+       csa_tree_add1_add_30_16_groupi_n_451,
+       csa_tree_add1_add_30_16_groupi_n_452,
+       csa_tree_add1_add_30_16_groupi_n_453;
+  wire csa_tree_add1_add_30_16_groupi_n_454,
+       csa_tree_add1_add_30_16_groupi_n_455,
+       csa_tree_add1_add_30_16_groupi_n_456,
+       csa_tree_add1_add_30_16_groupi_n_457,
+       csa_tree_add1_add_30_16_groupi_n_458,
+       csa_tree_add1_add_30_16_groupi_n_459,
+       csa_tree_add1_add_30_16_groupi_n_460,
+       csa_tree_add1_add_30_16_groupi_n_461;
+  wire csa_tree_add1_add_30_16_groupi_n_462,
+       csa_tree_add1_add_30_16_groupi_n_463,
+       csa_tree_add1_add_30_16_groupi_n_464,
+       csa_tree_add1_add_30_16_groupi_n_465,
+       csa_tree_add1_add_30_16_groupi_n_466,
+       csa_tree_add1_add_30_16_groupi_n_467,
+       csa_tree_add1_add_30_16_groupi_n_468,
+       csa_tree_add1_add_30_16_groupi_n_469;
+  wire csa_tree_add1_add_30_16_groupi_n_470,
+       csa_tree_add1_add_30_16_groupi_n_471,
+       csa_tree_add1_add_30_16_groupi_n_472,
+       csa_tree_add1_add_30_16_groupi_n_473,
+       csa_tree_add1_add_30_16_groupi_n_474,
+       csa_tree_add1_add_30_16_groupi_n_475,
+       csa_tree_add1_add_30_16_groupi_n_476,
+       csa_tree_add1_add_30_16_groupi_n_477;
+  wire csa_tree_add1_add_30_16_groupi_n_478,
+       csa_tree_add1_add_30_16_groupi_n_479,
+       csa_tree_add1_add_30_16_groupi_n_480,
+       csa_tree_add1_add_30_16_groupi_n_481,
+       csa_tree_add1_add_30_16_groupi_n_482,
+       csa_tree_add1_add_30_16_groupi_n_483,
+       csa_tree_add1_add_30_16_groupi_n_484,
+       csa_tree_add1_add_30_16_groupi_n_485;
+  wire csa_tree_add1_add_30_16_groupi_n_486,
+       csa_tree_add1_add_30_16_groupi_n_487,
+       csa_tree_add1_add_30_16_groupi_n_488,
+       csa_tree_add1_add_30_16_groupi_n_489,
+       csa_tree_add1_add_30_16_groupi_n_490,
+       csa_tree_add1_add_30_16_groupi_n_491,
+       csa_tree_add1_add_30_16_groupi_n_492,
+       csa_tree_add1_add_30_16_groupi_n_493;
+  wire csa_tree_add1_add_30_16_groupi_n_494,
+       csa_tree_add1_add_30_16_groupi_n_495,
+       csa_tree_add1_add_30_16_groupi_n_496,
+       csa_tree_add1_add_30_16_groupi_n_497,
+       csa_tree_add1_add_30_16_groupi_n_498,
+       csa_tree_add1_add_30_16_groupi_n_499,
+       csa_tree_add1_add_30_16_groupi_n_500,
+       csa_tree_add1_add_30_16_groupi_n_501;
+  wire csa_tree_add1_add_30_16_groupi_n_502,
+       csa_tree_add1_add_30_16_groupi_n_503,
+       csa_tree_add1_add_30_16_groupi_n_504,
+       csa_tree_add1_add_30_16_groupi_n_505,
+       csa_tree_add1_add_30_16_groupi_n_506,
+       csa_tree_add1_add_30_16_groupi_n_507,
+       csa_tree_add1_add_30_16_groupi_n_508,
+       csa_tree_add1_add_30_16_groupi_n_509;
+  wire csa_tree_add1_add_30_16_groupi_n_510,
+       csa_tree_add1_add_30_16_groupi_n_511,
+       csa_tree_add1_add_30_16_groupi_n_512,
+       csa_tree_add1_add_30_16_groupi_n_513,
+       csa_tree_add1_add_30_16_groupi_n_514,
+       csa_tree_add1_add_30_16_groupi_n_515,
+       csa_tree_add1_add_30_16_groupi_n_516,
+       csa_tree_add1_add_30_16_groupi_n_517;
+  wire csa_tree_add1_add_30_16_groupi_n_518,
+       csa_tree_add1_add_30_16_groupi_n_519,
+       csa_tree_add1_add_30_16_groupi_n_520,
+       csa_tree_add1_add_30_16_groupi_n_521,
+       csa_tree_add1_add_30_16_groupi_n_522,
+       csa_tree_add1_add_30_16_groupi_n_523,
+       csa_tree_add1_add_30_16_groupi_n_524,
+       csa_tree_add1_add_30_16_groupi_n_525;
+  wire csa_tree_add1_add_30_16_groupi_n_526,
+       csa_tree_add1_add_30_16_groupi_n_527,
+       csa_tree_add1_add_30_16_groupi_n_528,
+       csa_tree_add1_add_30_16_groupi_n_529,
+       csa_tree_add1_add_30_16_groupi_n_530,
+       csa_tree_add1_add_30_16_groupi_n_531,
+       csa_tree_add1_add_30_16_groupi_n_532,
+       csa_tree_add1_add_30_16_groupi_n_533;
+  wire csa_tree_add1_add_30_16_groupi_n_534,
+       csa_tree_add1_add_30_16_groupi_n_535,
+       csa_tree_add1_add_30_16_groupi_n_536,
+       csa_tree_add1_add_30_16_groupi_n_537,
+       csa_tree_add1_add_30_16_groupi_n_538,
+       csa_tree_add1_add_30_16_groupi_n_539,
+       csa_tree_add1_add_30_16_groupi_n_540,
+       csa_tree_add1_add_30_16_groupi_n_541;
+  wire csa_tree_add1_add_30_16_groupi_n_543,
+       csa_tree_add1_add_30_16_groupi_n_544,
+       csa_tree_add1_add_30_16_groupi_n_545,
+       csa_tree_add1_add_30_16_groupi_n_546,
+       csa_tree_add1_add_30_16_groupi_n_547,
+       csa_tree_add1_add_30_16_groupi_n_548,
+       csa_tree_add1_add_30_16_groupi_n_549,
+       csa_tree_add1_add_30_16_groupi_n_550;
+  wire csa_tree_add1_add_30_16_groupi_n_551,
+       csa_tree_add1_add_30_16_groupi_n_552,
+       csa_tree_add1_add_30_16_groupi_n_553,
+       csa_tree_add1_add_30_16_groupi_n_554,
+       csa_tree_add1_add_30_16_groupi_n_555,
+       csa_tree_add1_add_30_16_groupi_n_556,
+       csa_tree_add1_add_30_16_groupi_n_557,
+       csa_tree_add1_add_30_16_groupi_n_558;
+  wire csa_tree_add1_add_30_16_groupi_n_559,
+       csa_tree_add1_add_30_16_groupi_n_561,
+       csa_tree_add1_add_30_16_groupi_n_562,
+       csa_tree_add1_add_30_16_groupi_n_563,
+       csa_tree_add1_add_30_16_groupi_n_564,
+       csa_tree_add1_add_30_16_groupi_n_565,
+       csa_tree_add1_add_30_16_groupi_n_566,
+       csa_tree_add1_add_30_16_groupi_n_567;
+  wire csa_tree_add1_add_30_16_groupi_n_568,
+       csa_tree_add1_add_30_16_groupi_n_569,
+       csa_tree_add1_add_30_16_groupi_n_570,
+       csa_tree_add1_add_30_16_groupi_n_571,
+       csa_tree_add1_add_30_16_groupi_n_572,
+       csa_tree_add1_add_30_16_groupi_n_573,
+       csa_tree_add1_add_30_16_groupi_n_574,
+       csa_tree_add1_add_30_16_groupi_n_575;
+  wire csa_tree_add1_add_30_16_groupi_n_576,
+       csa_tree_add1_add_30_16_groupi_n_577,
+       csa_tree_add1_add_30_16_groupi_n_578,
+       csa_tree_add1_add_30_16_groupi_n_579,
+       csa_tree_add1_add_30_16_groupi_n_580,
+       csa_tree_add1_add_30_16_groupi_n_581,
+       csa_tree_add1_add_30_16_groupi_n_582,
+       csa_tree_add1_add_30_16_groupi_n_583;
+  wire csa_tree_add1_add_30_16_groupi_n_584,
+       csa_tree_add1_add_30_16_groupi_n_585,
+       csa_tree_add1_add_30_16_groupi_n_586,
+       csa_tree_add1_add_30_16_groupi_n_587,
+       csa_tree_add1_add_30_16_groupi_n_588,
+       csa_tree_add1_add_30_16_groupi_n_589,
+       csa_tree_add1_add_30_16_groupi_n_590,
+       csa_tree_add1_add_30_16_groupi_n_591;
+  wire csa_tree_add1_add_30_16_groupi_n_592,
+       csa_tree_add1_add_30_16_groupi_n_593,
+       csa_tree_add1_add_30_16_groupi_n_594,
+       csa_tree_add1_add_30_16_groupi_n_595,
+       csa_tree_add1_add_30_16_groupi_n_596,
+       csa_tree_add1_add_30_16_groupi_n_597,
+       csa_tree_add1_add_30_16_groupi_n_602,
+       csa_tree_add1_add_30_16_groupi_n_603;
+  wire csa_tree_add1_add_30_16_groupi_n_604,
+       csa_tree_add1_add_30_16_groupi_n_605,
+       csa_tree_add1_add_30_16_groupi_n_606,
+       csa_tree_add1_add_30_16_groupi_n_607,
+       csa_tree_add1_add_30_16_groupi_n_608,
+       csa_tree_add1_add_30_16_groupi_n_609,
+       csa_tree_add1_add_30_16_groupi_n_610,
+       csa_tree_add1_add_30_16_groupi_n_611;
+  wire csa_tree_add1_add_30_16_groupi_n_612,
+       csa_tree_add1_add_30_16_groupi_n_613,
+       csa_tree_add1_add_30_16_groupi_n_614,
+       csa_tree_add1_add_30_16_groupi_n_615,
+       csa_tree_add1_add_30_16_groupi_n_616,
+       csa_tree_add1_add_30_16_groupi_n_617,
+       csa_tree_add1_add_30_16_groupi_n_618,
+       csa_tree_add1_add_30_16_groupi_n_619;
+  wire csa_tree_add1_add_30_16_groupi_n_620,
+       csa_tree_add1_add_30_16_groupi_n_621,
+       csa_tree_add1_add_30_16_groupi_n_622,
+       csa_tree_add1_add_30_16_groupi_n_623,
+       csa_tree_add1_add_30_16_groupi_n_624,
+       csa_tree_add1_add_30_16_groupi_n_625,
+       csa_tree_add1_add_30_16_groupi_n_626,
+       csa_tree_add1_add_30_16_groupi_n_627;
+  wire csa_tree_add1_add_30_16_groupi_n_628,
+       csa_tree_add1_add_30_16_groupi_n_629,
+       csa_tree_add1_add_30_16_groupi_n_630,
+       csa_tree_add1_add_30_16_groupi_n_631,
+       csa_tree_add1_add_30_16_groupi_n_632,
+       csa_tree_add1_add_30_16_groupi_n_633,
+       csa_tree_add1_add_30_16_groupi_n_634,
+       csa_tree_add1_add_30_16_groupi_n_635;
+  wire csa_tree_add1_add_30_16_groupi_n_636,
+       csa_tree_add1_add_30_16_groupi_n_637,
+       csa_tree_add1_add_30_16_groupi_n_638,
+       csa_tree_add1_add_30_16_groupi_n_639,
+       csa_tree_add1_add_30_16_groupi_n_640,
+       csa_tree_add1_add_30_16_groupi_n_641,
+       csa_tree_add1_add_30_16_groupi_n_642,
+       csa_tree_add1_add_30_16_groupi_n_643;
+  wire csa_tree_add1_add_30_16_groupi_n_644,
+       csa_tree_add1_add_30_16_groupi_n_645,
+       csa_tree_add1_add_30_16_groupi_n_646,
+       csa_tree_add1_add_30_16_groupi_n_647,
+       csa_tree_add1_add_30_16_groupi_n_648,
+       csa_tree_add1_add_30_16_groupi_n_649,
+       csa_tree_add1_add_30_16_groupi_n_650,
+       csa_tree_add1_add_30_16_groupi_n_651;
+  wire csa_tree_add1_add_30_16_groupi_n_652,
+       csa_tree_add1_add_30_16_groupi_n_653,
+       csa_tree_add1_add_30_16_groupi_n_654,
+       csa_tree_add1_add_30_16_groupi_n_655,
+       csa_tree_add1_add_30_16_groupi_n_656,
+       csa_tree_add1_add_30_16_groupi_n_657,
+       csa_tree_add1_add_30_16_groupi_n_658,
+       csa_tree_add1_add_30_16_groupi_n_659;
+  wire csa_tree_add1_add_30_16_groupi_n_660,
+       csa_tree_add1_add_30_16_groupi_n_661,
+       csa_tree_add1_add_30_16_groupi_n_662,
+       csa_tree_add1_add_30_16_groupi_n_663,
+       csa_tree_add1_add_30_16_groupi_n_664,
+       csa_tree_add1_add_30_16_groupi_n_665,
+       csa_tree_add1_add_30_16_groupi_n_666,
+       csa_tree_add1_add_30_16_groupi_n_667;
+  wire csa_tree_add1_add_30_16_groupi_n_668,
+       csa_tree_add1_add_30_16_groupi_n_669,
+       csa_tree_add1_add_30_16_groupi_n_670,
+       csa_tree_add1_add_30_16_groupi_n_671,
+       csa_tree_add1_add_30_16_groupi_n_672,
+       csa_tree_add1_add_30_16_groupi_n_673,
+       csa_tree_add1_add_30_16_groupi_n_674,
+       csa_tree_add1_add_30_16_groupi_n_676;
+  wire csa_tree_add1_add_30_16_groupi_n_677,
+       csa_tree_add1_add_30_16_groupi_n_678,
+       csa_tree_add1_add_30_16_groupi_n_679,
+       csa_tree_add1_add_30_16_groupi_n_680,
+       csa_tree_add1_add_30_16_groupi_n_681,
+       csa_tree_add1_add_30_16_groupi_n_682,
+       csa_tree_add1_add_30_16_groupi_n_683,
+       csa_tree_add1_add_30_16_groupi_n_684;
+  wire csa_tree_add1_add_30_16_groupi_n_685,
+       csa_tree_add1_add_30_16_groupi_n_686,
+       csa_tree_add1_add_30_16_groupi_n_687,
+       csa_tree_add1_add_30_16_groupi_n_688,
+       csa_tree_add1_add_30_16_groupi_n_689,
+       csa_tree_add1_add_30_16_groupi_n_690,
+       csa_tree_add1_add_30_16_groupi_n_691,
+       csa_tree_add1_add_30_16_groupi_n_692;
+  wire csa_tree_add1_add_30_16_groupi_n_693,
+       csa_tree_add1_add_30_16_groupi_n_694,
+       csa_tree_add1_add_30_16_groupi_n_695,
+       csa_tree_add1_add_30_16_groupi_n_696,
+       csa_tree_add1_add_30_16_groupi_n_697,
+       csa_tree_add1_add_30_16_groupi_n_698,
+       csa_tree_add1_add_30_16_groupi_n_699,
+       csa_tree_add1_add_30_16_groupi_n_700;
+  wire csa_tree_add1_add_30_16_groupi_n_701,
+       csa_tree_add1_add_30_16_groupi_n_702,
+       csa_tree_add1_add_30_16_groupi_n_703,
+       csa_tree_add1_add_30_16_groupi_n_704,
+       csa_tree_add1_add_30_16_groupi_n_705,
+       csa_tree_add1_add_30_16_groupi_n_706,
+       csa_tree_add1_add_30_16_groupi_n_707,
+       csa_tree_add1_add_30_16_groupi_n_708;
+  wire csa_tree_add1_add_30_16_groupi_n_709,
+       csa_tree_add1_add_30_16_groupi_n_710,
+       csa_tree_add1_add_30_16_groupi_n_711,
+       csa_tree_add1_add_30_16_groupi_n_712,
+       csa_tree_add1_add_30_16_groupi_n_713,
+       csa_tree_add1_add_30_16_groupi_n_714,
+       csa_tree_add1_add_30_16_groupi_n_717,
+       csa_tree_add1_add_30_16_groupi_n_718;
+  wire csa_tree_add1_add_30_16_groupi_n_719,
+       csa_tree_add1_add_30_16_groupi_n_720,
+       csa_tree_add1_add_30_16_groupi_n_721,
+       csa_tree_add1_add_30_16_groupi_n_722,
+       csa_tree_add1_add_30_16_groupi_n_723,
+       csa_tree_add1_add_30_16_groupi_n_724,
+       csa_tree_add1_add_30_16_groupi_n_725,
+       csa_tree_add1_add_30_16_groupi_n_726;
+  wire csa_tree_add1_add_30_16_groupi_n_727,
+       csa_tree_add1_add_30_16_groupi_n_728,
+       csa_tree_add1_add_30_16_groupi_n_729,
+       csa_tree_add1_add_30_16_groupi_n_730,
+       csa_tree_add1_add_30_16_groupi_n_731,
+       csa_tree_add1_add_30_16_groupi_n_732,
+       csa_tree_add1_add_30_16_groupi_n_733,
+       csa_tree_add1_add_30_16_groupi_n_734;
+  wire csa_tree_add1_add_30_16_groupi_n_737,
+       csa_tree_add1_add_30_16_groupi_n_738,
+       csa_tree_add1_add_30_16_groupi_n_739,
+       csa_tree_add1_add_30_16_groupi_n_740,
+       csa_tree_add1_add_30_16_groupi_n_741,
+       csa_tree_add1_add_30_16_groupi_n_742,
+       csa_tree_add1_add_30_16_groupi_n_743,
+       csa_tree_add1_add_30_16_groupi_n_744;
+  wire csa_tree_add1_add_30_16_groupi_n_745,
+       csa_tree_add1_add_30_16_groupi_n_746,
+       csa_tree_add1_add_30_16_groupi_n_747,
+       csa_tree_add1_add_30_16_groupi_n_748,
+       csa_tree_add1_add_30_16_groupi_n_749,
+       csa_tree_add1_add_30_16_groupi_n_750,
+       csa_tree_add1_add_30_16_groupi_n_751,
+       csa_tree_add1_add_30_16_groupi_n_752;
+  wire csa_tree_add1_add_30_16_groupi_n_753,
+       csa_tree_add1_add_30_16_groupi_n_754,
+       csa_tree_add1_add_30_16_groupi_n_755,
+       csa_tree_add1_add_30_16_groupi_n_756,
+       csa_tree_add1_add_30_16_groupi_n_757,
+       csa_tree_add1_add_30_16_groupi_n_758,
+       csa_tree_add1_add_30_16_groupi_n_759,
+       csa_tree_add1_add_30_16_groupi_n_760;
+  wire csa_tree_add1_add_30_16_groupi_n_761,
+       csa_tree_add1_add_30_16_groupi_n_762,
+       csa_tree_add1_add_30_16_groupi_n_763,
+       csa_tree_add1_add_30_16_groupi_n_764,
+       csa_tree_add1_add_30_16_groupi_n_765,
+       csa_tree_add1_add_30_16_groupi_n_766,
+       csa_tree_add1_add_30_16_groupi_n_767,
+       csa_tree_add1_add_30_16_groupi_n_768;
+  wire csa_tree_add1_add_30_16_groupi_n_769,
+       csa_tree_add1_add_30_16_groupi_n_770,
+       csa_tree_add1_add_30_16_groupi_n_771,
+       csa_tree_add1_add_30_16_groupi_n_772,
+       csa_tree_add1_add_30_16_groupi_n_773,
+       csa_tree_add1_add_30_16_groupi_n_774,
+       csa_tree_add1_add_30_16_groupi_n_775,
+       csa_tree_add1_add_30_16_groupi_n_776;
+  wire csa_tree_add1_add_30_16_groupi_n_777,
+       csa_tree_add1_add_30_16_groupi_n_779,
+       csa_tree_add1_add_30_16_groupi_n_780,
+       csa_tree_add1_add_30_16_groupi_n_781,
+       csa_tree_add1_add_30_16_groupi_n_782,
+       csa_tree_add1_add_30_16_groupi_n_783,
+       csa_tree_add1_add_30_16_groupi_n_784,
+       csa_tree_add1_add_30_16_groupi_n_785;
+  wire csa_tree_add1_add_30_16_groupi_n_786,
+       csa_tree_add1_add_30_16_groupi_n_787,
+       csa_tree_add1_add_30_16_groupi_n_788,
+       csa_tree_add1_add_30_16_groupi_n_789,
+       csa_tree_add1_add_30_16_groupi_n_790,
+       csa_tree_add1_add_30_16_groupi_n_791,
+       csa_tree_add1_add_30_16_groupi_n_792,
+       csa_tree_add1_add_30_16_groupi_n_793;
+  wire csa_tree_add1_add_30_16_groupi_n_794,
+       csa_tree_add1_add_30_16_groupi_n_795,
+       csa_tree_add1_add_30_16_groupi_n_796,
+       csa_tree_add1_add_30_16_groupi_n_797,
+       csa_tree_add1_add_30_16_groupi_n_798,
+       csa_tree_add1_add_30_16_groupi_n_799,
+       csa_tree_add1_add_30_16_groupi_n_800,
+       csa_tree_add1_add_30_16_groupi_n_801;
+  wire csa_tree_add1_add_30_16_groupi_n_802,
+       csa_tree_add1_add_30_16_groupi_n_803,
+       csa_tree_add1_add_30_16_groupi_n_804,
+       csa_tree_add1_add_30_16_groupi_n_805,
+       csa_tree_add1_add_30_16_groupi_n_806,
+       csa_tree_add1_add_30_16_groupi_n_807,
+       csa_tree_add1_add_30_16_groupi_n_808,
+       csa_tree_add1_add_30_16_groupi_n_809;
+  wire csa_tree_add1_add_30_16_groupi_n_810,
+       csa_tree_add1_add_30_16_groupi_n_811,
+       csa_tree_add1_add_30_16_groupi_n_812,
+       csa_tree_add1_add_30_16_groupi_n_813,
+       csa_tree_add1_add_30_16_groupi_n_814,
+       csa_tree_add1_add_30_16_groupi_n_815,
+       csa_tree_add1_add_30_16_groupi_n_816,
+       csa_tree_add1_add_30_16_groupi_n_817;
+  wire csa_tree_add1_add_30_16_groupi_n_818,
+       csa_tree_add1_add_30_16_groupi_n_819,
+       csa_tree_add1_add_30_16_groupi_n_820,
+       csa_tree_add1_add_30_16_groupi_n_821,
+       csa_tree_add1_add_30_16_groupi_n_822,
+       csa_tree_add1_add_30_16_groupi_n_823,
+       csa_tree_add1_add_30_16_groupi_n_824,
+       csa_tree_add1_add_30_16_groupi_n_825;
+  wire csa_tree_add1_add_30_16_groupi_n_826,
+       csa_tree_add1_add_30_16_groupi_n_827,
+       csa_tree_add1_add_30_16_groupi_n_828,
+       csa_tree_add1_add_30_16_groupi_n_829,
+       csa_tree_add1_add_30_16_groupi_n_831,
+       csa_tree_add1_add_30_16_groupi_n_832,
+       csa_tree_add1_add_30_16_groupi_n_833,
+       csa_tree_add1_add_30_16_groupi_n_834;
+  wire csa_tree_add1_add_30_16_groupi_n_835,
+       csa_tree_add1_add_30_16_groupi_n_836,
+       csa_tree_add1_add_30_16_groupi_n_837,
+       csa_tree_add1_add_30_16_groupi_n_838,
+       csa_tree_add1_add_30_16_groupi_n_839,
+       csa_tree_add1_add_30_16_groupi_n_840,
+       csa_tree_add1_add_30_16_groupi_n_842,
+       csa_tree_add1_add_30_16_groupi_n_843;
+  wire csa_tree_add1_add_30_16_groupi_n_844,
+       csa_tree_add1_add_30_16_groupi_n_845,
+       csa_tree_add1_add_30_16_groupi_n_846,
+       csa_tree_add1_add_30_16_groupi_n_847,
+       csa_tree_add1_add_30_16_groupi_n_848,
+       csa_tree_add1_add_30_16_groupi_n_849,
+       csa_tree_add1_add_30_16_groupi_n_850,
+       csa_tree_add1_add_30_16_groupi_n_851;
+  wire csa_tree_add1_add_30_16_groupi_n_852,
+       csa_tree_add1_add_30_16_groupi_n_853,
+       csa_tree_add1_add_30_16_groupi_n_854,
+       csa_tree_add1_add_30_16_groupi_n_855,
+       csa_tree_add1_add_30_16_groupi_n_856,
+       csa_tree_add1_add_30_16_groupi_n_857,
+       csa_tree_add1_add_30_16_groupi_n_858,
+       csa_tree_add1_add_30_16_groupi_n_859;
+  wire csa_tree_add1_add_30_16_groupi_n_860,
+       csa_tree_add1_add_30_16_groupi_n_861,
+       csa_tree_add1_add_30_16_groupi_n_862,
+       csa_tree_add1_add_30_16_groupi_n_863,
+       csa_tree_add1_add_30_16_groupi_n_864,
+       csa_tree_add1_add_30_16_groupi_n_865,
+       csa_tree_add1_add_30_16_groupi_n_866,
+       csa_tree_add1_add_30_16_groupi_n_867;
+  wire csa_tree_add1_add_30_16_groupi_n_868,
+       csa_tree_add1_add_30_16_groupi_n_869,
+       csa_tree_add1_add_30_16_groupi_n_870,
+       csa_tree_add1_add_30_16_groupi_n_872,
+       csa_tree_add1_add_30_16_groupi_n_873,
+       csa_tree_add1_add_30_16_groupi_n_874,
+       csa_tree_add1_add_30_16_groupi_n_875,
+       csa_tree_add1_add_30_16_groupi_n_876;
+  wire csa_tree_add1_add_30_16_groupi_n_877,
+       csa_tree_add1_add_30_16_groupi_n_878,
+       csa_tree_add1_add_30_16_groupi_n_879,
+       csa_tree_add1_add_30_16_groupi_n_880,
+       csa_tree_add1_add_30_16_groupi_n_881,
+       csa_tree_add1_add_30_16_groupi_n_882,
+       csa_tree_add1_add_30_16_groupi_n_883,
+       csa_tree_add1_add_30_16_groupi_n_884;
+  wire csa_tree_add1_add_30_16_groupi_n_885,
+       csa_tree_add1_add_30_16_groupi_n_886,
+       csa_tree_add1_add_30_16_groupi_n_887,
+       csa_tree_add1_add_30_16_groupi_n_888,
+       csa_tree_add1_add_30_16_groupi_n_889,
+       csa_tree_add1_add_30_16_groupi_n_890,
+       csa_tree_add1_add_30_16_groupi_n_891,
+       csa_tree_add1_add_30_16_groupi_n_892;
+  wire csa_tree_add1_add_30_16_groupi_n_893,
+       csa_tree_add1_add_30_16_groupi_n_894,
+       csa_tree_add1_add_30_16_groupi_n_895,
+       csa_tree_add1_add_30_16_groupi_n_896,
+       csa_tree_add1_add_30_16_groupi_n_897,
+       csa_tree_add1_add_30_16_groupi_n_898,
+       csa_tree_add1_add_30_16_groupi_n_899,
+       csa_tree_add1_add_30_16_groupi_n_900;
+  wire csa_tree_add1_add_30_16_groupi_n_901,
+       csa_tree_add1_add_30_16_groupi_n_902,
+       csa_tree_add1_add_30_16_groupi_n_903,
+       csa_tree_add1_add_30_16_groupi_n_904,
+       csa_tree_add1_add_30_16_groupi_n_905,
+       csa_tree_add1_add_30_16_groupi_n_906,
+       csa_tree_add1_add_30_16_groupi_n_907,
+       csa_tree_add1_add_30_16_groupi_n_908;
+  wire csa_tree_add1_add_30_16_groupi_n_909,
+       csa_tree_add1_add_30_16_groupi_n_910,
+       csa_tree_add1_add_30_16_groupi_n_911,
+       csa_tree_add1_add_30_16_groupi_n_912,
+       csa_tree_add1_add_30_16_groupi_n_913,
+       csa_tree_add1_add_30_16_groupi_n_914,
+       csa_tree_add1_add_30_16_groupi_n_915,
+       csa_tree_add1_add_30_16_groupi_n_916;
+  wire csa_tree_add1_add_30_16_groupi_n_917,
+       csa_tree_add1_add_30_16_groupi_n_918,
+       csa_tree_add1_add_30_16_groupi_n_919,
+       csa_tree_add1_add_30_16_groupi_n_920,
+       csa_tree_add1_add_30_16_groupi_n_921,
+       csa_tree_add1_add_30_16_groupi_n_922,
+       csa_tree_add1_add_30_16_groupi_n_923,
+       csa_tree_add1_add_30_16_groupi_n_924;
+  wire csa_tree_add1_add_30_16_groupi_n_925,
+       csa_tree_add1_add_30_16_groupi_n_926,
+       csa_tree_add1_add_30_16_groupi_n_927,
+       csa_tree_add1_add_30_16_groupi_n_928,
+       csa_tree_add1_add_30_16_groupi_n_929,
+       csa_tree_add1_add_30_16_groupi_n_930,
+       csa_tree_add1_add_30_16_groupi_n_931,
+       csa_tree_add1_add_30_16_groupi_n_932;
+  wire csa_tree_add1_add_30_16_groupi_n_933,
+       csa_tree_add1_add_30_16_groupi_n_934,
+       csa_tree_add1_add_30_16_groupi_n_935,
+       csa_tree_add1_add_30_16_groupi_n_936,
+       csa_tree_add1_add_30_16_groupi_n_937,
+       csa_tree_add1_add_30_16_groupi_n_938,
+       csa_tree_add1_add_30_16_groupi_n_940,
+       csa_tree_add1_add_30_16_groupi_n_941;
+  wire csa_tree_add1_add_30_16_groupi_n_942,
+       csa_tree_add1_add_30_16_groupi_n_943,
+       csa_tree_add1_add_30_16_groupi_n_944,
+       csa_tree_add1_add_30_16_groupi_n_945,
+       csa_tree_add1_add_30_16_groupi_n_946,
+       csa_tree_add1_add_30_16_groupi_n_947,
+       csa_tree_add1_add_30_16_groupi_n_948,
+       csa_tree_add1_add_30_16_groupi_n_949;
+  wire csa_tree_add1_add_30_16_groupi_n_950,
+       csa_tree_add1_add_30_16_groupi_n_951,
+       csa_tree_add1_add_30_16_groupi_n_952,
+       csa_tree_add1_add_30_16_groupi_n_953,
+       csa_tree_add1_add_30_16_groupi_n_954,
+       csa_tree_add1_add_30_16_groupi_n_955,
+       csa_tree_add1_add_30_16_groupi_n_956,
+       csa_tree_add1_add_30_16_groupi_n_957;
+  wire csa_tree_add1_add_30_16_groupi_n_958,
+       csa_tree_add1_add_30_16_groupi_n_959,
+       csa_tree_add1_add_30_16_groupi_n_960,
+       csa_tree_add1_add_30_16_groupi_n_961,
+       csa_tree_add1_add_30_16_groupi_n_962,
+       csa_tree_add1_add_30_16_groupi_n_963,
+       csa_tree_add1_add_30_16_groupi_n_964,
+       csa_tree_add1_add_30_16_groupi_n_966;
+  wire csa_tree_add1_add_30_16_groupi_n_967,
+       csa_tree_add1_add_30_16_groupi_n_968,
+       csa_tree_add1_add_30_16_groupi_n_969,
+       csa_tree_add1_add_30_16_groupi_n_970,
+       csa_tree_add1_add_30_16_groupi_n_971,
+       csa_tree_add1_add_30_16_groupi_n_973,
+       csa_tree_add1_add_30_16_groupi_n_974,
+       csa_tree_add1_add_30_16_groupi_n_975;
+  wire csa_tree_add1_add_30_16_groupi_n_976,
+       csa_tree_add1_add_30_16_groupi_n_977,
+       csa_tree_add1_add_30_16_groupi_n_978,
+       csa_tree_add1_add_30_16_groupi_n_979,
+       csa_tree_add1_add_30_16_groupi_n_980,
+       csa_tree_add1_add_30_16_groupi_n_981,
+       csa_tree_add1_add_30_16_groupi_n_982,
+       csa_tree_add1_add_30_16_groupi_n_983;
+  wire csa_tree_add1_add_30_16_groupi_n_984,
+       csa_tree_add1_add_30_16_groupi_n_985,
+       csa_tree_add1_add_30_16_groupi_n_986,
+       csa_tree_add1_add_30_16_groupi_n_987,
+       csa_tree_add1_add_30_16_groupi_n_988,
+       csa_tree_add1_add_30_16_groupi_n_989,
+       csa_tree_add1_add_30_16_groupi_n_990,
+       csa_tree_add1_add_30_16_groupi_n_991;
+  wire csa_tree_add1_add_30_16_groupi_n_992,
+       csa_tree_add1_add_30_16_groupi_n_993,
+       csa_tree_add1_add_30_16_groupi_n_994,
+       csa_tree_add1_add_30_16_groupi_n_995,
+       csa_tree_add1_add_30_16_groupi_n_996,
+       csa_tree_add1_add_30_16_groupi_n_997,
+       csa_tree_add1_add_30_16_groupi_n_998,
+       csa_tree_add1_add_30_16_groupi_n_999;
+  wire csa_tree_add1_add_30_16_groupi_n_1000,
+       csa_tree_add1_add_30_16_groupi_n_1001,
+       csa_tree_add1_add_30_16_groupi_n_1002,
+       csa_tree_add1_add_30_16_groupi_n_1003,
+       csa_tree_add1_add_30_16_groupi_n_1004,
+       csa_tree_add1_add_30_16_groupi_n_1005,
+       csa_tree_add1_add_30_16_groupi_n_1006,
+       csa_tree_add1_add_30_16_groupi_n_1007;
+  wire csa_tree_add1_add_30_16_groupi_n_1008,
+       csa_tree_add1_add_30_16_groupi_n_1009,
+       csa_tree_add1_add_30_16_groupi_n_1010,
+       csa_tree_add1_add_30_16_groupi_n_1011,
+       csa_tree_add1_add_30_16_groupi_n_1012,
+       csa_tree_add1_add_30_16_groupi_n_1013,
+       csa_tree_add1_add_30_16_groupi_n_1014,
+       csa_tree_add1_add_30_16_groupi_n_1015;
+  wire csa_tree_add1_add_30_16_groupi_n_1016,
+       csa_tree_add1_add_30_16_groupi_n_1017,
+       csa_tree_add1_add_30_16_groupi_n_1018,
+       csa_tree_add1_add_30_16_groupi_n_1019,
+       csa_tree_add1_add_30_16_groupi_n_1020,
+       csa_tree_add1_add_30_16_groupi_n_1021,
+       csa_tree_add1_add_30_16_groupi_n_1022,
+       csa_tree_add1_add_30_16_groupi_n_1023;
+  wire csa_tree_add1_add_30_16_groupi_n_1024,
+       csa_tree_add1_add_30_16_groupi_n_1025,
+       csa_tree_add1_add_30_16_groupi_n_1026,
+       csa_tree_add1_add_30_16_groupi_n_1028,
+       csa_tree_add1_add_30_16_groupi_n_1029,
+       csa_tree_add1_add_30_16_groupi_n_1030,
+       csa_tree_add1_add_30_16_groupi_n_1031,
+       csa_tree_add1_add_30_16_groupi_n_1032;
+  wire csa_tree_add1_add_30_16_groupi_n_1033,
+       csa_tree_add1_add_30_16_groupi_n_1034,
+       csa_tree_add1_add_30_16_groupi_n_1035,
+       csa_tree_add1_add_30_16_groupi_n_1036,
+       csa_tree_add1_add_30_16_groupi_n_1037,
+       csa_tree_add1_add_30_16_groupi_n_1038,
+       csa_tree_add1_add_30_16_groupi_n_1039,
+       csa_tree_add1_add_30_16_groupi_n_1040;
+  wire csa_tree_add1_add_30_16_groupi_n_1041,
+       csa_tree_add1_add_30_16_groupi_n_1042,
+       csa_tree_add1_add_30_16_groupi_n_1043,
+       csa_tree_add1_add_30_16_groupi_n_1045,
+       csa_tree_add1_add_30_16_groupi_n_1046,
+       csa_tree_add1_add_30_16_groupi_n_1047,
+       csa_tree_add1_add_30_16_groupi_n_1048,
+       csa_tree_add1_add_30_16_groupi_n_1049;
+  wire csa_tree_add1_add_30_16_groupi_n_1050,
+       csa_tree_add1_add_30_16_groupi_n_1051,
+       csa_tree_add1_add_30_16_groupi_n_1052,
+       csa_tree_add1_add_30_16_groupi_n_1053,
+       csa_tree_add1_add_30_16_groupi_n_1054,
+       csa_tree_add1_add_30_16_groupi_n_1055,
+       csa_tree_add1_add_30_16_groupi_n_1056,
+       csa_tree_add1_add_30_16_groupi_n_1057;
+  wire csa_tree_add1_add_30_16_groupi_n_1058,
+       csa_tree_add1_add_30_16_groupi_n_1059,
+       csa_tree_add1_add_30_16_groupi_n_1060,
+       csa_tree_add1_add_30_16_groupi_n_1061,
+       csa_tree_add1_add_30_16_groupi_n_1063,
+       csa_tree_add1_add_30_16_groupi_n_1064,
+       csa_tree_add1_add_30_16_groupi_n_1065,
+       csa_tree_add1_add_30_16_groupi_n_1066;
+  wire csa_tree_add1_add_30_16_groupi_n_1067,
+       csa_tree_add1_add_30_16_groupi_n_1068,
+       csa_tree_add1_add_30_16_groupi_n_1069,
+       csa_tree_add1_add_30_16_groupi_n_1070,
+       csa_tree_add1_add_30_16_groupi_n_1071,
+       csa_tree_add1_add_30_16_groupi_n_1072,
+       csa_tree_add1_add_30_16_groupi_n_1073,
+       csa_tree_add1_add_30_16_groupi_n_1074;
+  wire csa_tree_add1_add_30_16_groupi_n_1075,
+       csa_tree_add1_add_30_16_groupi_n_1076,
+       csa_tree_add1_add_30_16_groupi_n_1078,
+       csa_tree_add1_add_30_16_groupi_n_1079,
+       csa_tree_add1_add_30_16_groupi_n_1080,
+       csa_tree_add1_add_30_16_groupi_n_1081,
+       csa_tree_add1_add_30_16_groupi_n_1082,
+       csa_tree_add1_add_30_16_groupi_n_1083;
+  wire csa_tree_add1_add_30_16_groupi_n_1084,
+       csa_tree_add1_add_30_16_groupi_n_1085,
+       csa_tree_add1_add_30_16_groupi_n_1086,
+       csa_tree_add1_add_30_16_groupi_n_1087,
+       csa_tree_add1_add_30_16_groupi_n_1088,
+       csa_tree_add1_add_30_16_groupi_n_1089,
+       csa_tree_add1_add_30_16_groupi_n_1090,
+       csa_tree_add1_add_30_16_groupi_n_1091;
+  wire csa_tree_add1_add_30_16_groupi_n_1092,
+       csa_tree_add1_add_30_16_groupi_n_1093,
+       csa_tree_add1_add_30_16_groupi_n_1094,
+       csa_tree_add1_add_30_16_groupi_n_1095,
+       csa_tree_add1_add_30_16_groupi_n_1096,
+       csa_tree_add1_add_30_16_groupi_n_1099,
+       csa_tree_add1_add_30_16_groupi_n_1100,
+       csa_tree_add1_add_30_16_groupi_n_1101;
+  wire csa_tree_add1_add_30_16_groupi_n_1102,
+       csa_tree_add1_add_30_16_groupi_n_1103,
+       csa_tree_add1_add_30_16_groupi_n_1104,
+       csa_tree_add1_add_30_16_groupi_n_1105,
+       csa_tree_add1_add_30_16_groupi_n_1106,
+       csa_tree_add1_add_30_16_groupi_n_1107,
+       csa_tree_add1_add_30_16_groupi_n_1108,
+       csa_tree_add1_add_30_16_groupi_n_1109;
+  wire csa_tree_add1_add_30_16_groupi_n_1110,
+       csa_tree_add1_add_30_16_groupi_n_1111,
+       csa_tree_add1_add_30_16_groupi_n_1112,
+       csa_tree_add1_add_30_16_groupi_n_1113,
+       csa_tree_add1_add_30_16_groupi_n_1114,
+       csa_tree_add1_add_30_16_groupi_n_1115,
+       csa_tree_add1_add_30_16_groupi_n_1116,
+       csa_tree_add1_add_30_16_groupi_n_1117;
+  wire csa_tree_add1_add_30_16_groupi_n_1118,
+       csa_tree_add1_add_30_16_groupi_n_1119,
+       csa_tree_add1_add_30_16_groupi_n_1120,
+       csa_tree_add1_add_30_16_groupi_n_1121,
+       csa_tree_add1_add_30_16_groupi_n_1122,
+       csa_tree_add1_add_30_16_groupi_n_1123,
+       csa_tree_add1_add_30_16_groupi_n_1124,
+       csa_tree_add1_add_30_16_groupi_n_1125;
+  wire csa_tree_add1_add_30_16_groupi_n_1126,
+       csa_tree_add1_add_30_16_groupi_n_1127,
+       csa_tree_add1_add_30_16_groupi_n_1128,
+       csa_tree_add1_add_30_16_groupi_n_1129,
+       csa_tree_add1_add_30_16_groupi_n_1130,
+       csa_tree_add1_add_30_16_groupi_n_1131,
+       csa_tree_add1_add_30_16_groupi_n_1132,
+       csa_tree_add1_add_30_16_groupi_n_1133;
+  wire csa_tree_add1_add_30_16_groupi_n_1134,
+       csa_tree_add1_add_30_16_groupi_n_1135,
+       csa_tree_add1_add_30_16_groupi_n_1136,
+       csa_tree_add1_add_30_16_groupi_n_1137,
+       csa_tree_add1_add_30_16_groupi_n_1139,
+       csa_tree_add1_add_30_16_groupi_n_1140,
+       csa_tree_add1_add_30_16_groupi_n_1141,
+       csa_tree_add1_add_30_16_groupi_n_1142;
+  wire csa_tree_add1_add_30_16_groupi_n_1143,
+       csa_tree_add1_add_30_16_groupi_n_1144,
+       csa_tree_add1_add_30_16_groupi_n_1145,
+       csa_tree_add1_add_30_16_groupi_n_1146,
+       csa_tree_add1_add_30_16_groupi_n_1147,
+       csa_tree_add1_add_30_16_groupi_n_1148,
+       csa_tree_add1_add_30_16_groupi_n_1149,
+       csa_tree_add1_add_30_16_groupi_n_1150;
+  wire csa_tree_add1_add_30_16_groupi_n_1151,
+       csa_tree_add1_add_30_16_groupi_n_1152,
+       csa_tree_add1_add_30_16_groupi_n_1153,
+       csa_tree_add1_add_30_16_groupi_n_1154,
+       csa_tree_add1_add_30_16_groupi_n_1155,
+       csa_tree_add1_add_30_16_groupi_n_1156,
+       csa_tree_add1_add_30_16_groupi_n_1157,
+       csa_tree_add1_add_30_16_groupi_n_1158;
+  wire csa_tree_add1_add_30_16_groupi_n_1159,
+       csa_tree_add1_add_30_16_groupi_n_1160,
+       csa_tree_add1_add_30_16_groupi_n_1161,
+       csa_tree_add1_add_30_16_groupi_n_1162,
+       csa_tree_add1_add_30_16_groupi_n_1163,
+       csa_tree_add1_add_30_16_groupi_n_1164,
+       csa_tree_add1_add_30_16_groupi_n_1165,
+       csa_tree_add1_add_30_16_groupi_n_1166;
+  wire csa_tree_add1_add_30_16_groupi_n_1167,
+       csa_tree_add1_add_30_16_groupi_n_1168,
+       csa_tree_add1_add_30_16_groupi_n_1169,
+       csa_tree_add1_add_30_16_groupi_n_1170,
+       csa_tree_add1_add_30_16_groupi_n_1171,
+       csa_tree_add1_add_30_16_groupi_n_1172,
+       csa_tree_add1_add_30_16_groupi_n_1173,
+       csa_tree_add1_add_30_16_groupi_n_1174;
+  wire csa_tree_add1_add_30_16_groupi_n_1175,
+       csa_tree_add1_add_30_16_groupi_n_1176,
+       csa_tree_add1_add_30_16_groupi_n_1177,
+       csa_tree_add1_add_30_16_groupi_n_1178,
+       csa_tree_add1_add_30_16_groupi_n_1179,
+       csa_tree_add1_add_30_16_groupi_n_1180,
+       csa_tree_add1_add_30_16_groupi_n_1181,
+       csa_tree_add1_add_30_16_groupi_n_1182;
+  wire csa_tree_add1_add_30_16_groupi_n_1183,
+       csa_tree_add1_add_30_16_groupi_n_1184,
+       csa_tree_add1_add_30_16_groupi_n_1185,
+       csa_tree_add1_add_30_16_groupi_n_1186,
+       csa_tree_add1_add_30_16_groupi_n_1187,
+       csa_tree_add1_add_30_16_groupi_n_1188,
+       csa_tree_add1_add_30_16_groupi_n_1189,
+       csa_tree_add1_add_30_16_groupi_n_1190;
+  wire csa_tree_add1_add_30_16_groupi_n_1191,
+       csa_tree_add1_add_30_16_groupi_n_1192,
+       csa_tree_add1_add_30_16_groupi_n_1193,
+       csa_tree_add1_add_30_16_groupi_n_1194,
+       csa_tree_add1_add_30_16_groupi_n_1195,
+       csa_tree_add1_add_30_16_groupi_n_1196,
+       csa_tree_add1_add_30_16_groupi_n_1197,
+       csa_tree_add1_add_30_16_groupi_n_1198;
+  wire csa_tree_add1_add_30_16_groupi_n_1199,
+       csa_tree_add1_add_30_16_groupi_n_1200,
+       csa_tree_add1_add_30_16_groupi_n_1201,
+       csa_tree_add1_add_30_16_groupi_n_1202,
+       csa_tree_add1_add_30_16_groupi_n_1203,
+       csa_tree_add1_add_30_16_groupi_n_1204,
+       csa_tree_add1_add_30_16_groupi_n_1205,
+       csa_tree_add1_add_30_16_groupi_n_1206;
+  wire csa_tree_add1_add_30_16_groupi_n_1207,
+       csa_tree_add1_add_30_16_groupi_n_1208,
+       csa_tree_add1_add_30_16_groupi_n_1209,
+       csa_tree_add1_add_30_16_groupi_n_1210,
+       csa_tree_add1_add_30_16_groupi_n_1211,
+       csa_tree_add1_add_30_16_groupi_n_1212,
+       csa_tree_add1_add_30_16_groupi_n_1213,
+       csa_tree_add1_add_30_16_groupi_n_1214;
+  wire csa_tree_add1_add_30_16_groupi_n_1215,
+       csa_tree_add1_add_30_16_groupi_n_1216,
+       csa_tree_add1_add_30_16_groupi_n_1218,
+       csa_tree_add1_add_30_16_groupi_n_1219,
+       csa_tree_add1_add_30_16_groupi_n_1220,
+       csa_tree_add1_add_30_16_groupi_n_1221,
+       csa_tree_add1_add_30_16_groupi_n_1222,
+       csa_tree_add1_add_30_16_groupi_n_1223;
+  wire csa_tree_add1_add_30_16_groupi_n_1224,
+       csa_tree_add1_add_30_16_groupi_n_1225,
+       csa_tree_add1_add_30_16_groupi_n_1226,
+       csa_tree_add1_add_30_16_groupi_n_1227,
+       csa_tree_add1_add_30_16_groupi_n_1228,
+       csa_tree_add1_add_30_16_groupi_n_1229,
+       csa_tree_add1_add_30_16_groupi_n_1230,
+       csa_tree_add1_add_30_16_groupi_n_1231;
+  wire csa_tree_add1_add_30_16_groupi_n_1232,
+       csa_tree_add1_add_30_16_groupi_n_1233,
+       csa_tree_add1_add_30_16_groupi_n_1234,
+       csa_tree_add1_add_30_16_groupi_n_1235,
+       csa_tree_add1_add_30_16_groupi_n_1236,
+       csa_tree_add1_add_30_16_groupi_n_1237,
+       csa_tree_add1_add_30_16_groupi_n_1238,
+       csa_tree_add1_add_30_16_groupi_n_1239;
+  wire csa_tree_add1_add_30_16_groupi_n_1240,
+       csa_tree_add1_add_30_16_groupi_n_1241,
+       csa_tree_add1_add_30_16_groupi_n_1242,
+       csa_tree_add1_add_30_16_groupi_n_1243,
+       csa_tree_add1_add_30_16_groupi_n_1244,
+       csa_tree_add1_add_30_16_groupi_n_1245,
+       csa_tree_add1_add_30_16_groupi_n_1246,
+       csa_tree_add1_add_30_16_groupi_n_1247;
+  wire csa_tree_add1_add_30_16_groupi_n_1248,
+       csa_tree_add1_add_30_16_groupi_n_1249,
+       csa_tree_add1_add_30_16_groupi_n_1250,
+       csa_tree_add1_add_30_16_groupi_n_1252,
+       csa_tree_add1_add_30_16_groupi_n_1253,
+       csa_tree_add1_add_30_16_groupi_n_1254,
+       csa_tree_add1_add_30_16_groupi_n_1255,
+       csa_tree_add1_add_30_16_groupi_n_1256;
+  wire csa_tree_add1_add_30_16_groupi_n_1257,
+       csa_tree_add1_add_30_16_groupi_n_1258,
+       csa_tree_add1_add_30_16_groupi_n_1259,
+       csa_tree_add1_add_30_16_groupi_n_1260,
+       csa_tree_add1_add_30_16_groupi_n_1261,
+       csa_tree_add1_add_30_16_groupi_n_1263,
+       csa_tree_add1_add_30_16_groupi_n_1264,
+       csa_tree_add1_add_30_16_groupi_n_1265;
+  wire csa_tree_add1_add_30_16_groupi_n_1267,
+       csa_tree_add1_add_30_16_groupi_n_1268,
+       csa_tree_add1_add_30_16_groupi_n_1269,
+       csa_tree_add1_add_30_16_groupi_n_1271,
+       csa_tree_add1_add_30_16_groupi_n_1272,
+       csa_tree_add1_add_30_16_groupi_n_1273,
+       csa_tree_add1_add_30_16_groupi_n_1275,
+       csa_tree_add1_add_30_16_groupi_n_1276;
+  wire csa_tree_add1_add_30_16_groupi_n_1277,
+       csa_tree_add1_add_30_16_groupi_n_1279,
+       csa_tree_add1_add_30_16_groupi_n_1280,
+       csa_tree_add1_add_30_16_groupi_n_1281,
+       csa_tree_add1_add_30_16_groupi_n_1283,
+       csa_tree_add1_add_30_16_groupi_n_1284,
+       csa_tree_add1_add_30_16_groupi_n_1285,
+       csa_tree_add1_add_30_16_groupi_n_1287;
+  wire csa_tree_add1_add_30_16_groupi_n_1288,
+       csa_tree_add1_add_30_16_groupi_n_1289,
+       csa_tree_add1_add_30_16_groupi_n_1291,
+       csa_tree_add1_add_30_16_groupi_n_1292,
+       csa_tree_add1_add_30_16_groupi_n_1293,
+       csa_tree_add1_add_30_16_groupi_n_1295,
+       csa_tree_add1_add_30_16_groupi_n_1296,
+       csa_tree_add1_add_30_16_groupi_n_1299;
+  wire csa_tree_add1_add_30_16_groupi_n_1300,
+       csa_tree_add1_add_30_16_groupi_n_1303,
+       csa_tree_add1_add_30_16_groupi_n_1304,
+       csa_tree_add1_add_30_16_groupi_n_1305,
+       csa_tree_add1_add_30_16_groupi_n_1307,
+       csa_tree_add1_add_30_16_groupi_n_1309,
+       csa_tree_add1_add_30_16_groupi_n_1311,
+       csa_tree_add1_add_30_16_groupi_n_1313;
+  wire csa_tree_add1_add_30_16_groupi_n_1315,
+       csa_tree_add1_add_30_16_groupi_n_1317,
+       csa_tree_add1_add_30_16_groupi_n_1319,
+       csa_tree_add1_add_30_16_groupi_n_1321,
+       csa_tree_add1_add_30_16_groupi_n_1323,
+       csa_tree_add1_add_30_16_groupi_n_1325,
+       csa_tree_add1_add_30_16_groupi_n_1327,
+       csa_tree_add1_add_30_16_groupi_n_1329;
+  wire csa_tree_add1_add_30_16_groupi_n_1331, n_4, n_5, n_6, n_7, n_10,
+       n_11, n_1403;
+  wire n_1404, n_1407, n_1408, n_1409, n_1410, n_1411, n_1412, n_1413;
+  wire n_1414, n_1415;
+  flopenr_WIDTH32 reg1(clk, reset, en, sum, sum_q);
+  sky130_osu_sc_18T_ms__buf_1 g14(.A (b[9]), .Y (n_11));
+  sky130_osu_sc_18T_ms__buf_1 g13(.A (b[7]), .Y (n_10));
+  sky130_osu_sc_18T_ms__buf_1 g12(.A (b[5]), .Y (n_7));
+  sky130_osu_sc_18T_ms__buf_1 g8(.A (b[11]), .Y (n_6));
+  sky130_osu_sc_18T_ms__buf_8 g15(.A (b[13]), .Y (n_5));
+  sky130_osu_sc_18T_ms__buf_2 g11(.A (b[3]), .Y (n_4));
+  sky130_osu_sc_18T_ms__buf_1 g10(.A (b[1]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_121));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7795__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_1331), .B
+       (csa_tree_add1_add_30_16_groupi_n_1105), .Y (sum[31]));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7796__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1008), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1329), .B0
+       (csa_tree_add1_add_30_16_groupi_n_31), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1331));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7797__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_1329), .B
+       (csa_tree_add1_add_30_16_groupi_n_1068), .Y (sum[30]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7800__5122(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1130), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1327), .B0
+       (csa_tree_add1_add_30_16_groupi_n_29), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1329));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7801__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_1327), .B
+       (csa_tree_add1_add_30_16_groupi_n_1167), .Y (sum[29]));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7804__7098(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1154), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1325), .B0
+       (csa_tree_add1_add_30_16_groupi_n_27), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1327));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7805__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_1325), .B
+       (csa_tree_add1_add_30_16_groupi_n_1193), .Y (sum[28]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7808__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1157), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1323), .B0
+       (csa_tree_add1_add_30_16_groupi_n_25), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1325));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7809__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_1323), .B
+       (csa_tree_add1_add_30_16_groupi_n_1215), .Y (sum[27]));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7812__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1171), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1321), .B0
+       (csa_tree_add1_add_30_16_groupi_n_23), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1323));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7813__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_1321), .B
+       (csa_tree_add1_add_30_16_groupi_n_1213), .Y (sum[26]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7816__6161(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1198), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1319), .B0
+       (csa_tree_add1_add_30_16_groupi_n_21), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1321));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7817__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_1319), .B
+       (csa_tree_add1_add_30_16_groupi_n_1232), .Y (sum[25]));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7820__9945(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1199), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1317), .B0
+       (csa_tree_add1_add_30_16_groupi_n_19), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1319));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7821__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_1317), .B
+       (csa_tree_add1_add_30_16_groupi_n_1231), .Y (sum[24]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7824__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1227), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1315), .B0
+       (csa_tree_add1_add_30_16_groupi_n_17), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1317));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7825__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_1315), .B
+       (csa_tree_add1_add_30_16_groupi_n_1246), .Y (sum[23]));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7828__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1228), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1313), .B0
+       (csa_tree_add1_add_30_16_groupi_n_15), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1315));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7829__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_1313), .B
+       (csa_tree_add1_add_30_16_groupi_n_1256), .Y (sum[22]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7832__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1244), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1311), .B0
+       (csa_tree_add1_add_30_16_groupi_n_13), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1313));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7833__2398(.A
+       (csa_tree_add1_add_30_16_groupi_n_1311), .B
+       (csa_tree_add1_add_30_16_groupi_n_1255), .Y (sum[21]));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7836__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1235), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1309), .B0
+       (csa_tree_add1_add_30_16_groupi_n_11), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1311));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7837__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_1309), .B
+       (csa_tree_add1_add_30_16_groupi_n_1254), .Y (sum[20]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7840__4319(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1249), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1307), .B0
+       (csa_tree_add1_add_30_16_groupi_n_9), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1309));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7841__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_1307), .B
+       (csa_tree_add1_add_30_16_groupi_n_1258), .Y (sum[19]));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7844__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1247), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1304), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1305), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1307));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7845__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_1304), .B
+       (csa_tree_add1_add_30_16_groupi_n_1257), .Y (sum[18]));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g7846__3680(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1225), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1248), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1303), .B1
+       (csa_tree_add1_add_30_16_groupi_n_1225), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1305));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7847(.A
+       (csa_tree_add1_add_30_16_groupi_n_1303), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1304));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7848__1617(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1219), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1300), .B0 (n_1403), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1303));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7849__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_1300), .B
+       (csa_tree_add1_add_30_16_groupi_n_1245), .Y (sum[17]));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7851(.A
+       (csa_tree_add1_add_30_16_groupi_n_1299), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1300));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7852__5122(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1233), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1296), .B0 (n_1404), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1299));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7853__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_1296), .B
+       (csa_tree_add1_add_30_16_groupi_n_1252), .Y (sum[16]));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7855(.A
+       (csa_tree_add1_add_30_16_groupi_n_1295), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1296));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7856__6131(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1236), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1292), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1293), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1295));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7857__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_1292), .B
+       (csa_tree_add1_add_30_16_groupi_n_1253), .Y (sum[15]));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g7858__5115(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1174), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1237), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1291), .B1
+       (csa_tree_add1_add_30_16_groupi_n_1174), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1293));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7859(.A
+       (csa_tree_add1_add_30_16_groupi_n_1291), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1292));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7860__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1170), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1288), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1289), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1291));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7861__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_1288), .B
+       (csa_tree_add1_add_30_16_groupi_n_1212), .Y (sum[14]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7862__6161(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1190), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1287), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1208), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1289));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7863(.A
+       (csa_tree_add1_add_30_16_groupi_n_1287), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1288));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7864__9315(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1169), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1284), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1285), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1287));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7865__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_1284), .B
+       (csa_tree_add1_add_30_16_groupi_n_1216), .Y (sum[13]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7866__2883(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1159), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1283), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1205), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1285));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7867(.A
+       (csa_tree_add1_add_30_16_groupi_n_1283), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1284));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7868__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1144), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1280), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1281), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1283));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7869__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_1280), .B
+       (csa_tree_add1_add_30_16_groupi_n_1196), .Y (sum[12]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7870__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1161), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1279), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1182), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1281));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7871(.A
+       (csa_tree_add1_add_30_16_groupi_n_1279), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1280));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7872__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1168), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1276), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1277), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1279));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7873__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_1276), .B
+       (csa_tree_add1_add_30_16_groupi_n_1211), .Y (sum[11]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7874__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1156), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1275), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1202), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1277));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7875(.A
+       (csa_tree_add1_add_30_16_groupi_n_1275), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1276));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7876__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1143), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1272), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1273), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1275));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7877__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_1272), .B
+       (csa_tree_add1_add_30_16_groupi_n_1192), .Y (sum[10]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7878__4319(.A0 (n_1411), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1271), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1183), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1273));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7879(.A
+       (csa_tree_add1_add_30_16_groupi_n_1271), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1272));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7880__8428(.A0
+       (csa_tree_add1_add_30_16_groupi_n_41), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1268), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1269), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1271));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7881__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_1268), .B
+       (csa_tree_add1_add_30_16_groupi_n_5), .Y (sum[9]));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g7882__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1131), .A1 (n_1410), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1267), .B1
+       (csa_tree_add1_add_30_16_groupi_n_1131), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1269));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7883(.A
+       (csa_tree_add1_add_30_16_groupi_n_1267), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1268));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7884__3680(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1075), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1264), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1265), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1267));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7885__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_1264), .B
+       (csa_tree_add1_add_30_16_groupi_n_1136), .Y (sum[8]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7886__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1011), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1263), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1128), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1265));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7887(.A
+       (csa_tree_add1_add_30_16_groupi_n_1263), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1264));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7888__1705(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1030), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1260), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1261), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1263));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7889__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_1260), .B
+       (csa_tree_add1_add_30_16_groupi_n_1113), .Y (sum[7]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7890__8246(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1005), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1259), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1091), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1261));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7891(.A
+       (csa_tree_add1_add_30_16_groupi_n_1259), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1260));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7892__7098(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1053), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1241), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1250), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1259));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7893__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_1249), .B
+       (csa_tree_add1_add_30_16_groupi_n_1242), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1258));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g7894__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1247), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1248), .S0
+       (csa_tree_add1_add_30_16_groupi_n_1225), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1257));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g7895__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_1238), .B
+       (csa_tree_add1_add_30_16_groupi_n_1228), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1256));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7896__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_1226), .B
+       (csa_tree_add1_add_30_16_groupi_n_1244), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1255));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g7897__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_1243), .B
+       (csa_tree_add1_add_30_16_groupi_n_1235), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1254));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g7898__6161(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1236), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1237), .S0
+       (csa_tree_add1_add_30_16_groupi_n_1174), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1253));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g7899__9315(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1233), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1234), .S0
+       (csa_tree_add1_add_30_16_groupi_n_1230), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1252));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7900__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_1241), .B
+       (csa_tree_add1_add_30_16_groupi_n_1108), .Y (sum[6]));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7901__2883(.A0
+       (csa_tree_add1_add_30_16_groupi_n_963), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1240), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1092), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1250));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7902__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_1214), .B
+       (csa_tree_add1_add_30_16_groupi_n_1162), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1249));
+  sky130_osu_sc_18T_ms__inv_6 csa_tree_add1_add_30_16_groupi_g7903(.A
+       (csa_tree_add1_add_30_16_groupi_n_1248), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1247));
+  sky130_osu_sc_18T_ms__or2_4
+       csa_tree_add1_add_30_16_groupi_g7904__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_1239), .B
+       (csa_tree_add1_add_30_16_groupi_n_8), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1248));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7905__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_1221), .B
+       (csa_tree_add1_add_30_16_groupi_n_1227), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1246));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g7906__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1219), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1220), .S0
+       (csa_tree_add1_add_30_16_groupi_n_1229), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1245));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7907(.A
+       (csa_tree_add1_add_30_16_groupi_n_1240), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1241));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g7909__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_1163), .B
+       (csa_tree_add1_add_30_16_groupi_n_1222), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1239));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7910__2398(.A
+       (csa_tree_add1_add_30_16_groupi_n_1194), .B
+       (csa_tree_add1_add_30_16_groupi_n_1191), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1244));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g7911__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1162), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1204), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1172), .B1
+       (csa_tree_add1_add_30_16_groupi_n_1147), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1243));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g7912__6260(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1163), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1209), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1173), .B1
+       (csa_tree_add1_add_30_16_groupi_n_1099), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1242));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7913__4319(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1186), .A1
+       (csa_tree_add1_add_30_16_groupi_n_943), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1218), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1240));
+  sky130_osu_sc_18T_ms__inv_8 csa_tree_add1_add_30_16_groupi_g7914(.A
+       (csa_tree_add1_add_30_16_groupi_n_1237), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1236));
+  sky130_osu_sc_18T_ms__inv_8 csa_tree_add1_add_30_16_groupi_g7915(.A
+       (csa_tree_add1_add_30_16_groupi_n_1234), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1233));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7916__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_1187), .B
+       (csa_tree_add1_add_30_16_groupi_n_1198), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1232));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g7917__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_1199), .B
+       (csa_tree_add1_add_30_16_groupi_n_1210), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1231));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7918__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_1197), .B
+       (csa_tree_add1_add_30_16_groupi_n_1133), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1238));
+  sky130_osu_sc_18T_ms__or2_4
+       csa_tree_add1_add_30_16_groupi_g7919__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_1224), .B
+       (csa_tree_add1_add_30_16_groupi_n_7), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1237));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7920__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_1195), .B
+       (csa_tree_add1_add_30_16_groupi_n_1165), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1235));
+  sky130_osu_sc_18T_ms__or2_4
+       csa_tree_add1_add_30_16_groupi_g7921__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_1223), .B
+       (csa_tree_add1_add_30_16_groupi_n_6), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1234));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g7923__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_1102), .B
+       (csa_tree_add1_add_30_16_groupi_n_1201), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1224));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g7925__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_1117), .B
+       (csa_tree_add1_add_30_16_groupi_n_1200), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1223));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g7926__8246(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1102), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1181), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1145), .B1
+       (csa_tree_add1_add_30_16_groupi_n_1056), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1230));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g7927__7098(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1117), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1180), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1146), .B1
+       (csa_tree_add1_add_30_16_groupi_n_1040), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1229));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7928__6131(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1058), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1140), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1203), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1228));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g7929__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1133), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1184), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1142), .B1
+       (csa_tree_add1_add_30_16_groupi_n_1007), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1227));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g7930__5115(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1165), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1178), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1148), .B1
+       (csa_tree_add1_add_30_16_groupi_n_1115), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1226));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g7931__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1176), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1151), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1079), .B1
+       (csa_tree_add1_add_30_16_groupi_n_1132), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1225));
+  sky130_osu_sc_18T_ms__inv_8 csa_tree_add1_add_30_16_groupi_g7933(.A
+       (csa_tree_add1_add_30_16_groupi_n_1220), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1219));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7934__4733(.A0
+       (csa_tree_add1_add_30_16_groupi_n_849), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1185), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1000), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1218));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7935__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_1186), .B
+       (csa_tree_add1_add_30_16_groupi_n_1023), .Y (sum[5]));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7936__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_1173), .B
+       (csa_tree_add1_add_30_16_groupi_n_1099), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1222));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7937__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_1169), .B
+       (csa_tree_add1_add_30_16_groupi_n_1159), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1216));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7938__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_1175), .B
+       (csa_tree_add1_add_30_16_groupi_n_1157), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1215));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7939__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_1172), .B
+       (csa_tree_add1_add_30_16_groupi_n_1147), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1214));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g7940__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_1171), .B
+       (csa_tree_add1_add_30_16_groupi_n_1188), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1213));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7941__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_1190), .B
+       (csa_tree_add1_add_30_16_groupi_n_1170), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1212));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7942__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_1156), .B
+       (csa_tree_add1_add_30_16_groupi_n_1168), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1211));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7943__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_1166), .B
+       (csa_tree_add1_add_30_16_groupi_n_1164), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1221));
+  sky130_osu_sc_18T_ms__or2_4
+       csa_tree_add1_add_30_16_groupi_g7944__2398(.A
+       (csa_tree_add1_add_30_16_groupi_n_1206), .B
+       (csa_tree_add1_add_30_16_groupi_n_1207), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1220));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g7945__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_1173), .B
+       (csa_tree_add1_add_30_16_groupi_n_1099), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1209));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g7946__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_1189), .B
+       (csa_tree_add1_add_30_16_groupi_n_1170), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1208));
+  sky130_osu_sc_18T_ms__and2_1
+       csa_tree_add1_add_30_16_groupi_g7947__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_1177), .B
+       (csa_tree_add1_add_30_16_groupi_n_1176), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1207));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g7948__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_1176), .B
+       (csa_tree_add1_add_30_16_groupi_n_1177), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1206));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g7949__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_1158), .B
+       (csa_tree_add1_add_30_16_groupi_n_1169), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1205));
+  sky130_osu_sc_18T_ms__or2_1
+       csa_tree_add1_add_30_16_groupi_g7950__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_1147), .B
+       (csa_tree_add1_add_30_16_groupi_n_1172), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1204));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g7951__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_1179), .B
+       (csa_tree_add1_add_30_16_groupi_n_1191), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1203));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g7952__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_1168), .B
+       (csa_tree_add1_add_30_16_groupi_n_1155), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1202));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g7953__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1164), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1152), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1116), .B1
+       (csa_tree_add1_add_30_16_groupi_n_1055), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1210));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7956__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_1142), .B
+       (csa_tree_add1_add_30_16_groupi_n_1007), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1197));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7957__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_1144), .B
+       (csa_tree_add1_add_30_16_groupi_n_1161), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1196));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7958__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_1145), .B
+       (csa_tree_add1_add_30_16_groupi_n_1056), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1201));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7959__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_1148), .B
+       (csa_tree_add1_add_30_16_groupi_n_1115), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1195));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g7960__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_1140), .B
+       (csa_tree_add1_add_30_16_groupi_n_1058), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1194));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g7961__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_1141), .B
+       (csa_tree_add1_add_30_16_groupi_n_1154), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1193));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7962__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_1143), .B (n_1411), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1192));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7963__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_1146), .B
+       (csa_tree_add1_add_30_16_groupi_n_1040), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1200));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7964__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_1137), .B
+       (csa_tree_add1_add_30_16_groupi_n_1103), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1199));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7965__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_1135), .B
+       (csa_tree_add1_add_30_16_groupi_n_1082), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1198));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7966(.A
+       (csa_tree_add1_add_30_16_groupi_n_1189), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1190));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7967(.A
+       (csa_tree_add1_add_30_16_groupi_n_1185), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1186));
+  sky130_osu_sc_18T_ms__and2_1
+       csa_tree_add1_add_30_16_groupi_g7968__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_1142), .B
+       (csa_tree_add1_add_30_16_groupi_n_1007), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1184));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g7969__9945(.A (n_1412), .B
+       (csa_tree_add1_add_30_16_groupi_n_1143), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1183));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g7970__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_1160), .B
+       (csa_tree_add1_add_30_16_groupi_n_1144), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1182));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g7971__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_1145), .B
+       (csa_tree_add1_add_30_16_groupi_n_1056), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1181));
+  sky130_osu_sc_18T_ms__and2_1
+       csa_tree_add1_add_30_16_groupi_g7972__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_1146), .B
+       (csa_tree_add1_add_30_16_groupi_n_1040), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1180));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g7973__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_1058), .B
+       (csa_tree_add1_add_30_16_groupi_n_1140), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1179));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g7974__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_1148), .B
+       (csa_tree_add1_add_30_16_groupi_n_1115), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1178));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g7975__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1019), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1127), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1080), .B1
+       (csa_tree_add1_add_30_16_groupi_n_982), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1191));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7976__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1006), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1078), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1149), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1189));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g7977__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1003), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1074), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1153), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1188));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g7978__6260(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1103), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1125), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1076), .B1
+       (csa_tree_add1_add_30_16_groupi_n_985), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1187));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7979__4319(.A0
+       (csa_tree_add1_add_30_16_groupi_n_3), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1096), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1139), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1185));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7980__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_1037), .B
+       (csa_tree_add1_add_30_16_groupi_n_1130), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1167));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7981__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_1116), .B
+       (csa_tree_add1_add_30_16_groupi_n_1055), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1166));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7982__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_1079), .B
+       (csa_tree_add1_add_30_16_groupi_n_1132), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1177));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7984__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_1060), .B
+       (csa_tree_add1_add_30_16_groupi_n_1114), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1176));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7985__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_1109), .B
+       (csa_tree_add1_add_30_16_groupi_n_1059), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1175));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g7986__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1041), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1054), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1150), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1174));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7987__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_1081), .B
+       (csa_tree_add1_add_30_16_groupi_n_1111), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1173));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7988__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_1112), .B
+       (csa_tree_add1_add_30_16_groupi_n_1101), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1172));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7989__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_1106), .B
+       (csa_tree_add1_add_30_16_groupi_n_1100), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1171));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7990__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_1118), .B
+       (csa_tree_add1_add_30_16_groupi_n_1104), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1170));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7991__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_1078), .B
+       (csa_tree_add1_add_30_16_groupi_n_1107), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1169));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g7992__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_1110), .B
+       (csa_tree_add1_add_30_16_groupi_n_990), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1168));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7994(.A
+       (csa_tree_add1_add_30_16_groupi_n_1160), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1161));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7995(.A
+       (csa_tree_add1_add_30_16_groupi_n_1158), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1159));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g7996(.A
+       (csa_tree_add1_add_30_16_groupi_n_1155), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1156));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g7997__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_1082), .B
+       (csa_tree_add1_add_30_16_groupi_n_1122), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1153));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g7998__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_1055), .B
+       (csa_tree_add1_add_30_16_groupi_n_1116), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1152));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g7999__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_1079), .B
+       (csa_tree_add1_add_30_16_groupi_n_1132), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1151));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8000__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_1118), .B
+       (csa_tree_add1_add_30_16_groupi_n_1094), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1150));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8001__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_1042), .B
+       (csa_tree_add1_add_30_16_groupi_n_1126), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1149));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8002__9945(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1101), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1085), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1034), .B1
+       (csa_tree_add1_add_30_16_groupi_n_978), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1165));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8003__2883(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1015), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1087), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1039), .B1
+       (csa_tree_add1_add_30_16_groupi_n_987), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1164));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8004__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1009), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1029), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1134), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1163));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8005__1666(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1057), .A1
+       (csa_tree_add1_add_30_16_groupi_n_989), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1129), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1162));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8006__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1035), .A1
+       (csa_tree_add1_add_30_16_groupi_n_941), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1119), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1160));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8007__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_981), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1036), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1120), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1158));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8008__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1100), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1086), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1038), .B1
+       (csa_tree_add1_add_30_16_groupi_n_1002), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1157));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8009__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_880), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1033), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1123), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1155));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8010__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_915), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1031), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1124), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1154));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8011__6260(.A0
+       (csa_tree_add1_add_30_16_groupi_n_834), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1095), .B0
+       (csa_tree_add1_add_30_16_groupi_n_907), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1139));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8012__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_1096), .B
+       (csa_tree_add1_add_30_16_groupi_n_930), .Y (sum[4]));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8013__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_1076), .B
+       (csa_tree_add1_add_30_16_groupi_n_985), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1137));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8014__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_1011), .B
+       (csa_tree_add1_add_30_16_groupi_n_1075), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1136));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8015__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_1074), .B
+       (csa_tree_add1_add_30_16_groupi_n_1003), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1135));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8016__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_1080), .B
+       (csa_tree_add1_add_30_16_groupi_n_1066), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1148));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8017__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_1073), .B
+       (csa_tree_add1_add_30_16_groupi_n_969), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1147));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8018__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_1067), .B
+       (csa_tree_add1_add_30_16_groupi_n_984), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1146));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8019__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_1071), .B
+       (csa_tree_add1_add_30_16_groupi_n_1013), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1145));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8020__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_1065), .B
+       (csa_tree_add1_add_30_16_groupi_n_1036), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1144));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8021__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_1033), .B
+       (csa_tree_add1_add_30_16_groupi_n_1064), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1143));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8022__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_1070), .B
+       (csa_tree_add1_add_30_16_groupi_n_1039), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1142));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8023__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_1072), .B
+       (csa_tree_add1_add_30_16_groupi_n_1021), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1141));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8024__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_1069), .B
+       (csa_tree_add1_add_30_16_groupi_n_1061), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1140));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8025(.A
+       (csa_tree_add1_add_30_16_groupi_n_1121), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1134));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8026__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_1081), .B
+       (csa_tree_add1_add_30_16_groupi_n_1093), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1129));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8027__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_1010), .B
+       (csa_tree_add1_add_30_16_groupi_n_1075), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1128));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8028__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_982), .B
+       (csa_tree_add1_add_30_16_groupi_n_1080), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1127));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8029__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_1006), .B
+       (csa_tree_add1_add_30_16_groupi_n_1078), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1126));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8030__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_1076), .B
+       (csa_tree_add1_add_30_16_groupi_n_985), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1125));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8031__9945(.A0
+       (csa_tree_add1_add_30_16_groupi_n_916), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1032), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1059), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1124));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8032__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_1014), .B
+       (csa_tree_add1_add_30_16_groupi_n_1090), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1123));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8033__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_1003), .B
+       (csa_tree_add1_add_30_16_groupi_n_1074), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1122));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8034__1666(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1009), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1029), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1060), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1121));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8035__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_993), .B
+       (csa_tree_add1_add_30_16_groupi_n_1088), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1120));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8036__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_990), .B
+       (csa_tree_add1_add_30_16_groupi_n_1089), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1119));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8037__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1061), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1050), .B0
+       (csa_tree_add1_add_30_16_groupi_n_979), .B1
+       (csa_tree_add1_add_30_16_groupi_n_1012), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1133));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8038__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1017), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1049), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1051), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1132));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8039__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_785), .A1
+       (csa_tree_add1_add_30_16_groupi_n_980), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1083), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1131));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8040__6260(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1021), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1048), .B0
+       (csa_tree_add1_add_30_16_groupi_n_988), .B1
+       (csa_tree_add1_add_30_16_groupi_n_757), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1130));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8042__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_1029), .B
+       (csa_tree_add1_add_30_16_groupi_n_1009), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1114));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8043__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_1030), .B
+       (csa_tree_add1_add_30_16_groupi_n_1005), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1113));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8044__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_1034), .B
+       (csa_tree_add1_add_30_16_groupi_n_978), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1112));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8045__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_989), .B
+       (csa_tree_add1_add_30_16_groupi_n_1057), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1111));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8046__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_941), .B
+       (csa_tree_add1_add_30_16_groupi_n_1035), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1110));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8047__1617(.A0
+       (csa_tree_add1_add_30_16_groupi_n_915), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1032), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1031), .B1
+       (csa_tree_add1_add_30_16_groupi_n_916), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1109));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8048__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_1053), .B
+       (csa_tree_add1_add_30_16_groupi_n_963), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1108));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8049__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_1006), .B
+       (csa_tree_add1_add_30_16_groupi_n_1042), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1107));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8050__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_1038), .B
+       (csa_tree_add1_add_30_16_groupi_n_1002), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1106));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8051__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_946), .B
+       (csa_tree_add1_add_30_16_groupi_n_1025), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1105));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8052__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_1054), .B
+       (csa_tree_add1_add_30_16_groupi_n_1041), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1104));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8053__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_1024), .B
+       (csa_tree_add1_add_30_16_groupi_n_1016), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1118));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8054__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_986), .A1
+       (csa_tree_add1_add_30_16_groupi_n_875), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1084), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1117));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8055__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_1026), .B
+       (csa_tree_add1_add_30_16_groupi_n_1018), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1116));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8056__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_969), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1046), .B0
+       (csa_tree_add1_add_30_16_groupi_n_983), .B1
+       (csa_tree_add1_add_30_16_groupi_n_836), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1115));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8059(.A
+       (csa_tree_add1_add_30_16_groupi_n_1095), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1096));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8060__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_1054), .B
+       (csa_tree_add1_add_30_16_groupi_n_1041), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1094));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8061__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_989), .B
+       (csa_tree_add1_add_30_16_groupi_n_1057), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1093));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8062__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_962), .B
+       (csa_tree_add1_add_30_16_groupi_n_1053), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1092));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8063__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_1004), .B
+       (csa_tree_add1_add_30_16_groupi_n_1030), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1091));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8064__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_880), .B
+       (csa_tree_add1_add_30_16_groupi_n_1033), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1090));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8065__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_1035), .B
+       (csa_tree_add1_add_30_16_groupi_n_941), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1089));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8066__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_981), .B
+       (csa_tree_add1_add_30_16_groupi_n_1036), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1088));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8067__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_1039), .B
+       (csa_tree_add1_add_30_16_groupi_n_987), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1087));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8068__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_1038), .B
+       (csa_tree_add1_add_30_16_groupi_n_1002), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1086));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8069__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_978), .B
+       (csa_tree_add1_add_30_16_groupi_n_1034), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1085));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8070__2398(.A
+       (csa_tree_add1_add_30_16_groupi_n_1013), .B
+       (csa_tree_add1_add_30_16_groupi_n_1047), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1084));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8071__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_1043), .B
+       (csa_tree_add1_add_30_16_groupi_n_884), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1083));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8072__6260(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1018), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1001), .B0
+       (csa_tree_add1_add_30_16_groupi_n_881), .B1
+       (csa_tree_add1_add_30_16_groupi_n_964), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1103));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8073__4319(.A0
+       (csa_tree_add1_add_30_16_groupi_n_845), .A1
+       (csa_tree_add1_add_30_16_groupi_n_942), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1063), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1102));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8074__8428(.A0
+       (csa_tree_add1_add_30_16_groupi_n_995), .A1
+       (csa_tree_add1_add_30_16_groupi_n_952), .B0
+       (csa_tree_add1_add_30_16_groupi_n_917), .B1
+       (csa_tree_add1_add_30_16_groupi_n_779), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1101));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8075__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_991), .A1
+       (csa_tree_add1_add_30_16_groupi_n_911), .B0
+       (csa_tree_add1_add_30_16_groupi_n_814), .B1
+       (csa_tree_add1_add_30_16_groupi_n_706), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1100));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8076__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_788), .A1
+       (csa_tree_add1_add_30_16_groupi_n_844), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1045), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1099));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8078__1617(.A0
+       (csa_tree_add1_add_30_16_groupi_n_4), .A1
+       (csa_tree_add1_add_30_16_groupi_n_966), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1028), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1095));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8082(.A
+       (n_1410), .Y (csa_tree_add1_add_30_16_groupi_n_41));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8083__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_983), .B
+       (csa_tree_add1_add_30_16_groupi_n_836), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1073));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8084__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_988), .B
+       (csa_tree_add1_add_30_16_groupi_n_757), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1072));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8085__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_875), .B
+       (csa_tree_add1_add_30_16_groupi_n_986), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1071));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8086__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_1015), .B
+       (csa_tree_add1_add_30_16_groupi_n_987), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1070));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8087__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_979), .B
+       (csa_tree_add1_add_30_16_groupi_n_1012), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1069));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8088__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_1008), .B
+       (csa_tree_add1_add_30_16_groupi_n_940), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1068));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8089__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_1017), .B
+       (csa_tree_add1_add_30_16_groupi_n_803), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1067));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8090__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_1019), .B
+       (csa_tree_add1_add_30_16_groupi_n_982), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1066));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8091__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_981), .B
+       (csa_tree_add1_add_30_16_groupi_n_993), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1065));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8092__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_880), .B
+       (csa_tree_add1_add_30_16_groupi_n_1014), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1064));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8093__6161(.A0
+       (csa_tree_add1_add_30_16_groupi_n_959), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1020), .B0
+       (csa_tree_add1_add_30_16_groupi_n_876), .B1
+       (csa_tree_add1_add_30_16_groupi_n_805), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1082));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8094__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_974), .B
+       (csa_tree_add1_add_30_16_groupi_n_995), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1081));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8095__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_975), .B
+       (csa_tree_add1_add_30_16_groupi_n_970), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1080));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8096__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_937), .B
+       (csa_tree_add1_add_30_16_groupi_n_992), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1079));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8097__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_976), .B
+       (csa_tree_add1_add_30_16_groupi_n_968), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1078));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8099__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_1020), .B
+       (csa_tree_add1_add_30_16_groupi_n_973), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1076));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8100__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_977), .B
+       (csa_tree_add1_add_30_16_groupi_n_980), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1075));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8101__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_932), .B
+       (csa_tree_add1_add_30_16_groupi_n_991), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1074));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8102(.A
+       (csa_tree_add1_add_30_16_groupi_n_1052), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1063));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8104__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_845), .A1
+       (csa_tree_add1_add_30_16_groupi_n_942), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1016), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1052));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8105__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_984), .B
+       (csa_tree_add1_add_30_16_groupi_n_804), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1051));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8106__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_1012), .B
+       (csa_tree_add1_add_30_16_groupi_n_979), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1050));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8107__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_804), .B
+       (csa_tree_add1_add_30_16_groupi_n_984), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1049));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8108__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_988), .B
+       (csa_tree_add1_add_30_16_groupi_n_757), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1048));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8109__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_875), .B
+       (csa_tree_add1_add_30_16_groupi_n_986), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1047));
+  sky130_osu_sc_18T_ms__or2_1
+       csa_tree_add1_add_30_16_groupi_g8110__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_836), .B
+       (csa_tree_add1_add_30_16_groupi_n_983), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1046));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8111__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_992), .B
+       (csa_tree_add1_add_30_16_groupi_n_903), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1045));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8113__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_980), .B
+       (csa_tree_add1_add_30_16_groupi_n_785), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1043));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8114__1705(.A0
+       (csa_tree_add1_add_30_16_groupi_n_811), .A1
+       (csa_tree_add1_add_30_16_groupi_n_879), .B0
+       (csa_tree_add1_add_30_16_groupi_n_996), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1061));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8115__5122(.A0
+       (csa_tree_add1_add_30_16_groupi_n_835), .A1
+       (csa_tree_add1_add_30_16_groupi_n_838), .B0
+       (csa_tree_add1_add_30_16_groupi_n_997), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1060));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8116__8246(.A0
+       (csa_tree_add1_add_30_16_groupi_n_784), .A1
+       (csa_tree_add1_add_30_16_groupi_n_877), .B0
+       (csa_tree_add1_add_30_16_groupi_n_999), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1059));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8117__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_885), .B
+       (csa_tree_add1_add_30_16_groupi_n_945), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1058));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8118__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_938), .B
+       (csa_tree_add1_add_30_16_groupi_n_792), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1057));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8119__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_851), .B
+       (csa_tree_add1_add_30_16_groupi_n_936), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1056));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8120__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_798), .B
+       (csa_tree_add1_add_30_16_groupi_n_935), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1055));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8121__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_812), .A1
+       (csa_tree_add1_add_30_16_groupi_n_878), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1022), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1054));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8122__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_944), .B
+       (csa_tree_add1_add_30_16_groupi_n_850), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1053));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8123(.A
+       (csa_tree_add1_add_30_16_groupi_n_1032), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1031));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8124__6161(.A0
+       (csa_tree_add1_add_30_16_groupi_n_703), .A1 (n_1407), .B0
+       (csa_tree_add1_add_30_16_groupi_n_912), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1028));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8125__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_966), .B
+       (csa_tree_add1_add_30_16_groupi_n_921), .Y (sum[3]));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8126__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_881), .B
+       (csa_tree_add1_add_30_16_groupi_n_964), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1026));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8127__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_928), .B
+       (csa_tree_add1_add_30_16_groupi_n_676), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1025));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8128__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_942), .B
+       (csa_tree_add1_add_30_16_groupi_n_845), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1024));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8129__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_943), .B
+       (csa_tree_add1_add_30_16_groupi_n_849), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1023));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8130__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_763), .B
+       (csa_tree_add1_add_30_16_groupi_n_923), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1042));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8131__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_925), .B
+       (csa_tree_add1_add_30_16_groupi_n_724), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1041));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8132__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_926), .B
+       (csa_tree_add1_add_30_16_groupi_n_967), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1040));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8133__2398(.A
+       (csa_tree_add1_add_30_16_groupi_n_934), .B
+       (csa_tree_add1_add_30_16_groupi_n_831), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1039));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8134__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_877), .B
+       (csa_tree_add1_add_30_16_groupi_n_931), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1038));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8135__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_883), .B
+       (csa_tree_add1_add_30_16_groupi_n_933), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1037));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8136__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_886), .B
+       (csa_tree_add1_add_30_16_groupi_n_922), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1036));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8137__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_918), .B
+       (csa_tree_add1_add_30_16_groupi_n_919), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1035));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8138__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_920), .B
+       (csa_tree_add1_add_30_16_groupi_n_770), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1034));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8139__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_924), .B
+       (csa_tree_add1_add_30_16_groupi_n_852), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1033));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8140__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_927), .B
+       (csa_tree_add1_add_30_16_groupi_n_781), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1032));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8141__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_882), .B
+       (csa_tree_add1_add_30_16_groupi_n_947), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1030));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8142__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_929), .B
+       (csa_tree_add1_add_30_16_groupi_n_732), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1029));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8143(.A
+       (csa_tree_add1_add_30_16_groupi_n_998), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1022));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8144(.A
+       (csa_tree_add1_add_30_16_groupi_n_1010), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1011));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8145(.A
+       (csa_tree_add1_add_30_16_groupi_n_1004), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1005));
+  sky130_osu_sc_18T_ms__or2_1
+       csa_tree_add1_add_30_16_groupi_g8146__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_964), .B
+       (csa_tree_add1_add_30_16_groupi_n_881), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1001));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8147__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_848), .B
+       (csa_tree_add1_add_30_16_groupi_n_943), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1000));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8148__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_761), .B
+       (csa_tree_add1_add_30_16_groupi_n_960), .Y
+       (csa_tree_add1_add_30_16_groupi_n_999));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8149__7098(.A0
+       (csa_tree_add1_add_30_16_groupi_n_812), .A1
+       (csa_tree_add1_add_30_16_groupi_n_878), .B0
+       (csa_tree_add1_add_30_16_groupi_n_968), .Y
+       (csa_tree_add1_add_30_16_groupi_n_998));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8150__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_901), .B
+       (csa_tree_add1_add_30_16_groupi_n_967), .Y
+       (csa_tree_add1_add_30_16_groupi_n_997));
+  sky130_osu_sc_18T_ms__nand2_1
+       csa_tree_add1_add_30_16_groupi_g8151__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_970), .B
+       (csa_tree_add1_add_30_16_groupi_n_950), .Y
+       (csa_tree_add1_add_30_16_groupi_n_996));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8152__5115(.A0
+       (csa_tree_add1_add_30_16_groupi_n_744), .A1
+       (csa_tree_add1_add_30_16_groupi_n_896), .B0
+       (csa_tree_add1_add_30_16_groupi_n_800), .B1
+       (csa_tree_add1_add_30_16_groupi_n_782), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1021));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8153__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_737), .A1
+       (csa_tree_add1_add_30_16_groupi_n_889), .B0
+       (csa_tree_add1_add_30_16_groupi_n_799), .B1
+       (csa_tree_add1_add_30_16_groupi_n_794), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1020));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8154__4733(.A0
+       (csa_tree_add1_add_30_16_groupi_n_808), .A1
+       (csa_tree_add1_add_30_16_groupi_n_809), .B0
+       (csa_tree_add1_add_30_16_groupi_n_954), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1019));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8155__6161(.A0
+       (csa_tree_add1_add_30_16_groupi_n_905), .A1
+       (csa_tree_add1_add_30_16_groupi_n_771), .B0
+       (csa_tree_add1_add_30_16_groupi_n_832), .B1
+       (csa_tree_add1_add_30_16_groupi_n_840), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1018));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8156__9315(.A0
+       (csa_tree_add1_add_30_16_groupi_n_837), .A1
+       (csa_tree_add1_add_30_16_groupi_n_839), .B0
+       (csa_tree_add1_add_30_16_groupi_n_949), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1017));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8157__9945(.A0
+       (csa_tree_add1_add_30_16_groupi_n_727), .A1
+       (csa_tree_add1_add_30_16_groupi_n_810), .B0
+       (csa_tree_add1_add_30_16_groupi_n_953), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1016));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8158__2883(.A0
+       (csa_tree_add1_add_30_16_groupi_n_765), .A1
+       (csa_tree_add1_add_30_16_groupi_n_909), .B0
+       (csa_tree_add1_add_30_16_groupi_n_843), .B1
+       (csa_tree_add1_add_30_16_groupi_n_726), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1015));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8159__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_789), .A1
+       (csa_tree_add1_add_30_16_groupi_n_709), .B0
+       (csa_tree_add1_add_30_16_groupi_n_971), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1014));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8160__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_898), .B
+       (csa_tree_add1_add_30_16_groupi_n_948), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1013));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8161__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_741), .A1
+       (csa_tree_add1_add_30_16_groupi_n_908), .B0
+       (csa_tree_add1_add_30_16_groupi_n_797), .B1
+       (csa_tree_add1_add_30_16_groupi_n_723), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1012));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8162__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_847), .A1
+       (csa_tree_add1_add_30_16_groupi_n_699), .B0
+       (csa_tree_add1_add_30_16_groupi_n_958), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1010));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8163__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_764), .A1
+       (csa_tree_add1_add_30_16_groupi_n_899), .B0 (n_1413), .B1
+       (csa_tree_add1_add_30_16_groupi_n_728), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1009));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8164__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_806), .A1
+       (csa_tree_add1_add_30_16_groupi_n_807), .B0
+       (csa_tree_add1_add_30_16_groupi_n_955), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1008));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8165__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_900), .A1
+       (csa_tree_add1_add_30_16_groupi_n_885), .B0
+       (csa_tree_add1_add_30_16_groupi_n_783), .B1
+       (csa_tree_add1_add_30_16_groupi_n_2), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1007));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8166__6260(.A0
+       (csa_tree_add1_add_30_16_groupi_n_801), .A1
+       (csa_tree_add1_add_30_16_groupi_n_802), .B0
+       (csa_tree_add1_add_30_16_groupi_n_951), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1006));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8167__4319(.A0
+       (csa_tree_add1_add_30_16_groupi_n_705), .A1
+       (csa_tree_add1_add_30_16_groupi_n_846), .B0
+       (csa_tree_add1_add_30_16_groupi_n_961), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1004));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8168__8428(.A0
+       (csa_tree_add1_add_30_16_groupi_n_733), .A1
+       (csa_tree_add1_add_30_16_groupi_n_914), .B0
+       (csa_tree_add1_add_30_16_groupi_n_780), .B1
+       (csa_tree_add1_add_30_16_groupi_n_755), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1003));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8169__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_740), .A1
+       (csa_tree_add1_add_30_16_groupi_n_913), .B0
+       (csa_tree_add1_add_30_16_groupi_n_38), .B1
+       (csa_tree_add1_add_30_16_groupi_n_842), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1002));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8170__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_884), .B
+       (csa_tree_add1_add_30_16_groupi_n_785), .Y
+       (csa_tree_add1_add_30_16_groupi_n_977));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8171__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_878), .B
+       (csa_tree_add1_add_30_16_groupi_n_812), .Y
+       (csa_tree_add1_add_30_16_groupi_n_976));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8172__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_879), .B
+       (csa_tree_add1_add_30_16_groupi_n_811), .Y
+       (csa_tree_add1_add_30_16_groupi_n_975));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8173__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_917), .B
+       (csa_tree_add1_add_30_16_groupi_n_779), .Y
+       (csa_tree_add1_add_30_16_groupi_n_974));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8174__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_876), .B
+       (csa_tree_add1_add_30_16_groupi_n_805), .Y
+       (csa_tree_add1_add_30_16_groupi_n_973));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8176__8246(.A0
+       (csa_tree_add1_add_30_16_groupi_n_732), .A1
+       (csa_tree_add1_add_30_16_groupi_n_910), .B0
+       (csa_tree_add1_add_30_16_groupi_n_786), .B1
+       (csa_tree_add1_add_30_16_groupi_n_787), .Y
+       (csa_tree_add1_add_30_16_groupi_n_995));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8177__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_865), .B
+       (csa_tree_add1_add_30_16_groupi_n_789), .Y
+       (csa_tree_add1_add_30_16_groupi_n_994));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8178__6131(.A0
+       (csa_tree_add1_add_30_16_groupi_n_892), .A1
+       (csa_tree_add1_add_30_16_groupi_n_918), .B0
+       (csa_tree_add1_add_30_16_groupi_n_796), .B1
+       (csa_tree_add1_add_30_16_groupi_n_795), .Y
+       (csa_tree_add1_add_30_16_groupi_n_993));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8179__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_861), .B
+       (csa_tree_add1_add_30_16_groupi_n_708), .Y
+       (csa_tree_add1_add_30_16_groupi_n_992));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8180__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_868), .B
+       (csa_tree_add1_add_30_16_groupi_n_842), .Y
+       (csa_tree_add1_add_30_16_groupi_n_991));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8181__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_791), .A1
+       (csa_tree_add1_add_30_16_groupi_n_662), .B0
+       (csa_tree_add1_add_30_16_groupi_n_956), .Y
+       (csa_tree_add1_add_30_16_groupi_n_990));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8182__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_858), .B
+       (csa_tree_add1_add_30_16_groupi_n_745), .Y
+       (csa_tree_add1_add_30_16_groupi_n_989));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8183__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_664), .B
+       (csa_tree_add1_add_30_16_groupi_n_866), .Y
+       (csa_tree_add1_add_30_16_groupi_n_988));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8184__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_864), .B
+       (csa_tree_add1_add_30_16_groupi_n_762), .Y
+       (csa_tree_add1_add_30_16_groupi_n_987));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8185__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_862), .B
+       (csa_tree_add1_add_30_16_groupi_n_722), .Y
+       (csa_tree_add1_add_30_16_groupi_n_986));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8186__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_863), .B
+       (csa_tree_add1_add_30_16_groupi_n_780), .Y
+       (csa_tree_add1_add_30_16_groupi_n_985));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8187__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_869), .B (n_1413), .Y
+       (csa_tree_add1_add_30_16_groupi_n_984));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8188__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_0), .B
+       (csa_tree_add1_add_30_16_groupi_n_729), .Y
+       (csa_tree_add1_add_30_16_groupi_n_983));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8189__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_859), .B
+       (csa_tree_add1_add_30_16_groupi_n_797), .Y
+       (csa_tree_add1_add_30_16_groupi_n_982));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8190__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_860), .B
+       (csa_tree_add1_add_30_16_groupi_n_743), .Y
+       (csa_tree_add1_add_30_16_groupi_n_981));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8191__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_665), .B
+       (csa_tree_add1_add_30_16_groupi_n_857), .Y
+       (csa_tree_add1_add_30_16_groupi_n_980));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8192__2398(.A
+       (csa_tree_add1_add_30_16_groupi_n_843), .B
+       (csa_tree_add1_add_30_16_groupi_n_867), .Y
+       (csa_tree_add1_add_30_16_groupi_n_979));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8193__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_738), .A1
+       (csa_tree_add1_add_30_16_groupi_n_890), .B0
+       (csa_tree_add1_add_30_16_groupi_n_792), .B1
+       (csa_tree_add1_add_30_16_groupi_n_793), .Y
+       (csa_tree_add1_add_30_16_groupi_n_978));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8194(.A
+       (csa_tree_add1_add_30_16_groupi_n_957), .Y
+       (csa_tree_add1_add_30_16_groupi_n_971));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8196(.A
+       (csa_tree_add1_add_30_16_groupi_n_962), .Y
+       (csa_tree_add1_add_30_16_groupi_n_963));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8197__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_850), .B
+       (csa_tree_add1_add_30_16_groupi_n_906), .Y
+       (csa_tree_add1_add_30_16_groupi_n_961));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8198__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_784), .B
+       (csa_tree_add1_add_30_16_groupi_n_877), .Y
+       (csa_tree_add1_add_30_16_groupi_n_960));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8199__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_805), .B
+       (csa_tree_add1_add_30_16_groupi_n_876), .Y
+       (csa_tree_add1_add_30_16_groupi_n_959));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8200__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_894), .B
+       (csa_tree_add1_add_30_16_groupi_n_882), .Y
+       (csa_tree_add1_add_30_16_groupi_n_958));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8201__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_789), .A1
+       (csa_tree_add1_add_30_16_groupi_n_709), .B0
+       (csa_tree_add1_add_30_16_groupi_n_760), .Y
+       (csa_tree_add1_add_30_16_groupi_n_957));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8202__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_891), .B
+       (csa_tree_add1_add_30_16_groupi_n_852), .Y
+       (csa_tree_add1_add_30_16_groupi_n_956));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8203__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_904), .B
+       (csa_tree_add1_add_30_16_groupi_n_883), .Y
+       (csa_tree_add1_add_30_16_groupi_n_955));
+  sky130_osu_sc_18T_ms__nand2_1
+       csa_tree_add1_add_30_16_groupi_g8204__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_770), .B
+       (csa_tree_add1_add_30_16_groupi_n_895), .Y
+       (csa_tree_add1_add_30_16_groupi_n_954));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8205__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_763), .B
+       (csa_tree_add1_add_30_16_groupi_n_897), .Y
+       (csa_tree_add1_add_30_16_groupi_n_953));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8206__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_917), .B
+       (csa_tree_add1_add_30_16_groupi_n_779), .Y
+       (csa_tree_add1_add_30_16_groupi_n_952));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8207__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_886), .B
+       (csa_tree_add1_add_30_16_groupi_n_893), .Y
+       (csa_tree_add1_add_30_16_groupi_n_951));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8208__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_879), .B
+       (csa_tree_add1_add_30_16_groupi_n_811), .Y
+       (csa_tree_add1_add_30_16_groupi_n_950));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8209__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_851), .B
+       (csa_tree_add1_add_30_16_groupi_n_902), .Y
+       (csa_tree_add1_add_30_16_groupi_n_949));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8210__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_724), .A1
+       (csa_tree_add1_add_30_16_groupi_n_790), .B0
+       (csa_tree_add1_add_30_16_groupi_n_815), .Y
+       (csa_tree_add1_add_30_16_groupi_n_948));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8211__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_699), .B
+       (csa_tree_add1_add_30_16_groupi_n_847), .Y
+       (csa_tree_add1_add_30_16_groupi_n_947));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8212__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_854), .A1
+       (csa_tree_add1_add_30_16_groupi_n_753), .B0
+       (csa_tree_add1_add_30_16_groupi_n_661), .B1
+       (csa_tree_add1_add_30_16_groupi_n_707), .Y
+       (csa_tree_add1_add_30_16_groupi_n_946));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8213__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_783), .B
+       (csa_tree_add1_add_30_16_groupi_n_2), .Y
+       (csa_tree_add1_add_30_16_groupi_n_945));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8214__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_846), .B
+       (csa_tree_add1_add_30_16_groupi_n_705), .Y
+       (csa_tree_add1_add_30_16_groupi_n_944));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8215__9315(.A0
+       (csa_tree_add1_add_30_16_groupi_n_746), .A1
+       (csa_tree_add1_add_30_16_groupi_n_827), .B0
+       (csa_tree_add1_add_30_16_groupi_n_828), .Y
+       (csa_tree_add1_add_30_16_groupi_n_970));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8216__9945(.A0
+       (csa_tree_add1_add_30_16_groupi_n_745), .A1
+       (csa_tree_add1_add_30_16_groupi_n_829), .B0
+       (csa_tree_add1_add_30_16_groupi_n_76), .B1
+       (csa_tree_add1_add_30_16_groupi_n_725), .Y
+       (csa_tree_add1_add_30_16_groupi_n_969));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8217__2883(.A0
+       (csa_tree_add1_add_30_16_groupi_n_758), .A1
+       (csa_tree_add1_add_30_16_groupi_n_660), .B0
+       (csa_tree_add1_add_30_16_groupi_n_887), .Y
+       (csa_tree_add1_add_30_16_groupi_n_968));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8218__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_722), .A1
+       (csa_tree_add1_add_30_16_groupi_n_701), .B0
+       (csa_tree_add1_add_30_16_groupi_n_872), .Y
+       (csa_tree_add1_add_30_16_groupi_n_967));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8220__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_33), .A1
+       (csa_tree_add1_add_30_16_groupi_n_759), .B0
+       (csa_tree_add1_add_30_16_groupi_n_888), .Y
+       (csa_tree_add1_add_30_16_groupi_n_964));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8221__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_492), .A1
+       (csa_tree_add1_add_30_16_groupi_n_698), .B0
+       (csa_tree_add1_add_30_16_groupi_n_873), .Y
+       (csa_tree_add1_add_30_16_groupi_n_962));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8222__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_777), .B
+       (csa_tree_add1_add_30_16_groupi_n_756), .Y (sum[2]));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8223__2398(.A
+       (csa_tree_add1_add_30_16_groupi_n_793), .B
+       (csa_tree_add1_add_30_16_groupi_n_738), .Y
+       (csa_tree_add1_add_30_16_groupi_n_938));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8224__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_844), .B
+       (csa_tree_add1_add_30_16_groupi_n_788), .Y
+       (csa_tree_add1_add_30_16_groupi_n_937));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8225__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_839), .B
+       (csa_tree_add1_add_30_16_groupi_n_837), .Y
+       (csa_tree_add1_add_30_16_groupi_n_936));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8226__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_794), .B
+       (csa_tree_add1_add_30_16_groupi_n_737), .Y
+       (csa_tree_add1_add_30_16_groupi_n_935));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8227__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_771), .B
+       (csa_tree_add1_add_30_16_groupi_n_840), .Y
+       (csa_tree_add1_add_30_16_groupi_n_934));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8228__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_807), .B
+       (csa_tree_add1_add_30_16_groupi_n_806), .Y
+       (csa_tree_add1_add_30_16_groupi_n_933));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8229__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_814), .B
+       (csa_tree_add1_add_30_16_groupi_n_706), .Y
+       (csa_tree_add1_add_30_16_groupi_n_932));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8230__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_761), .B
+       (csa_tree_add1_add_30_16_groupi_n_784), .Y
+       (csa_tree_add1_add_30_16_groupi_n_931));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8231__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_834), .B
+       (csa_tree_add1_add_30_16_groupi_n_3), .Y
+       (csa_tree_add1_add_30_16_groupi_n_930));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8232__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_786), .B
+       (csa_tree_add1_add_30_16_groupi_n_787), .Y
+       (csa_tree_add1_add_30_16_groupi_n_929));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8233__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_775), .B
+       (csa_tree_add1_add_30_16_groupi_n_482), .Y
+       (csa_tree_add1_add_30_16_groupi_n_928));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8234__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_800), .B
+       (csa_tree_add1_add_30_16_groupi_n_744), .Y
+       (csa_tree_add1_add_30_16_groupi_n_927));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8235__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_838), .B
+       (csa_tree_add1_add_30_16_groupi_n_835), .Y
+       (csa_tree_add1_add_30_16_groupi_n_926));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8236__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_790), .B
+       (csa_tree_add1_add_30_16_groupi_n_815), .Y
+       (csa_tree_add1_add_30_16_groupi_n_925));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8237__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_662), .B
+       (csa_tree_add1_add_30_16_groupi_n_791), .Y
+       (csa_tree_add1_add_30_16_groupi_n_924));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8238__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_810), .B
+       (csa_tree_add1_add_30_16_groupi_n_727), .Y
+       (csa_tree_add1_add_30_16_groupi_n_923));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8239__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_802), .B
+       (csa_tree_add1_add_30_16_groupi_n_801), .Y
+       (csa_tree_add1_add_30_16_groupi_n_922));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8240__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_4), .B
+       (csa_tree_add1_add_30_16_groupi_n_703), .Y
+       (csa_tree_add1_add_30_16_groupi_n_921));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8241__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_809), .B
+       (csa_tree_add1_add_30_16_groupi_n_808), .Y
+       (csa_tree_add1_add_30_16_groupi_n_920));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8242__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_795), .B
+       (csa_tree_add1_add_30_16_groupi_n_796), .Y
+       (csa_tree_add1_add_30_16_groupi_n_919));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8243__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_817), .B
+       (csa_tree_add1_add_30_16_groupi_n_853), .Y
+       (csa_tree_add1_add_30_16_groupi_n_943));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8244__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_776), .B
+       (csa_tree_add1_add_30_16_groupi_n_773), .Y
+       (csa_tree_add1_add_30_16_groupi_n_942));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8245__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_774), .B
+       (csa_tree_add1_add_30_16_groupi_n_742), .Y
+       (csa_tree_add1_add_30_16_groupi_n_941));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8246__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_816), .B
+       (csa_tree_add1_add_30_16_groupi_n_854), .Y
+       (csa_tree_add1_add_30_16_groupi_n_940));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8247(.A
+       (csa_tree_add1_add_30_16_groupi_n_916), .Y
+       (csa_tree_add1_add_30_16_groupi_n_915));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8248__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_780), .B
+       (csa_tree_add1_add_30_16_groupi_n_755), .Y
+       (csa_tree_add1_add_30_16_groupi_n_914));
+  sky130_osu_sc_18T_ms__or2_1
+       csa_tree_add1_add_30_16_groupi_g8249__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_842), .B
+       (csa_tree_add1_add_30_16_groupi_n_38), .Y
+       (csa_tree_add1_add_30_16_groupi_n_913));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8250__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_702), .B
+       (csa_tree_add1_add_30_16_groupi_n_4), .Y
+       (csa_tree_add1_add_30_16_groupi_n_912));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8251__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_706), .B
+       (csa_tree_add1_add_30_16_groupi_n_814), .Y
+       (csa_tree_add1_add_30_16_groupi_n_911));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8252__2398(.A
+       (csa_tree_add1_add_30_16_groupi_n_787), .B
+       (csa_tree_add1_add_30_16_groupi_n_786), .Y
+       (csa_tree_add1_add_30_16_groupi_n_910));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8253__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_726), .B
+       (csa_tree_add1_add_30_16_groupi_n_843), .Y
+       (csa_tree_add1_add_30_16_groupi_n_909));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8254__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_797), .B
+       (csa_tree_add1_add_30_16_groupi_n_723), .Y
+       (csa_tree_add1_add_30_16_groupi_n_908));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8255__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_833), .B
+       (csa_tree_add1_add_30_16_groupi_n_3), .Y
+       (csa_tree_add1_add_30_16_groupi_n_907));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8256__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_705), .B
+       (csa_tree_add1_add_30_16_groupi_n_846), .Y
+       (csa_tree_add1_add_30_16_groupi_n_906));
+  sky130_osu_sc_18T_ms__and2_1
+       csa_tree_add1_add_30_16_groupi_g8257__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_832), .B
+       (csa_tree_add1_add_30_16_groupi_n_840), .Y
+       (csa_tree_add1_add_30_16_groupi_n_905));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8258__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_806), .B
+       (csa_tree_add1_add_30_16_groupi_n_807), .Y
+       (csa_tree_add1_add_30_16_groupi_n_904));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8259__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_788), .B
+       (csa_tree_add1_add_30_16_groupi_n_844), .Y
+       (csa_tree_add1_add_30_16_groupi_n_903));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8260__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_839), .B
+       (csa_tree_add1_add_30_16_groupi_n_837), .Y
+       (csa_tree_add1_add_30_16_groupi_n_902));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8261__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_838), .B
+       (csa_tree_add1_add_30_16_groupi_n_835), .Y
+       (csa_tree_add1_add_30_16_groupi_n_901));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8262__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_2), .B
+       (csa_tree_add1_add_30_16_groupi_n_783), .Y
+       (csa_tree_add1_add_30_16_groupi_n_900));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8263__5122(.A (n_1413), .B
+       (csa_tree_add1_add_30_16_groupi_n_728), .Y
+       (csa_tree_add1_add_30_16_groupi_n_899));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8264__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_724), .B
+       (csa_tree_add1_add_30_16_groupi_n_790), .Y
+       (csa_tree_add1_add_30_16_groupi_n_898));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8265__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_810), .B
+       (csa_tree_add1_add_30_16_groupi_n_727), .Y
+       (csa_tree_add1_add_30_16_groupi_n_897));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8266__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_782), .B
+       (csa_tree_add1_add_30_16_groupi_n_800), .Y
+       (csa_tree_add1_add_30_16_groupi_n_896));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8267__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_809), .B
+       (csa_tree_add1_add_30_16_groupi_n_808), .Y
+       (csa_tree_add1_add_30_16_groupi_n_895));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8268__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_847), .B
+       (csa_tree_add1_add_30_16_groupi_n_699), .Y
+       (csa_tree_add1_add_30_16_groupi_n_894));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8269__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_802), .B
+       (csa_tree_add1_add_30_16_groupi_n_801), .Y
+       (csa_tree_add1_add_30_16_groupi_n_893));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8270__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_795), .B
+       (csa_tree_add1_add_30_16_groupi_n_796), .Y
+       (csa_tree_add1_add_30_16_groupi_n_892));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8271__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_791), .B
+       (csa_tree_add1_add_30_16_groupi_n_662), .Y
+       (csa_tree_add1_add_30_16_groupi_n_891));
+  sky130_osu_sc_18T_ms__and2_1
+       csa_tree_add1_add_30_16_groupi_g8272__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_792), .B
+       (csa_tree_add1_add_30_16_groupi_n_793), .Y
+       (csa_tree_add1_add_30_16_groupi_n_890));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8273__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_799), .B
+       (csa_tree_add1_add_30_16_groupi_n_794), .Y
+       (csa_tree_add1_add_30_16_groupi_n_889));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8274__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_824), .B
+       (csa_tree_add1_add_30_16_groupi_n_762), .Y
+       (csa_tree_add1_add_30_16_groupi_n_888));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8275__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_509), .A1
+       (csa_tree_add1_add_30_16_groupi_n_497), .B0
+       (csa_tree_add1_add_30_16_groupi_n_823), .Y
+       (csa_tree_add1_add_30_16_groupi_n_918));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8276__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_747), .B
+       (csa_tree_add1_add_30_16_groupi_n_825), .Y
+       (csa_tree_add1_add_30_16_groupi_n_917));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8277__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_731), .A1
+       (csa_tree_add1_add_30_16_groupi_n_608), .B0 (sum_q[26]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_475), .Y
+       (csa_tree_add1_add_30_16_groupi_n_916));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g8278(.A
+       (csa_tree_add1_add_30_16_groupi_n_870), .Y
+       (csa_tree_add1_add_30_16_groupi_n_887));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8279__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_751), .B
+       (csa_tree_add1_add_30_16_groupi_n_853), .Y
+       (csa_tree_add1_add_30_16_groupi_n_873));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8280__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_826), .B
+       (csa_tree_add1_add_30_16_groupi_n_730), .Y
+       (csa_tree_add1_add_30_16_groupi_n_872));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8282__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_758), .A1
+       (csa_tree_add1_add_30_16_groupi_n_660), .B0
+       (csa_tree_add1_add_30_16_groupi_n_743), .Y
+       (csa_tree_add1_add_30_16_groupi_n_870));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8283__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_728), .B
+       (csa_tree_add1_add_30_16_groupi_n_764), .Y
+       (csa_tree_add1_add_30_16_groupi_n_869));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g8284__4319(.A0
+       (csa_tree_add1_add_30_16_groupi_n_38), .A1
+       (csa_tree_add1_add_30_16_groupi_n_78), .S0
+       (csa_tree_add1_add_30_16_groupi_n_740), .Y
+       (csa_tree_add1_add_30_16_groupi_n_868));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8285__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_726), .B
+       (csa_tree_add1_add_30_16_groupi_n_765), .Y
+       (csa_tree_add1_add_30_16_groupi_n_867));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g8286__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_479), .A1
+       (csa_tree_add1_add_30_16_groupi_n_481), .S0
+       (csa_tree_add1_add_30_16_groupi_n_769), .Y
+       (csa_tree_add1_add_30_16_groupi_n_866));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8287__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_709), .B
+       (csa_tree_add1_add_30_16_groupi_n_760), .Y
+       (csa_tree_add1_add_30_16_groupi_n_865));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g8288__3680(.A0
+       (csa_tree_add1_add_30_16_groupi_n_34), .A1
+       (csa_tree_add1_add_30_16_groupi_n_51), .S0
+       (csa_tree_add1_add_30_16_groupi_n_759), .Y
+       (csa_tree_add1_add_30_16_groupi_n_864));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8289__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_755), .B
+       (csa_tree_add1_add_30_16_groupi_n_733), .Y
+       (csa_tree_add1_add_30_16_groupi_n_863));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8290__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_701), .B
+       (csa_tree_add1_add_30_16_groupi_n_730), .Y
+       (csa_tree_add1_add_30_16_groupi_n_862));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8292__1705(.A (sum_q[17]), .B
+       (n_1414), .Y (csa_tree_add1_add_30_16_groupi_n_861));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8293__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_660), .B
+       (csa_tree_add1_add_30_16_groupi_n_758), .Y
+       (csa_tree_add1_add_30_16_groupi_n_860));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8294__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_723), .B
+       (csa_tree_add1_add_30_16_groupi_n_741), .Y
+       (csa_tree_add1_add_30_16_groupi_n_859));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8295__7098(.A (sum_q[17]), .B
+       (csa_tree_add1_add_30_16_groupi_n_725), .Y
+       (csa_tree_add1_add_30_16_groupi_n_858));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8296__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_520), .B
+       (csa_tree_add1_add_30_16_groupi_n_734), .Y
+       (csa_tree_add1_add_30_16_groupi_n_857));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8297__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_583), .A1
+       (csa_tree_add1_add_30_16_groupi_n_700), .B0
+       (csa_tree_add1_add_30_16_groupi_n_856), .Y
+       (csa_tree_add1_add_30_16_groupi_n_886));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8298__5115(.A0
+       (csa_tree_add1_add_30_16_groupi_n_616), .A1
+       (csa_tree_add1_add_30_16_groupi_n_768), .B0 (sum_q[20]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_504), .Y
+       (csa_tree_add1_add_30_16_groupi_n_885));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8299__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_507), .A1
+       (csa_tree_add1_add_30_16_groupi_n_584), .B0
+       (csa_tree_add1_add_30_16_groupi_n_855), .Y
+       (csa_tree_add1_add_30_16_groupi_n_884));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8300__4733(.A0
+       (csa_tree_add1_add_30_16_groupi_n_479), .A1
+       (csa_tree_add1_add_30_16_groupi_n_664), .B0
+       (csa_tree_add1_add_30_16_groupi_n_822), .Y
+       (csa_tree_add1_add_30_16_groupi_n_883));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8301__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_720), .B
+       (csa_tree_add1_add_30_16_groupi_n_772), .Y
+       (csa_tree_add1_add_30_16_groupi_n_882));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8302__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_332), .B
+       (csa_tree_add1_add_30_16_groupi_n_766), .Y
+       (csa_tree_add1_add_30_16_groupi_n_881));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8303__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_651), .B
+       (csa_tree_add1_add_30_16_groupi_n_739), .Y
+       (csa_tree_add1_add_30_16_groupi_n_880));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8304__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_768), .B
+       (csa_tree_add1_add_30_16_groupi_n_622), .Y
+       (csa_tree_add1_add_30_16_groupi_n_879));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8305__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_719), .B
+       (csa_tree_add1_add_30_16_groupi_n_710), .Y
+       (csa_tree_add1_add_30_16_groupi_n_878));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8306__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_620), .B
+       (csa_tree_add1_add_30_16_groupi_n_731), .Y
+       (csa_tree_add1_add_30_16_groupi_n_877));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8307__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_767), .A1
+       (csa_tree_add1_add_30_16_groupi_n_248), .B0
+       (csa_tree_add1_add_30_16_groupi_n_34), .B1
+       (csa_tree_add1_add_30_16_groupi_n_102), .Y
+       (csa_tree_add1_add_30_16_groupi_n_876));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8308__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_501), .A1
+       (csa_tree_add1_add_30_16_groupi_n_659), .B0
+       (csa_tree_add1_add_30_16_groupi_n_819), .Y
+       (csa_tree_add1_add_30_16_groupi_n_875));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8309__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_520), .A1
+       (csa_tree_add1_add_30_16_groupi_n_666), .B0
+       (csa_tree_add1_add_30_16_groupi_n_820), .Y
+       (csa_tree_add1_add_30_16_groupi_n_874));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g8310(.A
+       (csa_tree_add1_add_30_16_groupi_n_821), .Y
+       (csa_tree_add1_add_30_16_groupi_n_856));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g8311(.A
+       (csa_tree_add1_add_30_16_groupi_n_818), .Y
+       (csa_tree_add1_add_30_16_groupi_n_855));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8312(.A
+       (csa_tree_add1_add_30_16_groupi_n_848), .Y
+       (csa_tree_add1_add_30_16_groupi_n_849));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8313(.A
+       (csa_tree_add1_add_30_16_groupi_n_833), .Y
+       (csa_tree_add1_add_30_16_groupi_n_834));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8314(.A
+       (csa_tree_add1_add_30_16_groupi_n_831), .Y
+       (csa_tree_add1_add_30_16_groupi_n_832));
+  sky130_osu_sc_18T_ms__and2_1
+       csa_tree_add1_add_30_16_groupi_g8316__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_76), .B
+       (csa_tree_add1_add_30_16_groupi_n_725), .Y
+       (csa_tree_add1_add_30_16_groupi_n_829));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8317__6260(.A (sum_q[18]), .B
+       (csa_tree_add1_add_30_16_groupi_n_729), .Y
+       (csa_tree_add1_add_30_16_groupi_n_828));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8318__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_729), .B (sum_q[18]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_827));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8319__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_701), .B
+       (csa_tree_add1_add_30_16_groupi_n_722), .Y
+       (csa_tree_add1_add_30_16_groupi_n_826));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8320__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_708), .A1 (sum_q[17]), .B0
+       (n_1415), .Y (csa_tree_add1_add_30_16_groupi_n_825));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8321__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_759), .B
+       (csa_tree_add1_add_30_16_groupi_n_33), .Y
+       (csa_tree_add1_add_30_16_groupi_n_824));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8322__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_609), .B
+       (csa_tree_add1_add_30_16_groupi_n_739), .Y
+       (csa_tree_add1_add_30_16_groupi_n_823));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8323__1617(.A0
+       (csa_tree_add1_add_30_16_groupi_n_480), .A1
+       (csa_tree_add1_add_30_16_groupi_n_663), .B0
+       (csa_tree_add1_add_30_16_groupi_n_769), .Y
+       (csa_tree_add1_add_30_16_groupi_n_822));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8324__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_583), .A1
+       (csa_tree_add1_add_30_16_groupi_n_700), .B0
+       (csa_tree_add1_add_30_16_groupi_n_742), .Y
+       (csa_tree_add1_add_30_16_groupi_n_821));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8325__1705(.A0
+       (csa_tree_add1_add_30_16_groupi_n_519), .A1
+       (csa_tree_add1_add_30_16_groupi_n_665), .B0
+       (csa_tree_add1_add_30_16_groupi_n_734), .Y
+       (csa_tree_add1_add_30_16_groupi_n_820));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8326__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_752), .B
+       (csa_tree_add1_add_30_16_groupi_n_773), .Y
+       (csa_tree_add1_add_30_16_groupi_n_819));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8327__8246(.A0
+       (csa_tree_add1_add_30_16_groupi_n_507), .A1
+       (csa_tree_add1_add_30_16_groupi_n_584), .B0
+       (csa_tree_add1_add_30_16_groupi_n_772), .Y
+       (csa_tree_add1_add_30_16_groupi_n_818));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8328__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_698), .B
+       (csa_tree_add1_add_30_16_groupi_n_492), .Y
+       (csa_tree_add1_add_30_16_groupi_n_817));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8329__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_661), .B
+       (csa_tree_add1_add_30_16_groupi_n_707), .Y
+       (csa_tree_add1_add_30_16_groupi_n_816));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8330__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_615), .A1
+       (csa_tree_add1_add_30_16_groupi_n_711), .B0
+       (csa_tree_add1_add_30_16_groupi_n_480), .B1
+       (csa_tree_add1_add_30_16_groupi_n_510), .Y
+       (csa_tree_add1_add_30_16_groupi_n_854));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8331__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_578), .B
+       (csa_tree_add1_add_30_16_groupi_n_678), .Y
+       (csa_tree_add1_add_30_16_groupi_n_853));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8332__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_410), .A1
+       (csa_tree_add1_add_30_16_groupi_n_579), .B0
+       (csa_tree_add1_add_30_16_groupi_n_750), .Y
+       (csa_tree_add1_add_30_16_groupi_n_852));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8333__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_580), .B
+       (csa_tree_add1_add_30_16_groupi_n_657), .Y
+       (csa_tree_add1_add_30_16_groupi_n_851));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8334__6161(.A0
+       (csa_tree_add1_add_30_16_groupi_n_391), .A1
+       (csa_tree_add1_add_30_16_groupi_n_578), .B0
+       (csa_tree_add1_add_30_16_groupi_n_748), .Y
+       (csa_tree_add1_add_30_16_groupi_n_850));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8335__9315(.A0
+       (csa_tree_add1_add_30_16_groupi_n_595), .A1
+       (csa_tree_add1_add_30_16_groupi_n_714), .B0
+       (csa_tree_add1_add_30_16_groupi_n_394), .B1
+       (csa_tree_add1_add_30_16_groupi_n_518), .Y
+       (csa_tree_add1_add_30_16_groupi_n_848));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8336__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_668), .B
+       (csa_tree_add1_add_30_16_groupi_n_465), .Y
+       (csa_tree_add1_add_30_16_groupi_n_847));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8338__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_644), .B
+       (csa_tree_add1_add_30_16_groupi_n_495), .Y
+       (csa_tree_add1_add_30_16_groupi_n_846));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8339__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_710), .A1
+       (csa_tree_add1_add_30_16_groupi_n_695), .B0
+       (csa_tree_add1_add_30_16_groupi_n_585), .B1
+       (csa_tree_add1_add_30_16_groupi_n_433), .Y
+       (csa_tree_add1_add_30_16_groupi_n_845));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8340__1666(.A0
+       (csa_tree_add1_add_30_16_groupi_n_395), .A1
+       (csa_tree_add1_add_30_16_groupi_n_483), .B0
+       (csa_tree_add1_add_30_16_groupi_n_754), .Y
+       (csa_tree_add1_add_30_16_groupi_n_844));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8342__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_619), .B
+       (csa_tree_add1_add_30_16_groupi_n_496), .Y
+       (csa_tree_add1_add_30_16_groupi_n_843));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8344__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_677), .B
+       (csa_tree_add1_add_30_16_groupi_n_114), .Y
+       (csa_tree_add1_add_30_16_groupi_n_842));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8346__2398(.A
+       (csa_tree_add1_add_30_16_groupi_n_670), .B
+       (csa_tree_add1_add_30_16_groupi_n_118), .Y
+       (csa_tree_add1_add_30_16_groupi_n_840));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8347__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_669), .B
+       (csa_tree_add1_add_30_16_groupi_n_536), .Y
+       (csa_tree_add1_add_30_16_groupi_n_839));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8348__6260(.A0
+       (csa_tree_add1_add_30_16_groupi_n_419), .A1
+       (csa_tree_add1_add_30_16_groupi_n_580), .B0
+       (csa_tree_add1_add_30_16_groupi_n_721), .Y
+       (csa_tree_add1_add_30_16_groupi_n_838));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8349__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_658), .B
+       (csa_tree_add1_add_30_16_groupi_n_398), .Y
+       (csa_tree_add1_add_30_16_groupi_n_837));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8350__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_656), .B
+       (csa_tree_add1_add_30_16_groupi_n_486), .Y
+       (csa_tree_add1_add_30_16_groupi_n_836));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8351__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_637), .B
+       (csa_tree_add1_add_30_16_groupi_n_493), .Y
+       (csa_tree_add1_add_30_16_groupi_n_835));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8352__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_487), .A1
+       (csa_tree_add1_add_30_16_groupi_n_581), .B0
+       (csa_tree_add1_add_30_16_groupi_n_749), .Y
+       (csa_tree_add1_add_30_16_groupi_n_833));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8353__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_672), .B
+       (csa_tree_add1_add_30_16_groupi_n_452), .Y
+       (csa_tree_add1_add_30_16_groupi_n_831));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8354(.A
+       (csa_tree_add1_add_30_16_groupi_n_803), .Y
+       (csa_tree_add1_add_30_16_groupi_n_804));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8355(.A
+       (csa_tree_add1_add_30_16_groupi_n_798), .Y
+       (csa_tree_add1_add_30_16_groupi_n_799));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8356(.A
+       (csa_tree_add1_add_30_16_groupi_n_781), .Y
+       (csa_tree_add1_add_30_16_groupi_n_782));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8357__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_654), .B
+       (csa_tree_add1_add_30_16_groupi_n_265), .Y (sum[1]));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8358__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_704), .B
+       (csa_tree_add1_add_30_16_groupi_n_364), .Y
+       (csa_tree_add1_add_30_16_groupi_n_777));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8359__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_659), .B
+       (csa_tree_add1_add_30_16_groupi_n_501), .Y
+       (csa_tree_add1_add_30_16_groupi_n_776));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8360__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_639), .B
+       (csa_tree_add1_add_30_16_groupi_n_104), .Y
+       (csa_tree_add1_add_30_16_groupi_n_775));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8361__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_700), .B
+       (csa_tree_add1_add_30_16_groupi_n_583), .Y
+       (csa_tree_add1_add_30_16_groupi_n_774));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8362__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_649), .B
+       (csa_tree_add1_add_30_16_groupi_n_459), .Y
+       (csa_tree_add1_add_30_16_groupi_n_815));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8363__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_618), .B
+       (csa_tree_add1_add_30_16_groupi_n_494), .Y
+       (csa_tree_add1_add_30_16_groupi_n_814));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8364__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_579), .B
+       (csa_tree_add1_add_30_16_groupi_n_673), .Y
+       (csa_tree_add1_add_30_16_groupi_n_813));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8365__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_647), .B
+       (csa_tree_add1_add_30_16_groupi_n_387), .Y
+       (csa_tree_add1_add_30_16_groupi_n_812));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8366__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_643), .B
+       (csa_tree_add1_add_30_16_groupi_n_527), .Y
+       (csa_tree_add1_add_30_16_groupi_n_811));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8367__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_642), .B
+       (csa_tree_add1_add_30_16_groupi_n_456), .Y
+       (csa_tree_add1_add_30_16_groupi_n_810));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8368__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_627), .B
+       (csa_tree_add1_add_30_16_groupi_n_422), .Y
+       (csa_tree_add1_add_30_16_groupi_n_809));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8369__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_641), .B
+       (csa_tree_add1_add_30_16_groupi_n_415), .Y
+       (csa_tree_add1_add_30_16_groupi_n_808));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8370__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_711), .B
+       (csa_tree_add1_add_30_16_groupi_n_621), .Y
+       (csa_tree_add1_add_30_16_groupi_n_807));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8371__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_629), .B
+       (csa_tree_add1_add_30_16_groupi_n_101), .Y
+       (csa_tree_add1_add_30_16_groupi_n_806));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8372__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_640), .B
+       (csa_tree_add1_add_30_16_groupi_n_543), .Y
+       (csa_tree_add1_add_30_16_groupi_n_805));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8373__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_712), .B
+       (csa_tree_add1_add_30_16_groupi_n_648), .Y
+       (csa_tree_add1_add_30_16_groupi_n_803));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8374__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_512), .B
+       (csa_tree_add1_add_30_16_groupi_n_646), .Y
+       (csa_tree_add1_add_30_16_groupi_n_802));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8375__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_655), .B
+       (csa_tree_add1_add_30_16_groupi_n_453), .Y
+       (csa_tree_add1_add_30_16_groupi_n_801));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8376__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_617), .B
+       (csa_tree_add1_add_30_16_groupi_n_506), .Y
+       (csa_tree_add1_add_30_16_groupi_n_800));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8377__2398(.A
+       (csa_tree_add1_add_30_16_groupi_n_632), .B
+       (csa_tree_add1_add_30_16_groupi_n_409), .Y
+       (csa_tree_add1_add_30_16_groupi_n_798));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8378__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_638), .B
+       (csa_tree_add1_add_30_16_groupi_n_408), .Y
+       (csa_tree_add1_add_30_16_groupi_n_797));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8379__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_630), .B
+       (csa_tree_add1_add_30_16_groupi_n_432), .Y
+       (csa_tree_add1_add_30_16_groupi_n_796));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8380__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_636), .B
+       (csa_tree_add1_add_30_16_groupi_n_454), .Y
+       (csa_tree_add1_add_30_16_groupi_n_795));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8381__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_633), .B
+       (csa_tree_add1_add_30_16_groupi_n_545), .Y
+       (csa_tree_add1_add_30_16_groupi_n_794));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8382__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_635), .B
+       (csa_tree_add1_add_30_16_groupi_n_89), .Y
+       (csa_tree_add1_add_30_16_groupi_n_793));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8383__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_634), .B
+       (csa_tree_add1_add_30_16_groupi_n_407), .Y
+       (csa_tree_add1_add_30_16_groupi_n_792));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8384__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_631), .B
+       (csa_tree_add1_add_30_16_groupi_n_490), .Y
+       (csa_tree_add1_add_30_16_groupi_n_791));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8385__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_650), .B
+       (csa_tree_add1_add_30_16_groupi_n_442), .Y
+       (csa_tree_add1_add_30_16_groupi_n_790));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8386__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_628), .B
+       (csa_tree_add1_add_30_16_groupi_n_461), .Y
+       (csa_tree_add1_add_30_16_groupi_n_789));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8387__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_652), .B
+       (csa_tree_add1_add_30_16_groupi_n_435), .Y
+       (csa_tree_add1_add_30_16_groupi_n_788));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8388__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_671), .B
+       (csa_tree_add1_add_30_16_groupi_n_515), .Y
+       (csa_tree_add1_add_30_16_groupi_n_787));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8389__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_653), .B
+       (csa_tree_add1_add_30_16_groupi_n_547), .Y
+       (csa_tree_add1_add_30_16_groupi_n_786));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8390__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_623), .B
+       (csa_tree_add1_add_30_16_groupi_n_389), .Y
+       (csa_tree_add1_add_30_16_groupi_n_785));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8391__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_624), .B
+       (csa_tree_add1_add_30_16_groupi_n_427), .Y
+       (csa_tree_add1_add_30_16_groupi_n_784));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g8392__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_36), .A1
+       (csa_tree_add1_add_30_16_groupi_n_53), .S0
+       (csa_tree_add1_add_30_16_groupi_n_674), .Y
+       (csa_tree_add1_add_30_16_groupi_n_783));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g8393__5115(.A0
+       (csa_tree_add1_add_30_16_groupi_n_476), .A1
+       (csa_tree_add1_add_30_16_groupi_n_475), .S0
+       (csa_tree_add1_add_30_16_groupi_n_645), .Y
+       (csa_tree_add1_add_30_16_groupi_n_781));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g8394__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_78), .A1
+       (csa_tree_add1_add_30_16_groupi_n_77), .S0
+       (csa_tree_add1_add_30_16_groupi_n_626), .Y
+       (csa_tree_add1_add_30_16_groupi_n_780));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8395__4733(.A (sum_q[18]), .B
+       (csa_tree_add1_add_30_16_groupi_n_625), .Y
+       (csa_tree_add1_add_30_16_groupi_n_779));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8396(.A
+       (csa_tree_add1_add_30_16_groupi_n_766), .Y
+       (csa_tree_add1_add_30_16_groupi_n_767));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8397__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_712), .B
+       (csa_tree_add1_add_30_16_groupi_n_603), .Y
+       (csa_tree_add1_add_30_16_groupi_n_754));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8398__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_661), .B
+       (csa_tree_add1_add_30_16_groupi_n_707), .Y
+       (csa_tree_add1_add_30_16_groupi_n_753));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8399__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_659), .B
+       (csa_tree_add1_add_30_16_groupi_n_501), .Y
+       (csa_tree_add1_add_30_16_groupi_n_752));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8400__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_492), .B
+       (csa_tree_add1_add_30_16_groupi_n_698), .Y
+       (csa_tree_add1_add_30_16_groupi_n_751));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8401__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_529), .B
+       (csa_tree_add1_add_30_16_groupi_n_694), .Y
+       (csa_tree_add1_add_30_16_groupi_n_750));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8402__1666(.A0
+       (csa_tree_add1_add_30_16_groupi_n_488), .A1
+       (csa_tree_add1_add_30_16_groupi_n_582), .B0
+       (csa_tree_add1_add_30_16_groupi_n_524), .Y
+       (csa_tree_add1_add_30_16_groupi_n_749));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8403__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_531), .B
+       (csa_tree_add1_add_30_16_groupi_n_697), .Y
+       (csa_tree_add1_add_30_16_groupi_n_748));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8404__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_708), .B (sum_q[17]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_747));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8405__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_386), .A1
+       (csa_tree_add1_add_30_16_groupi_n_513), .B0
+       (csa_tree_add1_add_30_16_groupi_n_681), .Y
+       (csa_tree_add1_add_30_16_groupi_n_773));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8406__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_495), .A1
+       (csa_tree_add1_add_30_16_groupi_n_499), .B0
+       (csa_tree_add1_add_30_16_groupi_n_717), .Y
+       (csa_tree_add1_add_30_16_groupi_n_772));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8407__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_552), .A1
+       (csa_tree_add1_add_30_16_groupi_n_605), .B0 (sum_q[20]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_437), .Y
+       (csa_tree_add1_add_30_16_groupi_n_771));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8408__6260(.A0
+       (csa_tree_add1_add_30_16_groupi_n_449), .A1
+       (csa_tree_add1_add_30_16_groupi_n_604), .B0 (sum_q[18]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_412), .Y
+       (csa_tree_add1_add_30_16_groupi_n_770));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8409__4319(.A0
+       (csa_tree_add1_add_30_16_groupi_n_521), .A1
+       (csa_tree_add1_add_30_16_groupi_n_613), .B0 (sum_q[27]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_506), .Y
+       (csa_tree_add1_add_30_16_groupi_n_769));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8410__8428(.A0
+       (csa_tree_add1_add_30_16_groupi_n_538), .A1
+       (csa_tree_add1_add_30_16_groupi_n_610), .B0 (sum_q[19]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_423), .Y
+       (csa_tree_add1_add_30_16_groupi_n_768));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8411__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_424), .A1
+       (csa_tree_add1_add_30_16_groupi_n_500), .B0
+       (csa_tree_add1_add_30_16_groupi_n_683), .Y
+       (csa_tree_add1_add_30_16_groupi_n_766));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8412__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_527), .A1
+       (csa_tree_add1_add_30_16_groupi_n_591), .B0
+       (csa_tree_add1_add_30_16_groupi_n_430), .B1
+       (csa_tree_add1_add_30_16_groupi_n_92), .Y
+       (csa_tree_add1_add_30_16_groupi_n_765));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8413__3680(.A0
+       (csa_tree_add1_add_30_16_groupi_n_462), .A1
+       (csa_tree_add1_add_30_16_groupi_n_597), .B0
+       (csa_tree_add1_add_30_16_groupi_n_596), .Y
+       (csa_tree_add1_add_30_16_groupi_n_764));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8414__1617(.A0
+       (csa_tree_add1_add_30_16_groupi_n_431), .A1
+       (csa_tree_add1_add_30_16_groupi_n_512), .B0
+       (csa_tree_add1_add_30_16_groupi_n_680), .Y
+       (csa_tree_add1_add_30_16_groupi_n_763));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8415__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_522), .A1
+       (csa_tree_add1_add_30_16_groupi_n_590), .B0
+       (csa_tree_add1_add_30_16_groupi_n_489), .B1
+       (csa_tree_add1_add_30_16_groupi_n_97), .Y
+       (csa_tree_add1_add_30_16_groupi_n_762));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8416__1705(.A0
+       (csa_tree_add1_add_30_16_groupi_n_540), .A1
+       (csa_tree_add1_add_30_16_groupi_n_612), .B0 (sum_q[25]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_494), .Y
+       (csa_tree_add1_add_30_16_groupi_n_761));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8417__5122(.A0
+       (csa_tree_add1_add_30_16_groupi_n_508), .A1
+       (csa_tree_add1_add_30_16_groupi_n_389), .B0
+       (csa_tree_add1_add_30_16_groupi_n_682), .Y
+       (csa_tree_add1_add_30_16_groupi_n_760));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8418__8246(.A0
+       (csa_tree_add1_add_30_16_groupi_n_553), .A1
+       (csa_tree_add1_add_30_16_groupi_n_614), .B0 (sum_q[21]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_496), .Y
+       (csa_tree_add1_add_30_16_groupi_n_759));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8419__7098(.A0
+       (csa_tree_add1_add_30_16_groupi_n_455), .A1
+       (csa_tree_add1_add_30_16_groupi_n_594), .B0
+       (csa_tree_add1_add_30_16_groupi_n_432), .B1
+       (csa_tree_add1_add_30_16_groupi_n_511), .Y
+       (csa_tree_add1_add_30_16_groupi_n_758));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8420__6131(.A0
+       (csa_tree_add1_add_30_16_groupi_n_460), .A1
+       (csa_tree_add1_add_30_16_groupi_n_592), .B0
+       (csa_tree_add1_add_30_16_groupi_n_476), .B1
+       (csa_tree_add1_add_30_16_groupi_n_115), .Y
+       (csa_tree_add1_add_30_16_groupi_n_757));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8421__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_554), .A1
+       (csa_tree_add1_add_30_16_groupi_n_376), .B0
+       (csa_tree_add1_add_30_16_groupi_n_611), .Y
+       (csa_tree_add1_add_30_16_groupi_n_756));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8422__5115(.A0
+       (csa_tree_add1_add_30_16_groupi_n_539), .A1
+       (csa_tree_add1_add_30_16_groupi_n_607), .B0 (sum_q[23]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_409), .Y
+       (csa_tree_add1_add_30_16_groupi_n_755));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8424__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_464), .B
+       (csa_tree_add1_add_30_16_groupi_n_696), .Y
+       (csa_tree_add1_add_30_16_groupi_n_721));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8425__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_584), .B
+       (csa_tree_add1_add_30_16_groupi_n_507), .Y
+       (csa_tree_add1_add_30_16_groupi_n_720));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8426__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_585), .B
+       (csa_tree_add1_add_30_16_groupi_n_433), .Y
+       (csa_tree_add1_add_30_16_groupi_n_719));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8427__9315(.A0
+       (csa_tree_add1_add_30_16_groupi_n_548), .A1
+       (csa_tree_add1_add_30_16_groupi_n_589), .B0
+       (csa_tree_add1_add_30_16_groupi_n_390), .B1
+       (csa_tree_add1_add_30_16_groupi_n_88), .Y
+       (csa_tree_add1_add_30_16_groupi_n_746));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8428__9945(.A0
+       (csa_tree_add1_add_30_16_groupi_n_42), .A1
+       (csa_tree_add1_add_30_16_groupi_n_588), .B0
+       (csa_tree_add1_add_30_16_groupi_n_435), .B1
+       (csa_tree_add1_add_30_16_groupi_n_99), .Y
+       (csa_tree_add1_add_30_16_groupi_n_745));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8429__2883(.A0
+       (csa_tree_add1_add_30_16_groupi_n_96), .A1
+       (csa_tree_add1_add_30_16_groupi_n_426), .B0
+       (csa_tree_add1_add_30_16_groupi_n_691), .Y
+       (csa_tree_add1_add_30_16_groupi_n_744));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8430__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_454), .A1
+       (csa_tree_add1_add_30_16_groupi_n_566), .B0
+       (csa_tree_add1_add_30_16_groupi_n_425), .B1
+       (csa_tree_add1_add_30_16_groupi_n_429), .Y
+       (csa_tree_add1_add_30_16_groupi_n_743));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8431__1666(.A0
+       (csa_tree_add1_add_30_16_groupi_n_463), .A1
+       (csa_tree_add1_add_30_16_groupi_n_564), .B0
+       (csa_tree_add1_add_30_16_groupi_n_388), .B1
+       (csa_tree_add1_add_30_16_groupi_n_490), .Y
+       (csa_tree_add1_add_30_16_groupi_n_742));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8432__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_550), .A1
+       (csa_tree_add1_add_30_16_groupi_n_587), .B0
+       (csa_tree_add1_add_30_16_groupi_n_486), .B1
+       (csa_tree_add1_add_30_16_groupi_n_94), .Y
+       (csa_tree_add1_add_30_16_groupi_n_741));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8433__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_397), .A1
+       (csa_tree_add1_add_30_16_groupi_n_502), .B0
+       (csa_tree_add1_add_30_16_groupi_n_692), .Y
+       (csa_tree_add1_add_30_16_groupi_n_740));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8434__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_404), .A1
+       (csa_tree_add1_add_30_16_groupi_n_417), .B0
+       (csa_tree_add1_add_30_16_groupi_n_688), .Y
+       (csa_tree_add1_add_30_16_groupi_n_739));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8435__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_447), .A1
+       (csa_tree_add1_add_30_16_groupi_n_561), .B0
+       (csa_tree_add1_add_30_16_groupi_n_515), .B1
+       (csa_tree_add1_add_30_16_groupi_n_400), .Y
+       (csa_tree_add1_add_30_16_groupi_n_738));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8436__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_544), .A1
+       (csa_tree_add1_add_30_16_groupi_n_577), .B0
+       (csa_tree_add1_add_30_16_groupi_n_418), .B1
+       (csa_tree_add1_add_30_16_groupi_n_117), .Y
+       (csa_tree_add1_add_30_16_groupi_n_737));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8438__4319(.A0
+       (csa_tree_add1_add_30_16_groupi_n_503), .A1
+       (csa_tree_add1_add_30_16_groupi_n_498), .B0
+       (csa_tree_add1_add_30_16_groupi_n_689), .Y
+       (csa_tree_add1_add_30_16_groupi_n_734));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8439__8428(.A0
+       (csa_tree_add1_add_30_16_groupi_n_545), .A1
+       (csa_tree_add1_add_30_16_groupi_n_559), .B0
+       (csa_tree_add1_add_30_16_groupi_n_402), .B1
+       (csa_tree_add1_add_30_16_groupi_n_401), .Y
+       (csa_tree_add1_add_30_16_groupi_n_733));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8440__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_405), .A1
+       (csa_tree_add1_add_30_16_groupi_n_493), .B0
+       (csa_tree_add1_add_30_16_groupi_n_693), .Y
+       (csa_tree_add1_add_30_16_groupi_n_732));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8441__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_114), .A1
+       (csa_tree_add1_add_30_16_groupi_n_403), .B0
+       (csa_tree_add1_add_30_16_groupi_n_690), .Y
+       (csa_tree_add1_add_30_16_groupi_n_731));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8442__3680(.A0
+       (csa_tree_add1_add_30_16_groupi_n_392), .A1
+       (csa_tree_add1_add_30_16_groupi_n_413), .B0
+       (csa_tree_add1_add_30_16_groupi_n_718), .Y
+       (csa_tree_add1_add_30_16_groupi_n_730));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8443__1617(.A0
+       (csa_tree_add1_add_30_16_groupi_n_528), .A1
+       (csa_tree_add1_add_30_16_groupi_n_569), .B0
+       (csa_tree_add1_add_30_16_groupi_n_407), .B1
+       (csa_tree_add1_add_30_16_groupi_n_411), .Y
+       (csa_tree_add1_add_30_16_groupi_n_729));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8444__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_536), .A1
+       (csa_tree_add1_add_30_16_groupi_n_572), .B0
+       (csa_tree_add1_add_30_16_groupi_n_441), .B1
+       (csa_tree_add1_add_30_16_groupi_n_428), .Y
+       (csa_tree_add1_add_30_16_groupi_n_728));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8445__1705(.A0
+       (csa_tree_add1_add_30_16_groupi_n_421), .A1
+       (csa_tree_add1_add_30_16_groupi_n_420), .B0
+       (csa_tree_add1_add_30_16_groupi_n_687), .Y
+       (csa_tree_add1_add_30_16_groupi_n_727));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8446__5122(.A0
+       (csa_tree_add1_add_30_16_groupi_n_448), .A1
+       (csa_tree_add1_add_30_16_groupi_n_574), .B0
+       (csa_tree_add1_add_30_16_groupi_n_406), .B1
+       (csa_tree_add1_add_30_16_groupi_n_408), .Y
+       (csa_tree_add1_add_30_16_groupi_n_726));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8447__8246(.A0
+       (csa_tree_add1_add_30_16_groupi_n_547), .A1
+       (csa_tree_add1_add_30_16_groupi_n_567), .B0
+       (csa_tree_add1_add_30_16_groupi_n_436), .B1
+       (csa_tree_add1_add_30_16_groupi_n_439), .Y
+       (csa_tree_add1_add_30_16_groupi_n_725));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8448__7098(.A0
+       (csa_tree_add1_add_30_16_groupi_n_438), .A1
+       (csa_tree_add1_add_30_16_groupi_n_440), .B0
+       (csa_tree_add1_add_30_16_groupi_n_686), .Y
+       (csa_tree_add1_add_30_16_groupi_n_724));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8449__6131(.A0
+       (csa_tree_add1_add_30_16_groupi_n_451), .A1
+       (csa_tree_add1_add_30_16_groupi_n_563), .B0
+       (csa_tree_add1_add_30_16_groupi_n_414), .B1
+       (csa_tree_add1_add_30_16_groupi_n_416), .Y
+       (csa_tree_add1_add_30_16_groupi_n_723));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8450__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_491), .A1
+       (csa_tree_add1_add_30_16_groupi_n_399), .B0
+       (csa_tree_add1_add_30_16_groupi_n_684), .Y
+       (csa_tree_add1_add_30_16_groupi_n_722));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g8451(.A
+       (csa_tree_add1_add_30_16_groupi_n_685), .Y
+       (csa_tree_add1_add_30_16_groupi_n_718));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8452(.A
+       (csa_tree_add1_add_30_16_groupi_n_679), .Y
+       (csa_tree_add1_add_30_16_groupi_n_717));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8455(.A
+       (csa_tree_add1_add_30_16_groupi_n_713), .Y
+       (csa_tree_add1_add_30_16_groupi_n_714));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8456(.A
+       (csa_tree_add1_add_30_16_groupi_n_702), .Y
+       (csa_tree_add1_add_30_16_groupi_n_703));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8457__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_391), .B
+       (csa_tree_add1_add_30_16_groupi_n_578), .Y
+       (csa_tree_add1_add_30_16_groupi_n_697));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8458__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_419), .B
+       (csa_tree_add1_add_30_16_groupi_n_580), .Y
+       (csa_tree_add1_add_30_16_groupi_n_696));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8459__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_585), .B
+       (csa_tree_add1_add_30_16_groupi_n_433), .Y
+       (csa_tree_add1_add_30_16_groupi_n_695));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8460__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_410), .B
+       (csa_tree_add1_add_30_16_groupi_n_579), .Y
+       (csa_tree_add1_add_30_16_groupi_n_694));
+  sky130_osu_sc_18T_ms__nand2_1
+       csa_tree_add1_add_30_16_groupi_g8461__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_551), .B
+       (csa_tree_add1_add_30_16_groupi_n_602), .Y
+       (csa_tree_add1_add_30_16_groupi_n_693));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8462__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_576), .B
+       (csa_tree_add1_add_30_16_groupi_n_543), .Y
+       (csa_tree_add1_add_30_16_groupi_n_692));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8463__2883(.A0
+       (csa_tree_add1_add_30_16_groupi_n_95), .A1
+       (csa_tree_add1_add_30_16_groupi_n_427), .B0
+       (csa_tree_add1_add_30_16_groupi_n_546), .Y
+       (csa_tree_add1_add_30_16_groupi_n_691));
+  sky130_osu_sc_18T_ms__nand2_1
+       csa_tree_add1_add_30_16_groupi_g8464__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_549), .B
+       (csa_tree_add1_add_30_16_groupi_n_586), .Y
+       (csa_tree_add1_add_30_16_groupi_n_690));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8465__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_573), .B
+       (csa_tree_add1_add_30_16_groupi_n_465), .Y
+       (csa_tree_add1_add_30_16_groupi_n_689));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8466__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_562), .B
+       (csa_tree_add1_add_30_16_groupi_n_461), .Y
+       (csa_tree_add1_add_30_16_groupi_n_688));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8467__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_453), .B
+       (csa_tree_add1_add_30_16_groupi_n_565), .Y
+       (csa_tree_add1_add_30_16_groupi_n_687));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8468__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_456), .B
+       (csa_tree_add1_add_30_16_groupi_n_568), .Y
+       (csa_tree_add1_add_30_16_groupi_n_686));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8469__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_392), .A1
+       (csa_tree_add1_add_30_16_groupi_n_413), .B0
+       (csa_tree_add1_add_30_16_groupi_n_459), .Y
+       (csa_tree_add1_add_30_16_groupi_n_685));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8470__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_442), .B
+       (csa_tree_add1_add_30_16_groupi_n_570), .Y
+       (csa_tree_add1_add_30_16_groupi_n_684));
+  sky130_osu_sc_18T_ms__nand2_1
+       csa_tree_add1_add_30_16_groupi_g8471__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_452), .B
+       (csa_tree_add1_add_30_16_groupi_n_575), .Y
+       (csa_tree_add1_add_30_16_groupi_n_683));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8472__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_593), .B
+       (csa_tree_add1_add_30_16_groupi_n_444), .Y
+       (csa_tree_add1_add_30_16_groupi_n_682));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8473__8428(.A0
+       (csa_tree_add1_add_30_16_groupi_n_387), .A1
+       (csa_tree_add1_add_30_16_groupi_n_514), .B0
+       (csa_tree_add1_add_30_16_groupi_n_457), .Y
+       (csa_tree_add1_add_30_16_groupi_n_681));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8474__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_606), .B
+       (csa_tree_add1_add_30_16_groupi_n_525), .Y
+       (csa_tree_add1_add_30_16_groupi_n_680));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8475__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_495), .A1
+       (csa_tree_add1_add_30_16_groupi_n_499), .B0
+       (csa_tree_add1_add_30_16_groupi_n_530), .Y
+       (csa_tree_add1_add_30_16_groupi_n_679));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8476__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_391), .B
+       (csa_tree_add1_add_30_16_groupi_n_531), .Y
+       (csa_tree_add1_add_30_16_groupi_n_678));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8477__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_403), .B
+       (csa_tree_add1_add_30_16_groupi_n_549), .Y
+       (csa_tree_add1_add_30_16_groupi_n_677));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8478__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_120), .A1 (sum_q[30]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_555), .Y
+       (csa_tree_add1_add_30_16_groupi_n_676));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8480__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_437), .B
+       (csa_tree_add1_add_30_16_groupi_n_552), .Y
+       (csa_tree_add1_add_30_16_groupi_n_674));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8481__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_529), .B
+       (csa_tree_add1_add_30_16_groupi_n_410), .Y
+       (csa_tree_add1_add_30_16_groupi_n_673));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8482__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_500), .B
+       (csa_tree_add1_add_30_16_groupi_n_424), .Y
+       (csa_tree_add1_add_30_16_groupi_n_672));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8483__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_447), .B
+       (csa_tree_add1_add_30_16_groupi_n_400), .Y
+       (csa_tree_add1_add_30_16_groupi_n_671));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8484__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_418), .B
+       (csa_tree_add1_add_30_16_groupi_n_544), .Y
+       (csa_tree_add1_add_30_16_groupi_n_670));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8485__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_441), .B
+       (csa_tree_add1_add_30_16_groupi_n_428), .Y
+       (csa_tree_add1_add_30_16_groupi_n_669));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8487__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_498), .B
+       (csa_tree_add1_add_30_16_groupi_n_503), .Y
+       (csa_tree_add1_add_30_16_groupi_n_668));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8489__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_522), .B
+       (csa_tree_add1_add_30_16_groupi_n_97), .Y
+       (csa_tree_add1_add_30_16_groupi_n_667));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8490__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_535), .B
+       (csa_tree_add1_add_30_16_groupi_n_467), .Y
+       (csa_tree_add1_add_30_16_groupi_n_713));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8491__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_334), .B
+       (csa_tree_add1_add_30_16_groupi_n_445), .Y
+       (csa_tree_add1_add_30_16_groupi_n_712));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8492__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_91), .A1
+       (csa_tree_add1_add_30_16_groupi_n_57), .B0
+       (csa_tree_add1_add_30_16_groupi_n_571), .Y
+       (csa_tree_add1_add_30_16_groupi_n_711));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8493__1666(.A0
+       (csa_tree_add1_add_30_16_groupi_n_532), .A1
+       (csa_tree_add1_add_30_16_groupi_n_379), .B0 (sum_q[12]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_356), .Y
+       (csa_tree_add1_add_30_16_groupi_n_710));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8494__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_363), .A1
+       (csa_tree_add1_add_30_16_groupi_n_83), .B0
+       (csa_tree_add1_add_30_16_groupi_n_556), .Y
+       (csa_tree_add1_add_30_16_groupi_n_709));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8495__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_445), .A1
+       (csa_tree_add1_add_30_16_groupi_n_250), .B0 (sum_q[16]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_87), .Y
+       (csa_tree_add1_add_30_16_groupi_n_708));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8496__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_541), .A1
+       (csa_tree_add1_add_30_16_groupi_n_232), .B0 (sum_q[29]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_100), .Y
+       (csa_tree_add1_add_30_16_groupi_n_707));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8497__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_458), .A1
+       (csa_tree_add1_add_30_16_groupi_n_249), .B0
+       (csa_tree_add1_add_30_16_groupi_n_38), .B1
+       (csa_tree_add1_add_30_16_groupi_n_85), .Y
+       (csa_tree_add1_add_30_16_groupi_n_706));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8498__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_466), .B
+       (csa_tree_add1_add_30_16_groupi_n_526), .Y
+       (csa_tree_add1_add_30_16_groupi_n_705));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8499__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_473), .B
+       (csa_tree_add1_add_30_16_groupi_n_534), .Y
+       (csa_tree_add1_add_30_16_groupi_n_704));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8500__4319(.A0
+       (csa_tree_add1_add_30_16_groupi_n_358), .A1 (sum_q[2]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_557), .Y
+       (csa_tree_add1_add_30_16_groupi_n_702));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8501__8428(.A0
+       (csa_tree_add1_add_30_16_groupi_n_533), .A1
+       (csa_tree_add1_add_30_16_groupi_n_377), .B0 (sum_q[14]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_355), .Y
+       (csa_tree_add1_add_30_16_groupi_n_701));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8502__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_450), .A1
+       (csa_tree_add1_add_30_16_groupi_n_381), .B0 (sum_q[10]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_354), .Y
+       (csa_tree_add1_add_30_16_groupi_n_700));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8503__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_361), .A1
+       (csa_tree_add1_add_30_16_groupi_n_58), .B0
+       (csa_tree_add1_add_30_16_groupi_n_558), .Y
+       (csa_tree_add1_add_30_16_groupi_n_699));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8504__3680(.A0
+       (csa_tree_add1_add_30_16_groupi_n_378), .A1
+       (csa_tree_add1_add_30_16_groupi_n_535), .B0
+       (csa_tree_add1_add_30_16_groupi_n_56), .B1
+       (csa_tree_add1_add_30_16_groupi_n_359), .Y
+       (csa_tree_add1_add_30_16_groupi_n_698));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8505(.A
+       (csa_tree_add1_add_30_16_groupi_n_665), .Y
+       (csa_tree_add1_add_30_16_groupi_n_666));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8506(.A
+       (csa_tree_add1_add_30_16_groupi_n_664), .Y
+       (csa_tree_add1_add_30_16_groupi_n_663));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8507__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_462), .B
+       (csa_tree_add1_add_30_16_groupi_n_516), .Y
+       (csa_tree_add1_add_30_16_groupi_n_658));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8508__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_464), .B
+       (csa_tree_add1_add_30_16_groupi_n_419), .Y
+       (csa_tree_add1_add_30_16_groupi_n_657));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8509__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_550), .B
+       (csa_tree_add1_add_30_16_groupi_n_94), .Y
+       (csa_tree_add1_add_30_16_groupi_n_656));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8510__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_420), .B
+       (csa_tree_add1_add_30_16_groupi_n_421), .Y
+       (csa_tree_add1_add_30_16_groupi_n_655));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8511__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_376), .B
+       (csa_tree_add1_add_30_16_groupi_n_484), .Y
+       (csa_tree_add1_add_30_16_groupi_n_654));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8512__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_436), .B
+       (csa_tree_add1_add_30_16_groupi_n_439), .Y
+       (csa_tree_add1_add_30_16_groupi_n_653));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8513__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_42), .B
+       (csa_tree_add1_add_30_16_groupi_n_99), .Y
+       (csa_tree_add1_add_30_16_groupi_n_652));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8514__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_497), .B
+       (csa_tree_add1_add_30_16_groupi_n_509), .Y
+       (csa_tree_add1_add_30_16_groupi_n_651));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8515__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_399), .B
+       (csa_tree_add1_add_30_16_groupi_n_491), .Y
+       (csa_tree_add1_add_30_16_groupi_n_650));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8516__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_413), .B
+       (csa_tree_add1_add_30_16_groupi_n_392), .Y
+       (csa_tree_add1_add_30_16_groupi_n_649));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8517__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_483), .B
+       (csa_tree_add1_add_30_16_groupi_n_395), .Y
+       (csa_tree_add1_add_30_16_groupi_n_648));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8518__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_457), .B
+       (csa_tree_add1_add_30_16_groupi_n_514), .Y
+       (csa_tree_add1_add_30_16_groupi_n_647));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8519__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_431), .B
+       (csa_tree_add1_add_30_16_groupi_n_525), .Y
+       (csa_tree_add1_add_30_16_groupi_n_646));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8520__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_460), .B
+       (csa_tree_add1_add_30_16_groupi_n_115), .Y
+       (csa_tree_add1_add_30_16_groupi_n_645));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8521__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_499), .B
+       (csa_tree_add1_add_30_16_groupi_n_530), .Y
+       (csa_tree_add1_add_30_16_groupi_n_644));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8522__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_430), .B
+       (csa_tree_add1_add_30_16_groupi_n_92), .Y
+       (csa_tree_add1_add_30_16_groupi_n_643));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8523__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_440), .B
+       (csa_tree_add1_add_30_16_groupi_n_438), .Y
+       (csa_tree_add1_add_30_16_groupi_n_642));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8524__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_414), .B
+       (csa_tree_add1_add_30_16_groupi_n_451), .Y
+       (csa_tree_add1_add_30_16_groupi_n_641));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8525__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_502), .B
+       (csa_tree_add1_add_30_16_groupi_n_397), .Y
+       (csa_tree_add1_add_30_16_groupi_n_640));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8526__5477(.A (sum_q[31]), .B
+       (csa_tree_add1_add_30_16_groupi_n_472), .Y
+       (csa_tree_add1_add_30_16_groupi_n_639));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8527__2398(.A
+       (csa_tree_add1_add_30_16_groupi_n_448), .B
+       (csa_tree_add1_add_30_16_groupi_n_406), .Y
+       (csa_tree_add1_add_30_16_groupi_n_638));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8528__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_405), .B
+       (csa_tree_add1_add_30_16_groupi_n_551), .Y
+       (csa_tree_add1_add_30_16_groupi_n_637));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8529__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_425), .B
+       (csa_tree_add1_add_30_16_groupi_n_429), .Y
+       (csa_tree_add1_add_30_16_groupi_n_636));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8530__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_390), .B
+       (csa_tree_add1_add_30_16_groupi_n_548), .Y
+       (csa_tree_add1_add_30_16_groupi_n_635));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8531__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_528), .B
+       (csa_tree_add1_add_30_16_groupi_n_411), .Y
+       (csa_tree_add1_add_30_16_groupi_n_634));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8532__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_402), .B
+       (csa_tree_add1_add_30_16_groupi_n_401), .Y
+       (csa_tree_add1_add_30_16_groupi_n_633));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8533__6783(.A (sum_q[23]), .B
+       (csa_tree_add1_add_30_16_groupi_n_539), .Y
+       (csa_tree_add1_add_30_16_groupi_n_632));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8534__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_463), .B
+       (csa_tree_add1_add_30_16_groupi_n_388), .Y
+       (csa_tree_add1_add_30_16_groupi_n_631));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8535__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_455), .B
+       (csa_tree_add1_add_30_16_groupi_n_511), .Y
+       (csa_tree_add1_add_30_16_groupi_n_630));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8536__2802(.A (sum_q[29]), .B
+       (csa_tree_add1_add_30_16_groupi_n_541), .Y
+       (csa_tree_add1_add_30_16_groupi_n_629));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8537__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_417), .B
+       (csa_tree_add1_add_30_16_groupi_n_404), .Y
+       (csa_tree_add1_add_30_16_groupi_n_628));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8538__5122(.A (sum_q[19]), .B
+       (csa_tree_add1_add_30_16_groupi_n_538), .Y
+       (csa_tree_add1_add_30_16_groupi_n_627));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8539__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_458), .B
+       (csa_tree_add1_add_30_16_groupi_n_85), .Y
+       (csa_tree_add1_add_30_16_groupi_n_626));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8540__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_412), .B
+       (csa_tree_add1_add_30_16_groupi_n_449), .Y
+       (csa_tree_add1_add_30_16_groupi_n_625));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g8541__6131(.A0
+       (csa_tree_add1_add_30_16_groupi_n_95), .A1
+       (csa_tree_add1_add_30_16_groupi_n_96), .S0
+       (csa_tree_add1_add_30_16_groupi_n_546), .Y
+       (csa_tree_add1_add_30_16_groupi_n_624));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8542__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_444), .B
+       (csa_tree_add1_add_30_16_groupi_n_508), .Y
+       (csa_tree_add1_add_30_16_groupi_n_623));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8543__5115(.A0
+       (csa_tree_add1_add_30_16_groupi_n_505), .A1 (sum_q[20]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_36), .B1
+       (csa_tree_add1_add_30_16_groupi_n_504), .Y
+       (csa_tree_add1_add_30_16_groupi_n_622));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g8544__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_480), .A1
+       (csa_tree_add1_add_30_16_groupi_n_479), .S0
+       (csa_tree_add1_add_30_16_groupi_n_510), .Y
+       (csa_tree_add1_add_30_16_groupi_n_621));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g8545__4733(.A0
+       (csa_tree_add1_add_30_16_groupi_n_475), .A1
+       (csa_tree_add1_add_30_16_groupi_n_477), .S0 (sum_q[26]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_620));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8546__6161(.A (sum_q[21]), .B
+       (csa_tree_add1_add_30_16_groupi_n_553), .Y
+       (csa_tree_add1_add_30_16_groupi_n_619));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8547__9315(.A (sum_q[25]), .B
+       (csa_tree_add1_add_30_16_groupi_n_540), .Y
+       (csa_tree_add1_add_30_16_groupi_n_618));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8548__9945(.A (sum_q[27]), .B
+       (csa_tree_add1_add_30_16_groupi_n_521), .Y
+       (csa_tree_add1_add_30_16_groupi_n_617));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8549__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_468), .B
+       (csa_tree_add1_add_30_16_groupi_n_446), .Y
+       (csa_tree_add1_add_30_16_groupi_n_665));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8550__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_335), .B
+       (csa_tree_add1_add_30_16_groupi_n_537), .Y
+       (csa_tree_add1_add_30_16_groupi_n_664));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8551__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_471), .B
+       (csa_tree_add1_add_30_16_groupi_n_450), .Y
+       (csa_tree_add1_add_30_16_groupi_n_662));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8552__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_333), .B
+       (csa_tree_add1_add_30_16_groupi_n_482), .Y
+       (csa_tree_add1_add_30_16_groupi_n_661));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8553__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_470), .B
+       (csa_tree_add1_add_30_16_groupi_n_532), .Y
+       (csa_tree_add1_add_30_16_groupi_n_660));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8554__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_469), .B
+       (csa_tree_add1_add_30_16_groupi_n_533), .Y
+       (csa_tree_add1_add_30_16_groupi_n_659));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8555__2398(.A
+       (csa_tree_add1_add_30_16_groupi_n_505), .B
+       (csa_tree_add1_add_30_16_groupi_n_36), .Y
+       (csa_tree_add1_add_30_16_groupi_n_616));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8556__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_510), .B
+       (csa_tree_add1_add_30_16_groupi_n_480), .Y
+       (csa_tree_add1_add_30_16_groupi_n_615));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8557__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_496), .B (sum_q[21]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_614));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8558__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_506), .B (sum_q[27]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_613));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8559__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_494), .B (sum_q[25]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_612));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8560__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_1), .B
+       (csa_tree_add1_add_30_16_groupi_n_485), .Y
+       (csa_tree_add1_add_30_16_groupi_n_611));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8561__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_423), .B (sum_q[19]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_610));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8562__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_497), .B
+       (csa_tree_add1_add_30_16_groupi_n_509), .Y
+       (csa_tree_add1_add_30_16_groupi_n_609));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8563__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_475), .B (sum_q[26]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_608));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8564__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_409), .B (sum_q[23]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_607));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8565__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_512), .B
+       (csa_tree_add1_add_30_16_groupi_n_431), .Y
+       (csa_tree_add1_add_30_16_groupi_n_606));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8566__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_437), .B (sum_q[20]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_605));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8567__8246(.A (sum_q[18]), .B
+       (csa_tree_add1_add_30_16_groupi_n_412), .Y
+       (csa_tree_add1_add_30_16_groupi_n_604));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8568__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_483), .B
+       (csa_tree_add1_add_30_16_groupi_n_395), .Y
+       (csa_tree_add1_add_30_16_groupi_n_603));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8569__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_493), .B
+       (csa_tree_add1_add_30_16_groupi_n_405), .Y
+       (csa_tree_add1_add_30_16_groupi_n_602));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8574__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_398), .B
+       (csa_tree_add1_add_30_16_groupi_n_516), .Y
+       (csa_tree_add1_add_30_16_groupi_n_597));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8575__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_516), .B
+       (csa_tree_add1_add_30_16_groupi_n_398), .Y
+       (csa_tree_add1_add_30_16_groupi_n_596));
+  sky130_osu_sc_18T_ms__or2_1
+       csa_tree_add1_add_30_16_groupi_g8576__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_518), .B
+       (csa_tree_add1_add_30_16_groupi_n_394), .Y
+       (csa_tree_add1_add_30_16_groupi_n_595));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8577__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_511), .B
+       (csa_tree_add1_add_30_16_groupi_n_432), .Y
+       (csa_tree_add1_add_30_16_groupi_n_594));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8578__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_389), .B
+       (csa_tree_add1_add_30_16_groupi_n_508), .Y
+       (csa_tree_add1_add_30_16_groupi_n_593));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8579__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_475), .B
+       (csa_tree_add1_add_30_16_groupi_n_116), .Y
+       (csa_tree_add1_add_30_16_groupi_n_592));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8580__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_430), .B
+       (csa_tree_add1_add_30_16_groupi_n_92), .Y
+       (csa_tree_add1_add_30_16_groupi_n_591));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8581__6417(.A
+       (csa_tree_add1_add_30_16_groupi_n_489), .B
+       (csa_tree_add1_add_30_16_groupi_n_97), .Y
+       (csa_tree_add1_add_30_16_groupi_n_590));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8582__5477(.A
+       (csa_tree_add1_add_30_16_groupi_n_88), .B
+       (csa_tree_add1_add_30_16_groupi_n_390), .Y
+       (csa_tree_add1_add_30_16_groupi_n_589));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8583__2398(.A
+       (csa_tree_add1_add_30_16_groupi_n_99), .B
+       (csa_tree_add1_add_30_16_groupi_n_435), .Y
+       (csa_tree_add1_add_30_16_groupi_n_588));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8584__5107(.A
+       (csa_tree_add1_add_30_16_groupi_n_94), .B
+       (csa_tree_add1_add_30_16_groupi_n_486), .Y
+       (csa_tree_add1_add_30_16_groupi_n_587));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8585__6260(.A
+       (csa_tree_add1_add_30_16_groupi_n_403), .B
+       (csa_tree_add1_add_30_16_groupi_n_114), .Y
+       (csa_tree_add1_add_30_16_groupi_n_586));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8586(.A
+       (csa_tree_add1_add_30_16_groupi_n_582), .Y
+       (csa_tree_add1_add_30_16_groupi_n_581));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8587__4319(.A
+       (csa_tree_add1_add_30_16_groupi_n_117), .B
+       (csa_tree_add1_add_30_16_groupi_n_418), .Y
+       (csa_tree_add1_add_30_16_groupi_n_577));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8588__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_502), .B
+       (csa_tree_add1_add_30_16_groupi_n_397), .Y
+       (csa_tree_add1_add_30_16_groupi_n_576));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8589__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_500), .B
+       (csa_tree_add1_add_30_16_groupi_n_424), .Y
+       (csa_tree_add1_add_30_16_groupi_n_575));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8590__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_406), .B
+       (csa_tree_add1_add_30_16_groupi_n_408), .Y
+       (csa_tree_add1_add_30_16_groupi_n_574));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8591__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_498), .B
+       (csa_tree_add1_add_30_16_groupi_n_503), .Y
+       (csa_tree_add1_add_30_16_groupi_n_573));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8592__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_428), .B
+       (csa_tree_add1_add_30_16_groupi_n_441), .Y
+       (csa_tree_add1_add_30_16_groupi_n_572));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8593__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_90), .A1 (sum_q[28]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_537), .Y
+       (csa_tree_add1_add_30_16_groupi_n_571));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8594__1705(.A
+       (csa_tree_add1_add_30_16_groupi_n_491), .B
+       (csa_tree_add1_add_30_16_groupi_n_399), .Y
+       (csa_tree_add1_add_30_16_groupi_n_570));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8595__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_407), .B
+       (csa_tree_add1_add_30_16_groupi_n_411), .Y
+       (csa_tree_add1_add_30_16_groupi_n_569));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8596__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_438), .B
+       (csa_tree_add1_add_30_16_groupi_n_440), .Y
+       (csa_tree_add1_add_30_16_groupi_n_568));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8597__7098(.A
+       (csa_tree_add1_add_30_16_groupi_n_439), .B
+       (csa_tree_add1_add_30_16_groupi_n_436), .Y
+       (csa_tree_add1_add_30_16_groupi_n_567));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8598__6131(.A
+       (csa_tree_add1_add_30_16_groupi_n_429), .B
+       (csa_tree_add1_add_30_16_groupi_n_425), .Y
+       (csa_tree_add1_add_30_16_groupi_n_566));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8599__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_421), .B
+       (csa_tree_add1_add_30_16_groupi_n_420), .Y
+       (csa_tree_add1_add_30_16_groupi_n_565));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8600__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_490), .B
+       (csa_tree_add1_add_30_16_groupi_n_388), .Y
+       (csa_tree_add1_add_30_16_groupi_n_564));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8601__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_416), .B
+       (csa_tree_add1_add_30_16_groupi_n_414), .Y
+       (csa_tree_add1_add_30_16_groupi_n_563));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8602__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_417), .B
+       (csa_tree_add1_add_30_16_groupi_n_404), .Y
+       (csa_tree_add1_add_30_16_groupi_n_562));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8603__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_400), .B
+       (csa_tree_add1_add_30_16_groupi_n_515), .Y
+       (csa_tree_add1_add_30_16_groupi_n_561));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8605__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_401), .B
+       (csa_tree_add1_add_30_16_groupi_n_402), .Y
+       (csa_tree_add1_add_30_16_groupi_n_559));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8606__2883(.A0
+       (csa_tree_add1_add_30_16_groupi_n_360), .A1 (sum_q[6]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_526), .Y
+       (csa_tree_add1_add_30_16_groupi_n_558));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8607__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_534), .B
+       (csa_tree_add1_add_30_16_groupi_n_380), .Y
+       (csa_tree_add1_add_30_16_groupi_n_557));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8608__1666(.A0
+       (csa_tree_add1_add_30_16_groupi_n_362), .A1 (sum_q[8]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_446), .Y
+       (csa_tree_add1_add_30_16_groupi_n_556));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8609__7410(.A
+       (csa_tree_add1_add_30_16_groupi_n_482), .B
+       (csa_tree_add1_add_30_16_groupi_n_247), .Y
+       (csa_tree_add1_add_30_16_groupi_n_555));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8610__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_103), .A1 (sum_q[0]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_485), .Y
+       (csa_tree_add1_add_30_16_groupi_n_554));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8611__5477(.A (sum_q[13]), .B
+       (csa_tree_add1_add_30_16_groupi_n_372), .Y
+       (csa_tree_add1_add_30_16_groupi_n_585));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8612__2398(.A (sum_q[7]), .B
+       (csa_tree_add1_add_30_16_groupi_n_367), .Y
+       (csa_tree_add1_add_30_16_groupi_n_584));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8613__5107(.A (sum_q[11]), .B
+       (csa_tree_add1_add_30_16_groupi_n_369), .Y
+       (csa_tree_add1_add_30_16_groupi_n_583));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8614__6260(.A (sum_q[3]), .B
+       (csa_tree_add1_add_30_16_groupi_n_374), .Y
+       (csa_tree_add1_add_30_16_groupi_n_582));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8615__4319(.A (sum_q[15]), .B
+       (csa_tree_add1_add_30_16_groupi_n_382), .Y
+       (csa_tree_add1_add_30_16_groupi_n_580));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8616__8428(.A (sum_q[9]), .B
+       (csa_tree_add1_add_30_16_groupi_n_365), .Y
+       (csa_tree_add1_add_30_16_groupi_n_579));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8617__5526(.A (sum_q[5]), .B
+       (csa_tree_add1_add_30_16_groupi_n_371), .Y
+       (csa_tree_add1_add_30_16_groupi_n_578));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8618(.A
+       (csa_tree_add1_add_30_16_groupi_n_523), .Y
+       (csa_tree_add1_add_30_16_groupi_n_524));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8619(.A
+       (csa_tree_add1_add_30_16_groupi_n_520), .Y
+       (csa_tree_add1_add_30_16_groupi_n_519));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8620(.A
+       (csa_tree_add1_add_30_16_groupi_n_517), .Y
+       (csa_tree_add1_add_30_16_groupi_n_518));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8621(.A
+       (csa_tree_add1_add_30_16_groupi_n_513), .Y
+       (csa_tree_add1_add_30_16_groupi_n_514));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8622(.A
+       (csa_tree_add1_add_30_16_groupi_n_505), .Y
+       (csa_tree_add1_add_30_16_groupi_n_504));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8624(.A
+       (csa_tree_add1_add_30_16_groupi_n_488), .Y
+       (csa_tree_add1_add_30_16_groupi_n_487));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8625(.A
+       (csa_tree_add1_add_30_16_groupi_n_484), .Y
+       (csa_tree_add1_add_30_16_groupi_n_485));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8626(.A
+       (csa_tree_add1_add_30_16_groupi_n_478), .Y
+       (csa_tree_add1_add_30_16_groupi_n_481));
+  sky130_osu_sc_18T_ms__inv_3 csa_tree_add1_add_30_16_groupi_g8627(.A
+       (csa_tree_add1_add_30_16_groupi_n_479), .Y
+       (csa_tree_add1_add_30_16_groupi_n_480));
+  sky130_osu_sc_18T_ms__buf_1 csa_tree_add1_add_30_16_groupi_g8632(.A
+       (csa_tree_add1_add_30_16_groupi_n_478), .Y
+       (csa_tree_add1_add_30_16_groupi_n_479));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8634(.A
+       (csa_tree_add1_add_30_16_groupi_n_474), .Y
+       (csa_tree_add1_add_30_16_groupi_n_477));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8635(.A
+       (csa_tree_add1_add_30_16_groupi_n_475), .Y
+       (csa_tree_add1_add_30_16_groupi_n_476));
+  sky130_osu_sc_18T_ms__buf_2 csa_tree_add1_add_30_16_groupi_g8638(.A
+       (csa_tree_add1_add_30_16_groupi_n_474), .Y
+       (csa_tree_add1_add_30_16_groupi_n_475));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8639__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_358), .A1
+       (csa_tree_add1_add_30_16_groupi_n_84), .B0 (sum_q[2]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_357), .Y
+       (csa_tree_add1_add_30_16_groupi_n_473));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8640__3680(.A0
+       (csa_tree_add1_add_30_16_groupi_n_261), .A1
+       (csa_tree_add1_add_30_16_groupi_n_337), .B0 (b[15]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_472));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8641__1617(.A (sum_q[10]), .B
+       (csa_tree_add1_add_30_16_groupi_n_354), .Y
+       (csa_tree_add1_add_30_16_groupi_n_471));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8642__2802(.A (sum_q[12]), .B
+       (csa_tree_add1_add_30_16_groupi_n_356), .Y
+       (csa_tree_add1_add_30_16_groupi_n_470));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8643__1705(.A (sum_q[14]), .B
+       (csa_tree_add1_add_30_16_groupi_n_355), .Y
+       (csa_tree_add1_add_30_16_groupi_n_469));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8644__5122(.A0
+       (csa_tree_add1_add_30_16_groupi_n_363), .A1 (sum_q[8]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_83), .B1
+       (csa_tree_add1_add_30_16_groupi_n_362), .Y
+       (csa_tree_add1_add_30_16_groupi_n_468));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8645__8246(.A
+       (csa_tree_add1_add_30_16_groupi_n_56), .B
+       (csa_tree_add1_add_30_16_groupi_n_359), .Y
+       (csa_tree_add1_add_30_16_groupi_n_467));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8646__7098(.A0
+       (csa_tree_add1_add_30_16_groupi_n_361), .A1 (sum_q[6]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_58), .B1
+       (csa_tree_add1_add_30_16_groupi_n_360), .Y
+       (csa_tree_add1_add_30_16_groupi_n_466));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8647__6131(.A0
+       (csa_tree_add1_add_30_16_groupi_n_253), .A1
+       (csa_tree_add1_add_30_16_groupi_n_345), .B0 (n_7), .Y
+       (csa_tree_add1_add_30_16_groupi_n_553));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8648__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_330), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_262), .B1
+       (csa_tree_add1_add_30_16_groupi_n_320), .Y
+       (csa_tree_add1_add_30_16_groupi_n_552));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8649__5115(.A0
+       (csa_tree_add1_add_30_16_groupi_n_326), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_331), .B1
+       (csa_tree_add1_add_30_16_groupi_n_262), .Y
+       (csa_tree_add1_add_30_16_groupi_n_551));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8650__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_319), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_262), .B1
+       (csa_tree_add1_add_30_16_groupi_n_317), .Y
+       (csa_tree_add1_add_30_16_groupi_n_550));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8651__4733(.A0
+       (csa_tree_add1_add_30_16_groupi_n_318), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_262), .B1
+       (csa_tree_add1_add_30_16_groupi_n_325), .Y
+       (csa_tree_add1_add_30_16_groupi_n_549));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8652__6161(.A0
+       (csa_tree_add1_add_30_16_groupi_n_315), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_262), .B1
+       (csa_tree_add1_add_30_16_groupi_n_319), .Y
+       (csa_tree_add1_add_30_16_groupi_n_548));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8653__9315(.A0
+       (csa_tree_add1_add_30_16_groupi_n_331), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_262), .B1
+       (csa_tree_add1_add_30_16_groupi_n_315), .Y
+       (csa_tree_add1_add_30_16_groupi_n_547));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8654__9945(.A0
+       (csa_tree_add1_add_30_16_groupi_n_325), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_262), .B1
+       (csa_tree_add1_add_30_16_groupi_n_327), .Y
+       (csa_tree_add1_add_30_16_groupi_n_546));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8655__2883(.A0
+       (csa_tree_add1_add_30_16_groupi_n_321), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_262), .B1
+       (csa_tree_add1_add_30_16_groupi_n_316), .Y
+       (csa_tree_add1_add_30_16_groupi_n_545));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8656__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_320), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_262), .B1
+       (csa_tree_add1_add_30_16_groupi_n_321), .Y
+       (csa_tree_add1_add_30_16_groupi_n_544));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8657__1666(.A0
+       (csa_tree_add1_add_30_16_groupi_n_316), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_318), .B1
+       (csa_tree_add1_add_30_16_groupi_n_262), .Y
+       (csa_tree_add1_add_30_16_groupi_n_543));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8659__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_255), .A1
+       (csa_tree_add1_add_30_16_groupi_n_343), .B0 (n_5), .Y
+       (csa_tree_add1_add_30_16_groupi_n_541));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8660__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_264), .A1
+       (csa_tree_add1_add_30_16_groupi_n_342), .B0 (n_11), .Y
+       (csa_tree_add1_add_30_16_groupi_n_540));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8661__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_258), .A1
+       (csa_tree_add1_add_30_16_groupi_n_353), .B0 (n_10), .Y
+       (csa_tree_add1_add_30_16_groupi_n_539));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8662__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_260), .A1
+       (csa_tree_add1_add_30_16_groupi_n_347), .B0 (n_4), .Y
+       (csa_tree_add1_add_30_16_groupi_n_538));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8663__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_328), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_262), .B1
+       (csa_tree_add1_add_30_16_groupi_n_329), .Y
+       (csa_tree_add1_add_30_16_groupi_n_537));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8664__6260(.A0
+       (csa_tree_add1_add_30_16_groupi_n_338), .A1
+       (csa_tree_add1_add_30_16_groupi_n_239), .B0
+       (csa_tree_add1_add_30_16_groupi_n_326), .B1
+       (csa_tree_add1_add_30_16_groupi_n_262), .Y
+       (csa_tree_add1_add_30_16_groupi_n_536));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8665__4319(.A (sum_q[3]), .B
+       (csa_tree_add1_add_30_16_groupi_n_375), .Y
+       (csa_tree_add1_add_30_16_groupi_n_535));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8666__8428(.A0
+       (csa_tree_add1_add_30_16_groupi_n_143), .A1
+       (csa_tree_add1_add_30_16_groupi_n_351), .B0
+       (csa_tree_add1_add_30_16_groupi_n_219), .B1 (b[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_534));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8667__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_271), .A1
+       (csa_tree_add1_add_30_16_groupi_n_350), .B0
+       (csa_tree_add1_add_30_16_groupi_n_225), .B1
+       (csa_tree_add1_add_30_16_groupi_n_66), .Y
+       (csa_tree_add1_add_30_16_groupi_n_533));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8668__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_295), .A1
+       (csa_tree_add1_add_30_16_groupi_n_350), .B0
+       (csa_tree_add1_add_30_16_groupi_n_195), .B1
+       (csa_tree_add1_add_30_16_groupi_n_66), .Y
+       (csa_tree_add1_add_30_16_groupi_n_532));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8669__3680(.A0
+       (csa_tree_add1_add_30_16_groupi_n_191), .A1
+       (csa_tree_add1_add_30_16_groupi_n_351), .B0
+       (csa_tree_add1_add_30_16_groupi_n_147), .B1 (b[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_531));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8670__1617(.A0
+       (csa_tree_add1_add_30_16_groupi_n_146), .A1
+       (csa_tree_add1_add_30_16_groupi_n_350), .B0
+       (csa_tree_add1_add_30_16_groupi_n_313), .B1
+       (csa_tree_add1_add_30_16_groupi_n_66), .Y
+       (csa_tree_add1_add_30_16_groupi_n_530));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8671__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_156), .A1
+       (csa_tree_add1_add_30_16_groupi_n_351), .B0
+       (csa_tree_add1_add_30_16_groupi_n_154), .B1 (b[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_529));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8672__1705(.A0
+       (csa_tree_add1_add_30_16_groupi_n_130), .A1
+       (csa_tree_add1_add_30_16_groupi_n_347), .B0
+       (csa_tree_add1_add_30_16_groupi_n_260), .B1 (n_4), .Y
+       (csa_tree_add1_add_30_16_groupi_n_528));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8673__5122(.A0
+       (csa_tree_add1_add_30_16_groupi_n_149), .A1
+       (csa_tree_add1_add_30_16_groupi_n_345), .B0
+       (csa_tree_add1_add_30_16_groupi_n_253), .B1 (n_7), .Y
+       (csa_tree_add1_add_30_16_groupi_n_527));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8674__8246(.A0
+       (csa_tree_add1_add_30_16_groupi_n_299), .A1
+       (csa_tree_add1_add_30_16_groupi_n_346), .B0
+       (csa_tree_add1_add_30_16_groupi_n_254), .B1
+       (csa_tree_add1_add_30_16_groupi_n_185), .Y
+       (csa_tree_add1_add_30_16_groupi_n_526));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8675__7098(.A0
+       (csa_tree_add1_add_30_16_groupi_n_282), .A1
+       (csa_tree_add1_add_30_16_groupi_n_339), .B0
+       (csa_tree_add1_add_30_16_groupi_n_251), .B1
+       (csa_tree_add1_add_30_16_groupi_n_310), .Y
+       (csa_tree_add1_add_30_16_groupi_n_525));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8676__6131(.A0
+       (csa_tree_add1_add_30_16_groupi_n_122), .A1
+       (csa_tree_add1_add_30_16_groupi_n_348), .B0
+       (csa_tree_add1_add_30_16_groupi_n_259), .B1
+       (csa_tree_add1_add_30_16_groupi_n_306), .Y
+       (csa_tree_add1_add_30_16_groupi_n_523));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8677__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_296), .A1
+       (csa_tree_add1_add_30_16_groupi_n_340), .B0
+       (csa_tree_add1_add_30_16_groupi_n_252), .B1
+       (csa_tree_add1_add_30_16_groupi_n_223), .Y
+       (csa_tree_add1_add_30_16_groupi_n_522));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8678__5115(.A0
+       (csa_tree_add1_add_30_16_groupi_n_252), .A1
+       (csa_tree_add1_add_30_16_groupi_n_340), .B0 (n_6), .Y
+       (csa_tree_add1_add_30_16_groupi_n_521));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8679__7482(.A (sum_q[7]), .B
+       (csa_tree_add1_add_30_16_groupi_n_368), .Y
+       (csa_tree_add1_add_30_16_groupi_n_520));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8680__4733(.A0
+       (csa_tree_add1_add_30_16_groupi_n_220), .A1
+       (csa_tree_add1_add_30_16_groupi_n_351), .B0
+       (csa_tree_add1_add_30_16_groupi_n_191), .B1 (b[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_517));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8681__6161(.A0
+       (csa_tree_add1_add_30_16_groupi_n_226), .A1
+       (csa_tree_add1_add_30_16_groupi_n_351), .B0
+       (csa_tree_add1_add_30_16_groupi_n_141), .B1 (b[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_516));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8682__9315(.A0
+       (csa_tree_add1_add_30_16_groupi_n_140), .A1
+       (csa_tree_add1_add_30_16_groupi_n_339), .B0
+       (csa_tree_add1_add_30_16_groupi_n_251), .B1
+       (csa_tree_add1_add_30_16_groupi_n_287), .Y
+       (csa_tree_add1_add_30_16_groupi_n_515));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8683__9945(.A0
+       (csa_tree_add1_add_30_16_groupi_n_194), .A1
+       (csa_tree_add1_add_30_16_groupi_n_351), .B0
+       (csa_tree_add1_add_30_16_groupi_n_272), .B1 (b[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_513));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8684__2883(.A (sum_q[11]), .B
+       (csa_tree_add1_add_30_16_groupi_n_370), .Y
+       (csa_tree_add1_add_30_16_groupi_n_512));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8685__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_215), .A1
+       (csa_tree_add1_add_30_16_groupi_n_350), .B0
+       (csa_tree_add1_add_30_16_groupi_n_295), .B1
+       (csa_tree_add1_add_30_16_groupi_n_66), .Y
+       (csa_tree_add1_add_30_16_groupi_n_511));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8686__1666(.A0
+       (csa_tree_add1_add_30_16_groupi_n_329), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_262), .B1
+       (csa_tree_add1_add_30_16_groupi_n_322), .Y
+       (csa_tree_add1_add_30_16_groupi_n_510));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8687__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_154), .A1
+       (csa_tree_add1_add_30_16_groupi_n_351), .B0
+       (csa_tree_add1_add_30_16_groupi_n_216), .B1 (b[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_509));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8688__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_142), .A1
+       (csa_tree_add1_add_30_16_groupi_n_351), .B0
+       (csa_tree_add1_add_30_16_groupi_n_156), .B1 (b[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_508));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8689__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_314), .A1
+       (csa_tree_add1_add_30_16_groupi_n_351), .B0
+       (csa_tree_add1_add_30_16_groupi_n_142), .B1 (b[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_507));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8690__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_327), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_262), .B1
+       (csa_tree_add1_add_30_16_groupi_n_328), .Y
+       (csa_tree_add1_add_30_16_groupi_n_506));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8691__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_317), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_262), .B1
+       (csa_tree_add1_add_30_16_groupi_n_330), .Y
+       (csa_tree_add1_add_30_16_groupi_n_505));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8692__6260(.A0
+       (csa_tree_add1_add_30_16_groupi_n_124), .A1
+       (csa_tree_add1_add_30_16_groupi_n_353), .B0
+       (csa_tree_add1_add_30_16_groupi_n_258), .B1
+       (csa_tree_add1_add_30_16_groupi_n_300), .Y
+       (csa_tree_add1_add_30_16_groupi_n_503));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8693__4319(.A0
+       (csa_tree_add1_add_30_16_groupi_n_218), .A1
+       (csa_tree_add1_add_30_16_groupi_n_342), .B0
+       (csa_tree_add1_add_30_16_groupi_n_264), .B1 (n_11), .Y
+       (csa_tree_add1_add_30_16_groupi_n_502));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8694__8428(.A (sum_q[13]), .B
+       (csa_tree_add1_add_30_16_groupi_n_373), .Y
+       (csa_tree_add1_add_30_16_groupi_n_501));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8695__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_298), .A1
+       (csa_tree_add1_add_30_16_groupi_n_353), .B0
+       (csa_tree_add1_add_30_16_groupi_n_258), .B1 (n_10), .Y
+       (csa_tree_add1_add_30_16_groupi_n_500));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8696__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_371), .B
+       (csa_tree_add1_add_30_16_groupi_n_59), .Y
+       (csa_tree_add1_add_30_16_groupi_n_499));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8697__3680(.A0
+       (csa_tree_add1_add_30_16_groupi_n_184), .A1
+       (csa_tree_add1_add_30_16_groupi_n_345), .B0
+       (csa_tree_add1_add_30_16_groupi_n_253), .B1
+       (csa_tree_add1_add_30_16_groupi_n_163), .Y
+       (csa_tree_add1_add_30_16_groupi_n_498));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8698__1617(.A (sum_q[9]), .B
+       (csa_tree_add1_add_30_16_groupi_n_366), .Y
+       (csa_tree_add1_add_30_16_groupi_n_497));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8699__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_175), .A1
+       (csa_tree_add1_add_30_16_groupi_n_341), .B0
+       (csa_tree_add1_add_30_16_groupi_n_263), .B1
+       (csa_tree_add1_add_30_16_groupi_n_165), .Y
+       (csa_tree_add1_add_30_16_groupi_n_496));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8700__1705(.A0
+       (csa_tree_add1_add_30_16_groupi_n_196), .A1
+       (csa_tree_add1_add_30_16_groupi_n_348), .B0
+       (csa_tree_add1_add_30_16_groupi_n_259), .B1
+       (csa_tree_add1_add_30_16_groupi_n_209), .Y
+       (csa_tree_add1_add_30_16_groupi_n_495));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8701__5122(.A0
+       (csa_tree_add1_add_30_16_groupi_n_284), .A1
+       (csa_tree_add1_add_30_16_groupi_n_344), .B0
+       (csa_tree_add1_add_30_16_groupi_n_256), .B1
+       (csa_tree_add1_add_30_16_groupi_n_281), .Y
+       (csa_tree_add1_add_30_16_groupi_n_494));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8702__8246(.A0
+       (csa_tree_add1_add_30_16_groupi_n_141), .A1
+       (csa_tree_add1_add_30_16_groupi_n_351), .B0
+       (csa_tree_add1_add_30_16_groupi_n_121), .B1 (b[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_493));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8703__7098(.A0
+       (csa_tree_add1_add_30_16_groupi_n_153), .A1
+       (csa_tree_add1_add_30_16_groupi_n_348), .B0
+       (csa_tree_add1_add_30_16_groupi_n_259), .B1
+       (csa_tree_add1_add_30_16_groupi_n_196), .Y
+       (csa_tree_add1_add_30_16_groupi_n_492));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8704__6131(.A0
+       (csa_tree_add1_add_30_16_groupi_n_168), .A1
+       (csa_tree_add1_add_30_16_groupi_n_344), .B0
+       (csa_tree_add1_add_30_16_groupi_n_256), .B1
+       (csa_tree_add1_add_30_16_groupi_n_135), .Y
+       (csa_tree_add1_add_30_16_groupi_n_491));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8705__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_138), .A1
+       (csa_tree_add1_add_30_16_groupi_n_341), .B0
+       (csa_tree_add1_add_30_16_groupi_n_263), .B1
+       (csa_tree_add1_add_30_16_groupi_n_162), .Y
+       (csa_tree_add1_add_30_16_groupi_n_490));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8706__5115(.A0
+       (csa_tree_add1_add_30_16_groupi_n_221), .A1
+       (csa_tree_add1_add_30_16_groupi_n_353), .B0
+       (csa_tree_add1_add_30_16_groupi_n_258), .B1
+       (csa_tree_add1_add_30_16_groupi_n_298), .Y
+       (csa_tree_add1_add_30_16_groupi_n_489));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8707__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_219), .A1
+       (csa_tree_add1_add_30_16_groupi_n_351), .B0
+       (csa_tree_add1_add_30_16_groupi_n_220), .B1 (b[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_488));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8708__4733(.A0
+       (csa_tree_add1_add_30_16_groupi_n_324), .A1
+       (csa_tree_add1_add_30_16_groupi_n_341), .B0
+       (csa_tree_add1_add_30_16_groupi_n_263), .B1
+       (csa_tree_add1_add_30_16_groupi_n_203), .Y
+       (csa_tree_add1_add_30_16_groupi_n_486));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8709__6161(.A0
+       (csa_tree_add1_add_30_16_groupi_n_64), .A1
+       (csa_tree_add1_add_30_16_groupi_n_351), .B0
+       (csa_tree_add1_add_30_16_groupi_n_143), .B1 (b[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_484));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8710__9315(.A (sum_q[15]), .B
+       (csa_tree_add1_add_30_16_groupi_n_383), .Y
+       (csa_tree_add1_add_30_16_groupi_n_483));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8711__9945(.A0
+       (csa_tree_add1_add_30_16_groupi_n_322), .A1
+       (csa_tree_add1_add_30_16_groupi_n_338), .B0
+       (csa_tree_add1_add_30_16_groupi_n_262), .B1
+       (csa_tree_add1_add_30_16_groupi_n_65), .Y
+       (csa_tree_add1_add_30_16_groupi_n_482));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8712__2883(.A0
+       (csa_tree_add1_add_30_16_groupi_n_166), .A1
+       (csa_tree_add1_add_30_16_groupi_n_343), .B0
+       (csa_tree_add1_add_30_16_groupi_n_255), .B1 (n_5), .Y
+       (csa_tree_add1_add_30_16_groupi_n_478));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8713__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_274), .A1
+       (csa_tree_add1_add_30_16_groupi_n_340), .B0
+       (csa_tree_add1_add_30_16_groupi_n_252), .B1 (n_6), .Y
+       (csa_tree_add1_add_30_16_groupi_n_474));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8714(.A
+       (csa_tree_add1_add_30_16_groupi_n_385), .Y
+       (csa_tree_add1_add_30_16_groupi_n_444));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8715(.A
+       (csa_tree_add1_add_30_16_groupi_n_384), .Y
+       (csa_tree_add1_add_30_16_groupi_n_430));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8716(.A
+       (csa_tree_add1_add_30_16_groupi_n_427), .Y
+       (csa_tree_add1_add_30_16_groupi_n_426));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8717(.A
+       (csa_tree_add1_add_30_16_groupi_n_422), .Y
+       (csa_tree_add1_add_30_16_groupi_n_423));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8718(.A
+       (csa_tree_add1_add_30_16_groupi_n_415), .Y
+       (csa_tree_add1_add_30_16_groupi_n_416));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g8719(.A
+       (csa_tree_add1_add_30_16_groupi_n_394), .Y
+       (csa_tree_add1_add_30_16_groupi_n_393));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8720(.A
+       (csa_tree_add1_add_30_16_groupi_n_387), .Y
+       (csa_tree_add1_add_30_16_groupi_n_386));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8721__1666(.A0
+       (csa_tree_add1_add_30_16_groupi_n_209), .A1
+       (csa_tree_add1_add_30_16_groupi_n_348), .B0
+       (csa_tree_add1_add_30_16_groupi_n_259), .B1
+       (csa_tree_add1_add_30_16_groupi_n_159), .Y
+       (csa_tree_add1_add_30_16_groupi_n_465));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8722__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_214), .A1
+       (csa_tree_add1_add_30_16_groupi_n_340), .B0
+       (csa_tree_add1_add_30_16_groupi_n_252), .B1
+       (csa_tree_add1_add_30_16_groupi_n_161), .Y
+       (csa_tree_add1_add_30_16_groupi_n_464));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8723__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_137), .A1
+       (csa_tree_add1_add_30_16_groupi_n_348), .B0
+       (csa_tree_add1_add_30_16_groupi_n_259), .B1
+       (csa_tree_add1_add_30_16_groupi_n_222), .Y
+       (csa_tree_add1_add_30_16_groupi_n_463));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8724__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_211), .A1
+       (csa_tree_add1_add_30_16_groupi_n_348), .B0
+       (csa_tree_add1_add_30_16_groupi_n_259), .B1
+       (csa_tree_add1_add_30_16_groupi_n_207), .Y
+       (csa_tree_add1_add_30_16_groupi_n_462));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8725__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_286), .A1
+       (csa_tree_add1_add_30_16_groupi_n_348), .B0
+       (csa_tree_add1_add_30_16_groupi_n_259), .B1
+       (csa_tree_add1_add_30_16_groupi_n_137), .Y
+       (csa_tree_add1_add_30_16_groupi_n_461));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8726__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_277), .A1
+       (csa_tree_add1_add_30_16_groupi_n_344), .B0
+       (csa_tree_add1_add_30_16_groupi_n_256), .B1
+       (csa_tree_add1_add_30_16_groupi_n_167), .Y
+       (csa_tree_add1_add_30_16_groupi_n_460));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8727__6260(.A0
+       (csa_tree_add1_add_30_16_groupi_n_224), .A1
+       (csa_tree_add1_add_30_16_groupi_n_340), .B0
+       (csa_tree_add1_add_30_16_groupi_n_252), .B1
+       (csa_tree_add1_add_30_16_groupi_n_214), .Y
+       (csa_tree_add1_add_30_16_groupi_n_459));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8728__4319(.A0
+       (csa_tree_add1_add_30_16_groupi_n_302), .A1
+       (csa_tree_add1_add_30_16_groupi_n_340), .B0
+       (csa_tree_add1_add_30_16_groupi_n_252), .B1
+       (csa_tree_add1_add_30_16_groupi_n_305), .Y
+       (csa_tree_add1_add_30_16_groupi_n_458));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8729__8428(.A0
+       (csa_tree_add1_add_30_16_groupi_n_176), .A1
+       (csa_tree_add1_add_30_16_groupi_n_346), .B0
+       (csa_tree_add1_add_30_16_groupi_n_254), .B1
+       (csa_tree_add1_add_30_16_groupi_n_269), .Y
+       (csa_tree_add1_add_30_16_groupi_n_457));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8730__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_297), .A1
+       (csa_tree_add1_add_30_16_groupi_n_342), .B0
+       (csa_tree_add1_add_30_16_groupi_n_264), .B1
+       (csa_tree_add1_add_30_16_groupi_n_172), .Y
+       (csa_tree_add1_add_30_16_groupi_n_456));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8731__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_199), .A1
+       (csa_tree_add1_add_30_16_groupi_n_352), .B0
+       (csa_tree_add1_add_30_16_groupi_n_257), .B1
+       (csa_tree_add1_add_30_16_groupi_n_200), .Y
+       (csa_tree_add1_add_30_16_groupi_n_455));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8732__3680(.A0
+       (csa_tree_add1_add_30_16_groupi_n_126), .A1
+       (csa_tree_add1_add_30_16_groupi_n_339), .B0
+       (csa_tree_add1_add_30_16_groupi_n_251), .B1
+       (csa_tree_add1_add_30_16_groupi_n_282), .Y
+       (csa_tree_add1_add_30_16_groupi_n_454));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8733__1617(.A0
+       (csa_tree_add1_add_30_16_groupi_n_189), .A1
+       (csa_tree_add1_add_30_16_groupi_n_347), .B0
+       (csa_tree_add1_add_30_16_groupi_n_260), .B1
+       (csa_tree_add1_add_30_16_groupi_n_228), .Y
+       (csa_tree_add1_add_30_16_groupi_n_453));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8734__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_193), .A1
+       (csa_tree_add1_add_30_16_groupi_n_344), .B0
+       (csa_tree_add1_add_30_16_groupi_n_256), .B1
+       (csa_tree_add1_add_30_16_groupi_n_204), .Y
+       (csa_tree_add1_add_30_16_groupi_n_452));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8735__1705(.A0
+       (csa_tree_add1_add_30_16_groupi_n_145), .A1
+       (csa_tree_add1_add_30_16_groupi_n_339), .B0
+       (csa_tree_add1_add_30_16_groupi_n_251), .B1
+       (csa_tree_add1_add_30_16_groupi_n_278), .Y
+       (csa_tree_add1_add_30_16_groupi_n_451));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8736__5122(.A0
+       (csa_tree_add1_add_30_16_groupi_n_174), .A1
+       (csa_tree_add1_add_30_16_groupi_n_346), .B0
+       (csa_tree_add1_add_30_16_groupi_n_254), .B1
+       (csa_tree_add1_add_30_16_groupi_n_155), .Y
+       (csa_tree_add1_add_30_16_groupi_n_450));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8737__8246(.A0
+       (csa_tree_add1_add_30_16_groupi_n_178), .A1
+       (csa_tree_add1_add_30_16_groupi_n_343), .B0
+       (csa_tree_add1_add_30_16_groupi_n_255), .B1
+       (csa_tree_add1_add_30_16_groupi_n_169), .Y
+       (csa_tree_add1_add_30_16_groupi_n_449));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8738__7098(.A0
+       (csa_tree_add1_add_30_16_groupi_n_136), .A1
+       (csa_tree_add1_add_30_16_groupi_n_353), .B0
+       (csa_tree_add1_add_30_16_groupi_n_258), .B1
+       (csa_tree_add1_add_30_16_groupi_n_221), .Y
+       (csa_tree_add1_add_30_16_groupi_n_448));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8739__6131(.A0
+       (csa_tree_add1_add_30_16_groupi_n_268), .A1
+       (csa_tree_add1_add_30_16_groupi_n_348), .B0
+       (csa_tree_add1_add_30_16_groupi_n_259), .B1
+       (csa_tree_add1_add_30_16_groupi_n_129), .Y
+       (csa_tree_add1_add_30_16_groupi_n_447));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8740__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_164), .A1
+       (csa_tree_add1_add_30_16_groupi_n_346), .B0
+       (csa_tree_add1_add_30_16_groupi_n_254), .B1
+       (csa_tree_add1_add_30_16_groupi_n_290), .Y
+       (csa_tree_add1_add_30_16_groupi_n_446));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8741__5115(.A0
+       (csa_tree_add1_add_30_16_groupi_n_131), .A1
+       (csa_tree_add1_add_30_16_groupi_n_346), .B0
+       (csa_tree_add1_add_30_16_groupi_n_254), .B1
+       (csa_tree_add1_add_30_16_groupi_n_150), .Y
+       (csa_tree_add1_add_30_16_groupi_n_445));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8742__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_300), .A1
+       (csa_tree_add1_add_30_16_groupi_n_353), .B0
+       (csa_tree_add1_add_30_16_groupi_n_258), .B1
+       (csa_tree_add1_add_30_16_groupi_n_273), .Y
+       (csa_tree_add1_add_30_16_groupi_n_385));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8743__4733(.A0
+       (csa_tree_add1_add_30_16_groupi_n_291), .A1
+       (csa_tree_add1_add_30_16_groupi_n_353), .B0
+       (csa_tree_add1_add_30_16_groupi_n_258), .B1
+       (csa_tree_add1_add_30_16_groupi_n_201), .Y
+       (csa_tree_add1_add_30_16_groupi_n_443));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8744__6161(.A0
+       (csa_tree_add1_add_30_16_groupi_n_157), .A1
+       (csa_tree_add1_add_30_16_groupi_n_353), .B0
+       (csa_tree_add1_add_30_16_groupi_n_258), .B1
+       (csa_tree_add1_add_30_16_groupi_n_280), .Y
+       (csa_tree_add1_add_30_16_groupi_n_442));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8745__9315(.A0
+       (csa_tree_add1_add_30_16_groupi_n_294), .A1
+       (csa_tree_add1_add_30_16_groupi_n_346), .B0
+       (csa_tree_add1_add_30_16_groupi_n_254), .B1
+       (csa_tree_add1_add_30_16_groupi_n_131), .Y
+       (csa_tree_add1_add_30_16_groupi_n_441));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8746__9945(.A0
+       (csa_tree_add1_add_30_16_groupi_n_134), .A1
+       (csa_tree_add1_add_30_16_groupi_n_352), .B0
+       (csa_tree_add1_add_30_16_groupi_n_257), .B1
+       (csa_tree_add1_add_30_16_groupi_n_158), .Y
+       (csa_tree_add1_add_30_16_groupi_n_440));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8747__2883(.A0
+       (csa_tree_add1_add_30_16_groupi_n_198), .A1
+       (csa_tree_add1_add_30_16_groupi_n_344), .B0
+       (csa_tree_add1_add_30_16_groupi_n_256), .B1
+       (csa_tree_add1_add_30_16_groupi_n_177), .Y
+       (csa_tree_add1_add_30_16_groupi_n_439));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8748__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_227), .A1
+       (csa_tree_add1_add_30_16_groupi_n_348), .B0
+       (csa_tree_add1_add_30_16_groupi_n_259), .B1
+       (csa_tree_add1_add_30_16_groupi_n_187), .Y
+       (csa_tree_add1_add_30_16_groupi_n_438));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8749__1666(.A0
+       (csa_tree_add1_add_30_16_groupi_n_293), .A1
+       (csa_tree_add1_add_30_16_groupi_n_344), .B0
+       (csa_tree_add1_add_30_16_groupi_n_256), .B1
+       (csa_tree_add1_add_30_16_groupi_n_193), .Y
+       (csa_tree_add1_add_30_16_groupi_n_437));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8750__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_150), .A1
+       (csa_tree_add1_add_30_16_groupi_n_346), .B0
+       (csa_tree_add1_add_30_16_groupi_n_254), .B1
+       (csa_tree_add1_add_30_16_groupi_n_151), .Y
+       (csa_tree_add1_add_30_16_groupi_n_436));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8751__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_202), .A1
+       (csa_tree_add1_add_30_16_groupi_n_352), .B0
+       (csa_tree_add1_add_30_16_groupi_n_257), .B1
+       (csa_tree_add1_add_30_16_groupi_n_192), .Y
+       (csa_tree_add1_add_30_16_groupi_n_435));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8752__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_208), .A1
+       (csa_tree_add1_add_30_16_groupi_n_347), .B0
+       (csa_tree_add1_add_30_16_groupi_n_260), .B1
+       (csa_tree_add1_add_30_16_groupi_n_267), .Y
+       (csa_tree_add1_add_30_16_groupi_n_434));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8753__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_309), .A1
+       (csa_tree_add1_add_30_16_groupi_n_340), .B0
+       (csa_tree_add1_add_30_16_groupi_n_252), .B1
+       (csa_tree_add1_add_30_16_groupi_n_224), .Y
+       (csa_tree_add1_add_30_16_groupi_n_433));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8754__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_155), .A1
+       (csa_tree_add1_add_30_16_groupi_n_346), .B0
+       (csa_tree_add1_add_30_16_groupi_n_254), .B1
+       (csa_tree_add1_add_30_16_groupi_n_183), .Y
+       (csa_tree_add1_add_30_16_groupi_n_432));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8755__6260(.A0
+       (csa_tree_add1_add_30_16_groupi_n_171), .A1
+       (csa_tree_add1_add_30_16_groupi_n_342), .B0
+       (csa_tree_add1_add_30_16_groupi_n_264), .B1
+       (csa_tree_add1_add_30_16_groupi_n_297), .Y
+       (csa_tree_add1_add_30_16_groupi_n_431));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8756__4319(.A0
+       (csa_tree_add1_add_30_16_groupi_n_203), .A1
+       (csa_tree_add1_add_30_16_groupi_n_341), .B0
+       (csa_tree_add1_add_30_16_groupi_n_263), .B1
+       (csa_tree_add1_add_30_16_groupi_n_175), .Y
+       (csa_tree_add1_add_30_16_groupi_n_384));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8757__8428(.A0
+       (csa_tree_add1_add_30_16_groupi_n_162), .A1
+       (csa_tree_add1_add_30_16_groupi_n_341), .B0
+       (csa_tree_add1_add_30_16_groupi_n_263), .B1
+       (csa_tree_add1_add_30_16_groupi_n_170), .Y
+       (csa_tree_add1_add_30_16_groupi_n_429));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8758__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_135), .A1
+       (csa_tree_add1_add_30_16_groupi_n_344), .B0
+       (csa_tree_add1_add_30_16_groupi_n_256), .B1
+       (csa_tree_add1_add_30_16_groupi_n_212), .Y
+       (csa_tree_add1_add_30_16_groupi_n_428));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8759__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_281), .A1
+       (csa_tree_add1_add_30_16_groupi_n_344), .B0
+       (csa_tree_add1_add_30_16_groupi_n_256), .B1
+       (csa_tree_add1_add_30_16_groupi_n_277), .Y
+       (csa_tree_add1_add_30_16_groupi_n_427));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8760__3680(.A0
+       (csa_tree_add1_add_30_16_groupi_n_222), .A1
+       (csa_tree_add1_add_30_16_groupi_n_348), .B0
+       (csa_tree_add1_add_30_16_groupi_n_259), .B1
+       (csa_tree_add1_add_30_16_groupi_n_188), .Y
+       (csa_tree_add1_add_30_16_groupi_n_425));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8761__1617(.A0
+       (csa_tree_add1_add_30_16_groupi_n_223), .A1
+       (csa_tree_add1_add_30_16_groupi_n_340), .B0
+       (csa_tree_add1_add_30_16_groupi_n_252), .B1
+       (csa_tree_add1_add_30_16_groupi_n_179), .Y
+       (csa_tree_add1_add_30_16_groupi_n_424));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8762__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_308), .A1
+       (csa_tree_add1_add_30_16_groupi_n_353), .B0
+       (csa_tree_add1_add_30_16_groupi_n_258), .B1
+       (csa_tree_add1_add_30_16_groupi_n_136), .Y
+       (csa_tree_add1_add_30_16_groupi_n_422));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8763__1705(.A0
+       (csa_tree_add1_add_30_16_groupi_n_200), .A1
+       (csa_tree_add1_add_30_16_groupi_n_352), .B0
+       (csa_tree_add1_add_30_16_groupi_n_257), .B1
+       (csa_tree_add1_add_30_16_groupi_n_134), .Y
+       (csa_tree_add1_add_30_16_groupi_n_421));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8764__5122(.A0
+       (csa_tree_add1_add_30_16_groupi_n_183), .A1
+       (csa_tree_add1_add_30_16_groupi_n_346), .B0
+       (csa_tree_add1_add_30_16_groupi_n_254), .B1
+       (csa_tree_add1_add_30_16_groupi_n_176), .Y
+       (csa_tree_add1_add_30_16_groupi_n_420));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8765__8246(.A0
+       (csa_tree_add1_add_30_16_groupi_n_206), .A1
+       (csa_tree_add1_add_30_16_groupi_n_341), .B0
+       (csa_tree_add1_add_30_16_groupi_n_263), .B1
+       (csa_tree_add1_add_30_16_groupi_n_311), .Y
+       (csa_tree_add1_add_30_16_groupi_n_419));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8766__7098(.A0
+       (csa_tree_add1_add_30_16_groupi_n_165), .A1
+       (csa_tree_add1_add_30_16_groupi_n_341), .B0
+       (csa_tree_add1_add_30_16_groupi_n_263), .B1
+       (csa_tree_add1_add_30_16_groupi_n_270), .Y
+       (csa_tree_add1_add_30_16_groupi_n_418));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8767__6131(.A0
+       (csa_tree_add1_add_30_16_groupi_n_289), .A1
+       (csa_tree_add1_add_30_16_groupi_n_345), .B0
+       (csa_tree_add1_add_30_16_groupi_n_253), .B1
+       (csa_tree_add1_add_30_16_groupi_n_173), .Y
+       (csa_tree_add1_add_30_16_groupi_n_417));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8768__1881(.A0
+       (csa_tree_add1_add_30_16_groupi_n_169), .A1
+       (csa_tree_add1_add_30_16_groupi_n_343), .B0
+       (csa_tree_add1_add_30_16_groupi_n_255), .B1
+       (csa_tree_add1_add_30_16_groupi_n_190), .Y
+       (csa_tree_add1_add_30_16_groupi_n_415));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8769__5115(.A0
+       (csa_tree_add1_add_30_16_groupi_n_230), .A1
+       (csa_tree_add1_add_30_16_groupi_n_346), .B0
+       (csa_tree_add1_add_30_16_groupi_n_254), .B1
+       (csa_tree_add1_add_30_16_groupi_n_148), .Y
+       (csa_tree_add1_add_30_16_groupi_n_414));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8770__7482(.A0
+       (csa_tree_add1_add_30_16_groupi_n_186), .A1
+       (csa_tree_add1_add_30_16_groupi_n_347), .B0
+       (csa_tree_add1_add_30_16_groupi_n_260), .B1
+       (csa_tree_add1_add_30_16_groupi_n_210), .Y
+       (csa_tree_add1_add_30_16_groupi_n_413));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8771__4733(.A0
+       (csa_tree_add1_add_30_16_groupi_n_288), .A1
+       (csa_tree_add1_add_30_16_groupi_n_340), .B0
+       (csa_tree_add1_add_30_16_groupi_n_252), .B1
+       (csa_tree_add1_add_30_16_groupi_n_144), .Y
+       (csa_tree_add1_add_30_16_groupi_n_412));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8772__6161(.A0
+       (csa_tree_add1_add_30_16_groupi_n_133), .A1
+       (csa_tree_add1_add_30_16_groupi_n_342), .B0
+       (csa_tree_add1_add_30_16_groupi_n_264), .B1
+       (csa_tree_add1_add_30_16_groupi_n_323), .Y
+       (csa_tree_add1_add_30_16_groupi_n_411));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8773__9315(.A0
+       (csa_tree_add1_add_30_16_groupi_n_125), .A1
+       (csa_tree_add1_add_30_16_groupi_n_341), .B0
+       (csa_tree_add1_add_30_16_groupi_n_263), .B1
+       (csa_tree_add1_add_30_16_groupi_n_138), .Y
+       (csa_tree_add1_add_30_16_groupi_n_410));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8774__9945(.A0
+       (csa_tree_add1_add_30_16_groupi_n_180), .A1
+       (csa_tree_add1_add_30_16_groupi_n_339), .B0
+       (csa_tree_add1_add_30_16_groupi_n_251), .B1
+       (csa_tree_add1_add_30_16_groupi_n_301), .Y
+       (csa_tree_add1_add_30_16_groupi_n_409));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8775__2883(.A0
+       (csa_tree_add1_add_30_16_groupi_n_190), .A1
+       (csa_tree_add1_add_30_16_groupi_n_343), .B0
+       (csa_tree_add1_add_30_16_groupi_n_255), .B1
+       (csa_tree_add1_add_30_16_groupi_n_292), .Y
+       (csa_tree_add1_add_30_16_groupi_n_408));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8776__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_152), .A1
+       (csa_tree_add1_add_30_16_groupi_n_345), .B0
+       (csa_tree_add1_add_30_16_groupi_n_253), .B1
+       (csa_tree_add1_add_30_16_groupi_n_229), .Y
+       (csa_tree_add1_add_30_16_groupi_n_407));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8777__1666(.A0
+       (csa_tree_add1_add_30_16_groupi_n_279), .A1
+       (csa_tree_add1_add_30_16_groupi_n_340), .B0
+       (csa_tree_add1_add_30_16_groupi_n_252), .B1
+       (csa_tree_add1_add_30_16_groupi_n_296), .Y
+       (csa_tree_add1_add_30_16_groupi_n_406));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8778__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_213), .A1
+       (csa_tree_add1_add_30_16_groupi_n_343), .B0
+       (csa_tree_add1_add_30_16_groupi_n_255), .B1
+       (csa_tree_add1_add_30_16_groupi_n_197), .Y
+       (csa_tree_add1_add_30_16_groupi_n_405));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8779__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_273), .A1
+       (csa_tree_add1_add_30_16_groupi_n_353), .B0
+       (csa_tree_add1_add_30_16_groupi_n_258), .B1
+       (csa_tree_add1_add_30_16_groupi_n_181), .Y
+       (csa_tree_add1_add_30_16_groupi_n_404));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8780__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_305), .A1
+       (csa_tree_add1_add_30_16_groupi_n_340), .B0
+       (csa_tree_add1_add_30_16_groupi_n_252), .B1
+       (csa_tree_add1_add_30_16_groupi_n_274), .Y
+       (csa_tree_add1_add_30_16_groupi_n_403));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8781__2398(.A0
+       (csa_tree_add1_add_30_16_groupi_n_270), .A1
+       (csa_tree_add1_add_30_16_groupi_n_341), .B0
+       (csa_tree_add1_add_30_16_groupi_n_263), .B1
+       (csa_tree_add1_add_30_16_groupi_n_217), .Y
+       (csa_tree_add1_add_30_16_groupi_n_402));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8782__5107(.A0
+       (csa_tree_add1_add_30_16_groupi_n_204), .A1
+       (csa_tree_add1_add_30_16_groupi_n_344), .B0
+       (csa_tree_add1_add_30_16_groupi_n_256), .B1
+       (csa_tree_add1_add_30_16_groupi_n_275), .Y
+       (csa_tree_add1_add_30_16_groupi_n_401));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8783__6260(.A0
+       (csa_tree_add1_add_30_16_groupi_n_303), .A1
+       (csa_tree_add1_add_30_16_groupi_n_341), .B0
+       (csa_tree_add1_add_30_16_groupi_n_263), .B1
+       (csa_tree_add1_add_30_16_groupi_n_132), .Y
+       (csa_tree_add1_add_30_16_groupi_n_400));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8784__4319(.A0
+       (csa_tree_add1_add_30_16_groupi_n_269), .A1
+       (csa_tree_add1_add_30_16_groupi_n_346), .B0
+       (csa_tree_add1_add_30_16_groupi_n_254), .B1
+       (csa_tree_add1_add_30_16_groupi_n_294), .Y
+       (csa_tree_add1_add_30_16_groupi_n_399));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8785__8428(.A0
+       (csa_tree_add1_add_30_16_groupi_n_280), .A1
+       (csa_tree_add1_add_30_16_groupi_n_353), .B0
+       (csa_tree_add1_add_30_16_groupi_n_258), .B1
+       (csa_tree_add1_add_30_16_groupi_n_291), .Y
+       (csa_tree_add1_add_30_16_groupi_n_398));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8786__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_276), .A1
+       (csa_tree_add1_add_30_16_groupi_n_343), .B0
+       (csa_tree_add1_add_30_16_groupi_n_255), .B1
+       (csa_tree_add1_add_30_16_groupi_n_283), .Y
+       (csa_tree_add1_add_30_16_groupi_n_397));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8787__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_312), .A1
+       (csa_tree_add1_add_30_16_groupi_n_342), .B0
+       (csa_tree_add1_add_30_16_groupi_n_264), .B1
+       (csa_tree_add1_add_30_16_groupi_n_304), .Y
+       (csa_tree_add1_add_30_16_groupi_n_396));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8788__3680(.A0
+       (csa_tree_add1_add_30_16_groupi_n_161), .A1
+       (csa_tree_add1_add_30_16_groupi_n_340), .B0
+       (csa_tree_add1_add_30_16_groupi_n_252), .B1
+       (csa_tree_add1_add_30_16_groupi_n_139), .Y
+       (csa_tree_add1_add_30_16_groupi_n_395));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8789__1617(.A0
+       (csa_tree_add1_add_30_16_groupi_n_306), .A1
+       (csa_tree_add1_add_30_16_groupi_n_348), .B0
+       (csa_tree_add1_add_30_16_groupi_n_259), .B1
+       (csa_tree_add1_add_30_16_groupi_n_153), .Y
+       (csa_tree_add1_add_30_16_groupi_n_394));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8790__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_172), .A1
+       (csa_tree_add1_add_30_16_groupi_n_342), .B0
+       (csa_tree_add1_add_30_16_groupi_n_264), .B1
+       (csa_tree_add1_add_30_16_groupi_n_205), .Y
+       (csa_tree_add1_add_30_16_groupi_n_392));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8791__1705(.A0
+       (csa_tree_add1_add_30_16_groupi_n_123), .A1
+       (csa_tree_add1_add_30_16_groupi_n_346), .B0
+       (csa_tree_add1_add_30_16_groupi_n_254), .B1
+       (csa_tree_add1_add_30_16_groupi_n_299), .Y
+       (csa_tree_add1_add_30_16_groupi_n_391));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8792__5122(.A0
+       (csa_tree_add1_add_30_16_groupi_n_192), .A1
+       (csa_tree_add1_add_30_16_groupi_n_352), .B0
+       (csa_tree_add1_add_30_16_groupi_n_257), .B1
+       (csa_tree_add1_add_30_16_groupi_n_307), .Y
+       (csa_tree_add1_add_30_16_groupi_n_390));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8793__8246(.A0
+       (csa_tree_add1_add_30_16_groupi_n_160), .A1
+       (csa_tree_add1_add_30_16_groupi_n_347), .B0
+       (csa_tree_add1_add_30_16_groupi_n_260), .B1
+       (csa_tree_add1_add_30_16_groupi_n_285), .Y
+       (csa_tree_add1_add_30_16_groupi_n_389));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8794__7098(.A0
+       (csa_tree_add1_add_30_16_groupi_n_182), .A1
+       (csa_tree_add1_add_30_16_groupi_n_352), .B0
+       (csa_tree_add1_add_30_16_groupi_n_257), .B1
+       (csa_tree_add1_add_30_16_groupi_n_199), .Y
+       (csa_tree_add1_add_30_16_groupi_n_388));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8795__6131(.A0
+       (csa_tree_add1_add_30_16_groupi_n_128), .A1
+       (csa_tree_add1_add_30_16_groupi_n_344), .B0
+       (csa_tree_add1_add_30_16_groupi_n_256), .B1
+       (csa_tree_add1_add_30_16_groupi_n_168), .Y
+       (csa_tree_add1_add_30_16_groupi_n_387));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g8796(.A
+       (csa_tree_add1_add_30_16_groupi_n_382), .Y
+       (csa_tree_add1_add_30_16_groupi_n_383));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8797__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_354), .B (sum_q[10]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_381));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8798__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_358), .B (sum_q[2]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_380));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8799__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_356), .B (sum_q[12]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_379));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8800__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_56), .B
+       (csa_tree_add1_add_30_16_groupi_n_359), .Y
+       (csa_tree_add1_add_30_16_groupi_n_378));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8801__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_355), .B (sum_q[14]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_377));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8802__9315(.A0
+       (csa_tree_add1_add_30_16_groupi_n_109), .A1
+       (csa_tree_add1_add_30_16_groupi_n_243), .B0 (b[15]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_382));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g8803(.A
+       (csa_tree_add1_add_30_16_groupi_n_374), .Y
+       (csa_tree_add1_add_30_16_groupi_n_375));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g8804(.A
+       (csa_tree_add1_add_30_16_groupi_n_372), .Y
+       (csa_tree_add1_add_30_16_groupi_n_373));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g8805(.A
+       (csa_tree_add1_add_30_16_groupi_n_369), .Y
+       (csa_tree_add1_add_30_16_groupi_n_370));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g8806(.A
+       (csa_tree_add1_add_30_16_groupi_n_367), .Y
+       (csa_tree_add1_add_30_16_groupi_n_368));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g8807(.A
+       (csa_tree_add1_add_30_16_groupi_n_365), .Y
+       (csa_tree_add1_add_30_16_groupi_n_366));
+  sky130_osu_sc_18T_ms__xnor2_l
+       csa_tree_add1_add_30_16_groupi_g8808__9945(.A (sum_q[1]), .B
+       (csa_tree_add1_add_30_16_groupi_n_266), .Y
+       (csa_tree_add1_add_30_16_groupi_n_376));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8809__2883(.A0
+       (csa_tree_add1_add_30_16_groupi_n_106), .A1
+       (csa_tree_add1_add_30_16_groupi_n_244), .B0 (n_4), .Y
+       (csa_tree_add1_add_30_16_groupi_n_374));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8810__2346(.A0
+       (csa_tree_add1_add_30_16_groupi_n_107), .A1
+       (csa_tree_add1_add_30_16_groupi_n_246), .B0 (n_5), .Y
+       (csa_tree_add1_add_30_16_groupi_n_372));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8811__1666(.A0
+       (csa_tree_add1_add_30_16_groupi_n_111), .A1
+       (csa_tree_add1_add_30_16_groupi_n_241), .B0 (n_7), .Y
+       (csa_tree_add1_add_30_16_groupi_n_371));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8812__7410(.A0
+       (csa_tree_add1_add_30_16_groupi_n_110), .A1
+       (csa_tree_add1_add_30_16_groupi_n_242), .B0 (n_6), .Y
+       (csa_tree_add1_add_30_16_groupi_n_369));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8813__6417(.A0
+       (csa_tree_add1_add_30_16_groupi_n_112), .A1
+       (csa_tree_add1_add_30_16_groupi_n_240), .B0 (n_10), .Y
+       (csa_tree_add1_add_30_16_groupi_n_367));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8814__5477(.A0
+       (csa_tree_add1_add_30_16_groupi_n_108), .A1
+       (csa_tree_add1_add_30_16_groupi_n_245), .B0 (n_11), .Y
+       (csa_tree_add1_add_30_16_groupi_n_365));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8815(.A
+       (csa_tree_add1_add_30_16_groupi_n_363), .Y
+       (csa_tree_add1_add_30_16_groupi_n_362));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8816(.A
+       (csa_tree_add1_add_30_16_groupi_n_361), .Y
+       (csa_tree_add1_add_30_16_groupi_n_360));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8817(.A
+       (csa_tree_add1_add_30_16_groupi_n_357), .Y
+       (csa_tree_add1_add_30_16_groupi_n_358));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8818(.A
+       (csa_tree_add1_add_30_16_groupi_n_353), .Y
+       (csa_tree_add1_add_30_16_groupi_n_352));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8819(.A
+       (csa_tree_add1_add_30_16_groupi_n_351), .Y
+       (csa_tree_add1_add_30_16_groupi_n_350));
+  sky130_osu_sc_18T_ms__and2_1
+       csa_tree_add1_add_30_16_groupi_g8820__2398(.A (sum_q[1]), .B
+       (csa_tree_add1_add_30_16_groupi_n_266), .Y
+       (csa_tree_add1_add_30_16_groupi_n_364));
+  sky130_osu_sc_18T_ms__nand2_1
+       csa_tree_add1_add_30_16_groupi_g8821__5107(.A (a[0]), .B
+       (csa_tree_add1_add_30_16_groupi_n_264), .Y
+       (csa_tree_add1_add_30_16_groupi_n_363));
+  sky130_osu_sc_18T_ms__nand2_1
+       csa_tree_add1_add_30_16_groupi_g8822__6260(.A (a[0]), .B
+       (csa_tree_add1_add_30_16_groupi_n_258), .Y
+       (csa_tree_add1_add_30_16_groupi_n_361));
+  sky130_osu_sc_18T_ms__nand2_1
+       csa_tree_add1_add_30_16_groupi_g8823__4319(.A (a[0]), .B
+       (csa_tree_add1_add_30_16_groupi_n_253), .Y
+       (csa_tree_add1_add_30_16_groupi_n_359));
+  sky130_osu_sc_18T_ms__nand2_l
+       csa_tree_add1_add_30_16_groupi_g8824__8428(.A
+       (csa_tree_add1_add_30_16_groupi_n_260), .B (a[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_357));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8825__5526(.A
+       (csa_tree_add1_add_30_16_groupi_n_64), .B
+       (csa_tree_add1_add_30_16_groupi_n_256), .Y
+       (csa_tree_add1_add_30_16_groupi_n_356));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8826__6783(.A
+       (csa_tree_add1_add_30_16_groupi_n_64), .B
+       (csa_tree_add1_add_30_16_groupi_n_262), .Y
+       (csa_tree_add1_add_30_16_groupi_n_355));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8827__3680(.A
+       (csa_tree_add1_add_30_16_groupi_n_64), .B
+       (csa_tree_add1_add_30_16_groupi_n_251), .Y
+       (csa_tree_add1_add_30_16_groupi_n_354));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8828__1617(.A
+       (csa_tree_add1_add_30_16_groupi_n_237), .B
+       (csa_tree_add1_add_30_16_groupi_n_258), .Y
+       (csa_tree_add1_add_30_16_groupi_n_353));
+  sky130_osu_sc_18T_ms__and2_1
+       csa_tree_add1_add_30_16_groupi_g8829__2802(.A
+       (csa_tree_add1_add_30_16_groupi_n_121), .B
+       (csa_tree_add1_add_30_16_groupi_n_66), .Y
+       (csa_tree_add1_add_30_16_groupi_n_351));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8830(.A
+       (csa_tree_add1_add_30_16_groupi_n_336), .Y (sum[0]));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8831(.A
+       (csa_tree_add1_add_30_16_groupi_n_348), .Y
+       (csa_tree_add1_add_30_16_groupi_n_347));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8832(.A
+       (csa_tree_add1_add_30_16_groupi_n_346), .Y
+       (csa_tree_add1_add_30_16_groupi_n_345));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8833(.A
+       (csa_tree_add1_add_30_16_groupi_n_344), .Y
+       (csa_tree_add1_add_30_16_groupi_n_343));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8834(.A
+       (csa_tree_add1_add_30_16_groupi_n_342), .Y
+       (csa_tree_add1_add_30_16_groupi_n_341));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8835(.A
+       (csa_tree_add1_add_30_16_groupi_n_340), .Y
+       (csa_tree_add1_add_30_16_groupi_n_339));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8836(.A
+       (csa_tree_add1_add_30_16_groupi_n_338), .Y
+       (csa_tree_add1_add_30_16_groupi_n_337));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8837__1705(.A0
+       (csa_tree_add1_add_30_16_groupi_n_103), .A1 (sum_q[0]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_265), .Y
+       (csa_tree_add1_add_30_16_groupi_n_336));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8838__5122(.A0
+       (csa_tree_add1_add_30_16_groupi_n_91), .A1 (sum_q[28]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_57), .B1
+       (csa_tree_add1_add_30_16_groupi_n_90), .Y
+       (csa_tree_add1_add_30_16_groupi_n_335));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8839__8246(.A (sum_q[16]), .B
+       (csa_tree_add1_add_30_16_groupi_n_87), .Y
+       (csa_tree_add1_add_30_16_groupi_n_334));
+  sky130_osu_sc_18T_ms__xor2_l
+       csa_tree_add1_add_30_16_groupi_g8840__7098(.A (sum_q[30]), .B
+       (csa_tree_add1_add_30_16_groupi_n_120), .Y
+       (csa_tree_add1_add_30_16_groupi_n_333));
+  sky130_osu_sc_18T_ms__mux2_1
+       csa_tree_add1_add_30_16_groupi_g8841__6131(.A0
+       (csa_tree_add1_add_30_16_groupi_n_34), .A1
+       (csa_tree_add1_add_30_16_groupi_n_33), .S0
+       (csa_tree_add1_add_30_16_groupi_n_102), .Y
+       (csa_tree_add1_add_30_16_groupi_n_332));
+  sky130_osu_sc_18T_ms__or2_1
+       csa_tree_add1_add_30_16_groupi_g8842__1881(.A
+       (csa_tree_add1_add_30_16_groupi_n_234), .B
+       (csa_tree_add1_add_30_16_groupi_n_260), .Y
+       (csa_tree_add1_add_30_16_groupi_n_348));
+  sky130_osu_sc_18T_ms__nand2_1
+       csa_tree_add1_add_30_16_groupi_g8843__5115(.A
+       (csa_tree_add1_add_30_16_groupi_n_233), .B
+       (csa_tree_add1_add_30_16_groupi_n_254), .Y
+       (csa_tree_add1_add_30_16_groupi_n_346));
+  sky130_osu_sc_18T_ms__nand2_1
+       csa_tree_add1_add_30_16_groupi_g8844__7482(.A
+       (csa_tree_add1_add_30_16_groupi_n_235), .B
+       (csa_tree_add1_add_30_16_groupi_n_256), .Y
+       (csa_tree_add1_add_30_16_groupi_n_344));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8845__4733(.A
+       (csa_tree_add1_add_30_16_groupi_n_238), .B
+       (csa_tree_add1_add_30_16_groupi_n_264), .Y
+       (csa_tree_add1_add_30_16_groupi_n_342));
+  sky130_osu_sc_18T_ms__nor2_1
+       csa_tree_add1_add_30_16_groupi_g8846__6161(.A
+       (csa_tree_add1_add_30_16_groupi_n_236), .B
+       (csa_tree_add1_add_30_16_groupi_n_252), .Y
+       (csa_tree_add1_add_30_16_groupi_n_340));
+  sky130_osu_sc_18T_ms__nand2_1
+       csa_tree_add1_add_30_16_groupi_g8847__9315(.A
+       (csa_tree_add1_add_30_16_groupi_n_231), .B
+       (csa_tree_add1_add_30_16_groupi_n_262), .Y
+       (csa_tree_add1_add_30_16_groupi_n_338));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8848(.A
+       (csa_tree_add1_add_30_16_groupi_n_323), .Y
+       (csa_tree_add1_add_30_16_groupi_n_324));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8849(.A
+       (csa_tree_add1_add_30_16_groupi_n_313), .Y
+       (csa_tree_add1_add_30_16_groupi_n_314));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8850(.A
+       (csa_tree_add1_add_30_16_groupi_n_311), .Y
+       (csa_tree_add1_add_30_16_groupi_n_312));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8851(.A
+       (csa_tree_add1_add_30_16_groupi_n_309), .Y
+       (csa_tree_add1_add_30_16_groupi_n_310));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8852(.A
+       (csa_tree_add1_add_30_16_groupi_n_307), .Y
+       (csa_tree_add1_add_30_16_groupi_n_308));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8853(.A
+       (csa_tree_add1_add_30_16_groupi_n_303), .Y
+       (csa_tree_add1_add_30_16_groupi_n_304));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8854(.A
+       (csa_tree_add1_add_30_16_groupi_n_301), .Y
+       (csa_tree_add1_add_30_16_groupi_n_302));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8855(.A
+       (csa_tree_add1_add_30_16_groupi_n_292), .Y
+       (csa_tree_add1_add_30_16_groupi_n_293));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8856(.A
+       (csa_tree_add1_add_30_16_groupi_n_289), .Y
+       (csa_tree_add1_add_30_16_groupi_n_290));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8857(.A
+       (csa_tree_add1_add_30_16_groupi_n_287), .Y
+       (csa_tree_add1_add_30_16_groupi_n_288));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8858(.A
+       (csa_tree_add1_add_30_16_groupi_n_285), .Y
+       (csa_tree_add1_add_30_16_groupi_n_286));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8859(.A
+       (csa_tree_add1_add_30_16_groupi_n_283), .Y
+       (csa_tree_add1_add_30_16_groupi_n_284));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8860(.A
+       (csa_tree_add1_add_30_16_groupi_n_278), .Y
+       (csa_tree_add1_add_30_16_groupi_n_279));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8861(.A
+       (csa_tree_add1_add_30_16_groupi_n_275), .Y
+       (csa_tree_add1_add_30_16_groupi_n_276));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8862(.A
+       (csa_tree_add1_add_30_16_groupi_n_271), .Y
+       (csa_tree_add1_add_30_16_groupi_n_272));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8863(.A
+       (csa_tree_add1_add_30_16_groupi_n_267), .Y
+       (csa_tree_add1_add_30_16_groupi_n_268));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8864(.A
+       (csa_tree_add1_add_30_16_groupi_n_1), .Y
+       (csa_tree_add1_add_30_16_groupi_n_265));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8865(.A
+       (csa_tree_add1_add_30_16_groupi_n_264), .Y
+       (csa_tree_add1_add_30_16_groupi_n_263));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8866(.A
+       (csa_tree_add1_add_30_16_groupi_n_262), .Y
+       (csa_tree_add1_add_30_16_groupi_n_261));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8867(.A
+       (csa_tree_add1_add_30_16_groupi_n_260), .Y
+       (csa_tree_add1_add_30_16_groupi_n_259));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8868(.A
+       (csa_tree_add1_add_30_16_groupi_n_258), .Y
+       (csa_tree_add1_add_30_16_groupi_n_257));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8869(.A
+       (csa_tree_add1_add_30_16_groupi_n_256), .Y
+       (csa_tree_add1_add_30_16_groupi_n_255));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8870(.A
+       (csa_tree_add1_add_30_16_groupi_n_254), .Y
+       (csa_tree_add1_add_30_16_groupi_n_253));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8871(.A
+       (csa_tree_add1_add_30_16_groupi_n_252), .Y
+       (csa_tree_add1_add_30_16_groupi_n_251));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8872__9945(.A
+       (csa_tree_add1_add_30_16_groupi_n_87), .B (sum_q[16]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_250));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8873__2883(.A
+       (csa_tree_add1_add_30_16_groupi_n_38), .B
+       (csa_tree_add1_add_30_16_groupi_n_85), .Y
+       (csa_tree_add1_add_30_16_groupi_n_249));
+  sky130_osu_sc_18T_ms__and2_l
+       csa_tree_add1_add_30_16_groupi_g8874__2346(.A
+       (csa_tree_add1_add_30_16_groupi_n_34), .B
+       (csa_tree_add1_add_30_16_groupi_n_102), .Y
+       (csa_tree_add1_add_30_16_groupi_n_248));
+  sky130_osu_sc_18T_ms__nor2_l
+       csa_tree_add1_add_30_16_groupi_g8875__1666(.A
+       (csa_tree_add1_add_30_16_groupi_n_120), .B (sum_q[30]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_247));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8876__7410(.A0 (b[12]), .A1
+       (a[0]), .B0 (n_6), .Y (csa_tree_add1_add_30_16_groupi_n_246));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8877__6417(.A0 (b[8]), .A1
+       (a[0]), .B0 (n_10), .Y (csa_tree_add1_add_30_16_groupi_n_245));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8878__5477(.A0 (b[2]), .A1
+       (a[0]), .B0 (csa_tree_add1_add_30_16_groupi_n_121), .Y
+       (csa_tree_add1_add_30_16_groupi_n_244));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8879__2398(.A0 (b[14]), .A1
+       (a[0]), .B0 (n_5), .Y (csa_tree_add1_add_30_16_groupi_n_243));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8880__5107(.A0 (b[10]), .A1
+       (a[0]), .B0 (n_11), .Y (csa_tree_add1_add_30_16_groupi_n_242));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8881__6260(.A0 (b[4]), .A1
+       (a[0]), .B0 (n_4), .Y (csa_tree_add1_add_30_16_groupi_n_241));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g8882__4319(.A0 (b[6]), .A1
+       (a[0]), .B0 (n_7), .Y (csa_tree_add1_add_30_16_groupi_n_240));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8883__8428(.A0 (b[15]), .A1
+       (a[0]), .B0 (csa_tree_add1_add_30_16_groupi_n_86), .Y
+       (csa_tree_add1_add_30_16_groupi_n_239));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8884__5526(.A0
+       (csa_tree_add1_add_30_16_groupi_n_55), .A1 (n_11), .B0 (b[8]),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_44), .Y
+       (csa_tree_add1_add_30_16_groupi_n_238));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8885__6783(.A0
+       (csa_tree_add1_add_30_16_groupi_n_81), .A1 (n_10), .B0 (b[6]),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_60), .Y
+       (csa_tree_add1_add_30_16_groupi_n_237));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8886__3680(.A0
+       (csa_tree_add1_add_30_16_groupi_n_82), .A1 (n_6), .B0 (b[10]),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_43), .Y
+       (csa_tree_add1_add_30_16_groupi_n_236));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8887__1617(.A0
+       (csa_tree_add1_add_30_16_groupi_n_62), .A1 (b[12]), .B0 (n_5),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_54), .Y
+       (csa_tree_add1_add_30_16_groupi_n_235));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8888__2802(.A0
+       (csa_tree_add1_add_30_16_groupi_n_39), .A1 (n_4), .B0 (b[2]),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_61), .Y
+       (csa_tree_add1_add_30_16_groupi_n_234));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8889__1705(.A0
+       (csa_tree_add1_add_30_16_groupi_n_63), .A1 (b[4]), .B0 (n_7),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_79), .Y
+       (csa_tree_add1_add_30_16_groupi_n_233));
+  sky130_osu_sc_18T_ms__or2_l
+       csa_tree_add1_add_30_16_groupi_g8890__5122(.A
+       (csa_tree_add1_add_30_16_groupi_n_100), .B (sum_q[29]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_232));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8891__8246(.A0
+       (csa_tree_add1_add_30_16_groupi_n_65), .A1 (b[14]), .B0 (b[15]),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_80), .Y
+       (csa_tree_add1_add_30_16_groupi_n_231));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8892__7098(.A0 (b[15]), .A1
+       (a[2]), .B0 (csa_tree_add1_add_30_16_groupi_n_89), .Y
+       (csa_tree_add1_add_30_16_groupi_n_331));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8893__6131(.A0 (a[6]), .A1
+       (b[15]), .B0 (csa_tree_add1_add_30_16_groupi_n_118), .Y
+       (csa_tree_add1_add_30_16_groupi_n_330));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8894__1881(.A0 (a[14]), .A1
+       (b[15]), .B0 (csa_tree_add1_add_30_16_groupi_n_119), .Y
+       (csa_tree_add1_add_30_16_groupi_n_329));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8895__5115(.A0 (a[13]), .A1
+       (b[15]), .B0 (csa_tree_add1_add_30_16_groupi_n_101), .Y
+       (csa_tree_add1_add_30_16_groupi_n_328));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8896__7482(.A0 (a[12]), .A1
+       (b[15]), .B0 (csa_tree_add1_add_30_16_groupi_n_91), .Y
+       (csa_tree_add1_add_30_16_groupi_n_327));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8897__4733(.A0 (b[15]), .A1
+       (a[1]), .B0 (csa_tree_add1_add_30_16_groupi_n_98), .Y
+       (csa_tree_add1_add_30_16_groupi_n_326));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8898__6161(.A0 (a[11]), .A1
+       (b[15]), .B0 (csa_tree_add1_add_30_16_groupi_n_116), .Y
+       (csa_tree_add1_add_30_16_groupi_n_325));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8899(.A0
+       (csa_tree_add1_add_30_16_groupi_n_48), .A1 (n_11), .B0
+       (csa_tree_add1_add_30_16_groupi_n_44), .B1 (a[10]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_323));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8900(.A0 (a[15]), .A1 (b[15]),
+       .B0 (csa_tree_add1_add_30_16_groupi_n_104), .Y
+       (csa_tree_add1_add_30_16_groupi_n_322));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8901(.A0 (a[8]), .A1 (b[15]),
+       .B0 (csa_tree_add1_add_30_16_groupi_n_85), .Y
+       (csa_tree_add1_add_30_16_groupi_n_321));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8902(.A0 (a[7]), .A1 (b[15]),
+       .B0 (csa_tree_add1_add_30_16_groupi_n_102), .Y
+       (csa_tree_add1_add_30_16_groupi_n_320));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8903(.A0 (b[15]), .A1 (a[4]),
+       .B0 (csa_tree_add1_add_30_16_groupi_n_92), .Y
+       (csa_tree_add1_add_30_16_groupi_n_319));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8904(.A0 (a[10]), .A1 (b[15]),
+       .B0 (csa_tree_add1_add_30_16_groupi_n_96), .Y
+       (csa_tree_add1_add_30_16_groupi_n_318));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8905(.A0 (a[5]), .A1 (b[15]),
+       .B0 (csa_tree_add1_add_30_16_groupi_n_97), .Y
+       (csa_tree_add1_add_30_16_groupi_n_317));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8906(.A0 (a[9]), .A1 (b[15]),
+       .B0 (csa_tree_add1_add_30_16_groupi_n_114), .Y
+       (csa_tree_add1_add_30_16_groupi_n_316));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g8907(.A0 (b[15]), .A1 (a[3]),
+       .B0 (csa_tree_add1_add_30_16_groupi_n_93), .Y
+       (csa_tree_add1_add_30_16_groupi_n_315));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8908(.A0 (a[6]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_42), .B0
+       (csa_tree_add1_add_30_16_groupi_n_121), .B1
+       (csa_tree_add1_add_30_16_groupi_n_49), .Y
+       (csa_tree_add1_add_30_16_groupi_n_313));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8909(.A0 (a[7]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_44), .B0 (n_11), .B1
+       (csa_tree_add1_add_30_16_groupi_n_68), .Y
+       (csa_tree_add1_add_30_16_groupi_n_311));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8910(.A0
+       (csa_tree_add1_add_30_16_groupi_n_47), .A1 (n_6), .B0 (a[2]),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_43), .Y
+       (csa_tree_add1_add_30_16_groupi_n_309));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8911(.A0 (a[12]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_60), .B0 (n_10), .B1
+       (csa_tree_add1_add_30_16_groupi_n_45), .Y
+       (csa_tree_add1_add_30_16_groupi_n_307));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8912(.A0
+       (csa_tree_add1_add_30_16_groupi_n_61), .A1 (a[1]), .B0 (n_4),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_70), .Y
+       (csa_tree_add1_add_30_16_groupi_n_306));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8913(.A0
+       (csa_tree_add1_add_30_16_groupi_n_69), .A1 (n_6), .B0
+       (csa_tree_add1_add_30_16_groupi_n_43), .B1 (a[14]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_305));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8914(.A0 (a[8]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_44), .B0 (n_11), .B1
+       (csa_tree_add1_add_30_16_groupi_n_74), .Y
+       (csa_tree_add1_add_30_16_groupi_n_303));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8915(.A0 (a[13]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_43), .B0 (n_6), .B1
+       (csa_tree_add1_add_30_16_groupi_n_46), .Y
+       (csa_tree_add1_add_30_16_groupi_n_301));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8916(.A0 (n_10), .A1
+       (csa_tree_add1_add_30_16_groupi_n_70), .B0 (a[1]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_60), .Y
+       (csa_tree_add1_add_30_16_groupi_n_300));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8917(.A0
+       (csa_tree_add1_add_30_16_groupi_n_63), .A1 (a[1]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_70), .B1 (n_7), .Y
+       (csa_tree_add1_add_30_16_groupi_n_299));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8918(.A0
+       (csa_tree_add1_add_30_16_groupi_n_50), .A1 (n_10), .B0
+       (csa_tree_add1_add_30_16_groupi_n_60), .B1 (a[15]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_298));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8919(.A0
+       (csa_tree_add1_add_30_16_groupi_n_71), .A1 (n_11), .B0
+       (csa_tree_add1_add_30_16_groupi_n_44), .B1 (a[4]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_297));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8920(.A0
+       (csa_tree_add1_add_30_16_groupi_n_48), .A1 (n_6), .B0
+       (csa_tree_add1_add_30_16_groupi_n_43), .B1 (a[10]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_296));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8921(.A0 (a[11]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_42), .B0
+       (csa_tree_add1_add_30_16_groupi_n_121), .B1
+       (csa_tree_add1_add_30_16_groupi_n_73), .Y
+       (csa_tree_add1_add_30_16_groupi_n_295));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8922(.A0 (a[10]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_63), .B0 (n_7), .B1
+       (csa_tree_add1_add_30_16_groupi_n_48), .Y
+       (csa_tree_add1_add_30_16_groupi_n_294));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8923(.A0
+       (csa_tree_add1_add_30_16_groupi_n_74), .A1 (n_5), .B0
+       (csa_tree_add1_add_30_16_groupi_n_62), .B1 (a[8]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_292));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8924(.A0
+       (csa_tree_add1_add_30_16_groupi_n_75), .A1 (n_10), .B0
+       (csa_tree_add1_add_30_16_groupi_n_60), .B1 (a[9]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_291));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8925(.A0
+       (csa_tree_add1_add_30_16_groupi_n_71), .A1 (n_7), .B0
+       (csa_tree_add1_add_30_16_groupi_n_63), .B1 (a[4]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_289));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8926(.A0 (a[7]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_43), .B0 (n_6), .B1
+       (csa_tree_add1_add_30_16_groupi_n_68), .Y
+       (csa_tree_add1_add_30_16_groupi_n_287));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8927(.A0
+       (csa_tree_add1_add_30_16_groupi_n_49), .A1 (n_4), .B0
+       (csa_tree_add1_add_30_16_groupi_n_61), .B1 (a[6]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_285));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8928(.A0
+       (csa_tree_add1_add_30_16_groupi_n_45), .A1 (n_5), .B0
+       (csa_tree_add1_add_30_16_groupi_n_62), .B1 (a[12]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_283));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8929(.A0
+       (csa_tree_add1_add_30_16_groupi_n_43), .A1 (a[1]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_70), .B1 (n_6), .Y
+       (csa_tree_add1_add_30_16_groupi_n_282));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8930(.A0 (a[13]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_62), .B0 (n_5), .B1
+       (csa_tree_add1_add_30_16_groupi_n_46), .Y
+       (csa_tree_add1_add_30_16_groupi_n_281));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8931(.A0
+       (csa_tree_add1_add_30_16_groupi_n_74), .A1 (n_10), .B0
+       (csa_tree_add1_add_30_16_groupi_n_60), .B1 (a[8]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_280));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8932(.A0 (a[9]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_43), .B0 (n_6), .B1
+       (csa_tree_add1_add_30_16_groupi_n_75), .Y
+       (csa_tree_add1_add_30_16_groupi_n_278));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8933(.A0 (a[14]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_62), .B0 (n_5), .B1
+       (csa_tree_add1_add_30_16_groupi_n_69), .Y
+       (csa_tree_add1_add_30_16_groupi_n_277));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8934(.A0 (a[11]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_62), .B0 (n_5), .B1
+       (csa_tree_add1_add_30_16_groupi_n_73), .Y
+       (csa_tree_add1_add_30_16_groupi_n_275));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8935(.A0
+       (csa_tree_add1_add_30_16_groupi_n_50), .A1 (n_6), .B0
+       (csa_tree_add1_add_30_16_groupi_n_43), .B1 (a[15]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_274));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8936(.A0
+       (csa_tree_add1_add_30_16_groupi_n_47), .A1 (n_10), .B0 (a[2]),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_60), .Y
+       (csa_tree_add1_add_30_16_groupi_n_273));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8937(.A0 (a[13]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_42), .B0
+       (csa_tree_add1_add_30_16_groupi_n_121), .B1
+       (csa_tree_add1_add_30_16_groupi_n_46), .Y
+       (csa_tree_add1_add_30_16_groupi_n_271));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8938(.A0 (a[14]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_44), .B0 (n_11), .B1
+       (csa_tree_add1_add_30_16_groupi_n_69), .Y
+       (csa_tree_add1_add_30_16_groupi_n_270));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8939(.A0 (a[9]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_63), .B0 (n_7), .B1
+       (csa_tree_add1_add_30_16_groupi_n_75), .Y
+       (csa_tree_add1_add_30_16_groupi_n_269));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8940(.A0
+       (csa_tree_add1_add_30_16_groupi_n_69), .A1 (n_4), .B0
+       (csa_tree_add1_add_30_16_groupi_n_61), .B1 (a[14]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_267));
+  sky130_osu_sc_18T_ms__nor2_1 csa_tree_add1_add_30_16_groupi_g8941(.A
+       (csa_tree_add1_add_30_16_groupi_n_42), .B
+       (csa_tree_add1_add_30_16_groupi_n_103), .Y
+       (csa_tree_add1_add_30_16_groupi_n_266));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8943(.A0
+       (csa_tree_add1_add_30_16_groupi_n_55), .A1 (n_10), .B0
+       (csa_tree_add1_add_30_16_groupi_n_60), .B1 (b[8]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_264));
+  sky130_osu_sc_18T_ms__mux2_1 csa_tree_add1_add_30_16_groupi_g8944(.A0
+       (csa_tree_add1_add_30_16_groupi_n_62), .A1 (n_5), .S0 (b[14]),
+       .Y (csa_tree_add1_add_30_16_groupi_n_262));
+  sky130_osu_sc_18T_ms__or2_1 csa_tree_add1_add_30_16_groupi_g8945(.A
+       (csa_tree_add1_add_30_16_groupi_n_113), .B
+       (csa_tree_add1_add_30_16_groupi_n_105), .Y
+       (csa_tree_add1_add_30_16_groupi_n_260));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8946(.A0
+       (csa_tree_add1_add_30_16_groupi_n_81), .A1 (n_7), .B0
+       (csa_tree_add1_add_30_16_groupi_n_63), .B1 (b[6]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_258));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8947(.A0 (b[12]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_43), .B0 (n_6), .B1
+       (csa_tree_add1_add_30_16_groupi_n_54), .Y
+       (csa_tree_add1_add_30_16_groupi_n_256));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8948(.A0 (b[4]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_61), .B0 (n_4), .B1
+       (csa_tree_add1_add_30_16_groupi_n_79), .Y
+       (csa_tree_add1_add_30_16_groupi_n_254));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8949(.A0
+       (csa_tree_add1_add_30_16_groupi_n_82), .A1 (n_11), .B0
+       (csa_tree_add1_add_30_16_groupi_n_44), .B1 (b[10]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_252));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8950(.A
+       (csa_tree_add1_add_30_16_groupi_n_229), .Y
+       (csa_tree_add1_add_30_16_groupi_n_230));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8951(.A
+       (csa_tree_add1_add_30_16_groupi_n_227), .Y
+       (csa_tree_add1_add_30_16_groupi_n_228));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8952(.A
+       (csa_tree_add1_add_30_16_groupi_n_225), .Y
+       (csa_tree_add1_add_30_16_groupi_n_226));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8953(.A
+       (csa_tree_add1_add_30_16_groupi_n_217), .Y
+       (csa_tree_add1_add_30_16_groupi_n_218));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8954(.A
+       (csa_tree_add1_add_30_16_groupi_n_215), .Y
+       (csa_tree_add1_add_30_16_groupi_n_216));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8955(.A
+       (csa_tree_add1_add_30_16_groupi_n_212), .Y
+       (csa_tree_add1_add_30_16_groupi_n_213));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8956(.A
+       (csa_tree_add1_add_30_16_groupi_n_210), .Y
+       (csa_tree_add1_add_30_16_groupi_n_211));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8957(.A
+       (csa_tree_add1_add_30_16_groupi_n_207), .Y
+       (csa_tree_add1_add_30_16_groupi_n_208));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8958(.A
+       (csa_tree_add1_add_30_16_groupi_n_205), .Y
+       (csa_tree_add1_add_30_16_groupi_n_206));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8959(.A
+       (csa_tree_add1_add_30_16_groupi_n_201), .Y
+       (csa_tree_add1_add_30_16_groupi_n_202));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8960(.A
+       (csa_tree_add1_add_30_16_groupi_n_197), .Y
+       (csa_tree_add1_add_30_16_groupi_n_198));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8961(.A
+       (csa_tree_add1_add_30_16_groupi_n_194), .Y
+       (csa_tree_add1_add_30_16_groupi_n_195));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8962(.A
+       (csa_tree_add1_add_30_16_groupi_n_188), .Y
+       (csa_tree_add1_add_30_16_groupi_n_189));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8963(.A
+       (csa_tree_add1_add_30_16_groupi_n_186), .Y
+       (csa_tree_add1_add_30_16_groupi_n_187));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8964(.A
+       (csa_tree_add1_add_30_16_groupi_n_184), .Y
+       (csa_tree_add1_add_30_16_groupi_n_185));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8965(.A
+       (csa_tree_add1_add_30_16_groupi_n_181), .Y
+       (csa_tree_add1_add_30_16_groupi_n_182));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8966(.A
+       (csa_tree_add1_add_30_16_groupi_n_179), .Y
+       (csa_tree_add1_add_30_16_groupi_n_180));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8967(.A
+       (csa_tree_add1_add_30_16_groupi_n_177), .Y
+       (csa_tree_add1_add_30_16_groupi_n_178));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8968(.A
+       (csa_tree_add1_add_30_16_groupi_n_173), .Y
+       (csa_tree_add1_add_30_16_groupi_n_174));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8969(.A
+       (csa_tree_add1_add_30_16_groupi_n_170), .Y
+       (csa_tree_add1_add_30_16_groupi_n_171));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8970(.A
+       (csa_tree_add1_add_30_16_groupi_n_166), .Y
+       (csa_tree_add1_add_30_16_groupi_n_167));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8971(.A
+       (csa_tree_add1_add_30_16_groupi_n_163), .Y
+       (csa_tree_add1_add_30_16_groupi_n_164));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8972(.A
+       (csa_tree_add1_add_30_16_groupi_n_159), .Y
+       (csa_tree_add1_add_30_16_groupi_n_160));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8973(.A
+       (csa_tree_add1_add_30_16_groupi_n_157), .Y
+       (csa_tree_add1_add_30_16_groupi_n_158));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8974(.A
+       (csa_tree_add1_add_30_16_groupi_n_151), .Y
+       (csa_tree_add1_add_30_16_groupi_n_152));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8975(.A
+       (csa_tree_add1_add_30_16_groupi_n_148), .Y
+       (csa_tree_add1_add_30_16_groupi_n_149));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8976(.A
+       (csa_tree_add1_add_30_16_groupi_n_146), .Y
+       (csa_tree_add1_add_30_16_groupi_n_147));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8977(.A
+       (csa_tree_add1_add_30_16_groupi_n_144), .Y
+       (csa_tree_add1_add_30_16_groupi_n_145));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8978(.A
+       (csa_tree_add1_add_30_16_groupi_n_139), .Y
+       (csa_tree_add1_add_30_16_groupi_n_140));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8979(.A
+       (csa_tree_add1_add_30_16_groupi_n_132), .Y
+       (csa_tree_add1_add_30_16_groupi_n_133));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g8980(.A
+       (csa_tree_add1_add_30_16_groupi_n_129), .Y
+       (csa_tree_add1_add_30_16_groupi_n_130));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8981(.A0
+       (csa_tree_add1_add_30_16_groupi_n_62), .A1 (a[0]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_64), .B1 (n_5), .Y
+       (csa_tree_add1_add_30_16_groupi_n_128));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8983(.A0
+       (csa_tree_add1_add_30_16_groupi_n_43), .A1 (a[0]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_64), .B1 (n_6), .Y
+       (csa_tree_add1_add_30_16_groupi_n_126));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8984(.A0
+       (csa_tree_add1_add_30_16_groupi_n_44), .A1 (a[0]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_64), .B1 (n_11), .Y
+       (csa_tree_add1_add_30_16_groupi_n_125));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8985(.A0 (n_10), .A1
+       (csa_tree_add1_add_30_16_groupi_n_64), .B0 (a[0]), .B1
+       (csa_tree_add1_add_30_16_groupi_n_60), .Y
+       (csa_tree_add1_add_30_16_groupi_n_124));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8986(.A0
+       (csa_tree_add1_add_30_16_groupi_n_63), .A1 (a[0]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_64), .B1 (n_7), .Y
+       (csa_tree_add1_add_30_16_groupi_n_123));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8987(.A0
+       (csa_tree_add1_add_30_16_groupi_n_61), .A1 (a[0]), .B0 (n_4),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_64), .Y
+       (csa_tree_add1_add_30_16_groupi_n_122));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8989(.A0
+       (csa_tree_add1_add_30_16_groupi_n_69), .A1 (n_7), .B0
+       (csa_tree_add1_add_30_16_groupi_n_63), .B1 (a[14]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_229));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8990(.A0 (a[10]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_61), .B0 (n_4), .B1
+       (csa_tree_add1_add_30_16_groupi_n_48), .Y
+       (csa_tree_add1_add_30_16_groupi_n_227));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8991(.A0 (a[14]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_42), .B0
+       (csa_tree_add1_add_30_16_groupi_n_121), .B1
+       (csa_tree_add1_add_30_16_groupi_n_69), .Y
+       (csa_tree_add1_add_30_16_groupi_n_225));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8992(.A0
+       (csa_tree_add1_add_30_16_groupi_n_67), .A1 (n_6), .B0
+       (csa_tree_add1_add_30_16_groupi_n_43), .B1 (a[3]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_224));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8993(.A0
+       (csa_tree_add1_add_30_16_groupi_n_73), .A1 (n_6), .B0
+       (csa_tree_add1_add_30_16_groupi_n_43), .B1 (a[11]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_223));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8994(.A0 (a[8]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_61), .B0 (n_4), .B1
+       (csa_tree_add1_add_30_16_groupi_n_74), .Y
+       (csa_tree_add1_add_30_16_groupi_n_222));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8995(.A0
+       (csa_tree_add1_add_30_16_groupi_n_69), .A1 (n_10), .B0
+       (csa_tree_add1_add_30_16_groupi_n_60), .B1 (a[14]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_221));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8996(.A0
+       (csa_tree_add1_add_30_16_groupi_n_67), .A1
+       (csa_tree_add1_add_30_16_groupi_n_121), .B0
+       (csa_tree_add1_add_30_16_groupi_n_42), .B1 (a[3]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_220));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g8997(.A0
+       (csa_tree_add1_add_30_16_groupi_n_47), .A1
+       (csa_tree_add1_add_30_16_groupi_n_121), .B0
+       (csa_tree_add1_add_30_16_groupi_n_42), .B1 (a[2]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_219));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8998(.A0 (a[15]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_44), .B0 (n_11), .B1
+       (csa_tree_add1_add_30_16_groupi_n_50), .Y
+       (csa_tree_add1_add_30_16_groupi_n_217));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g8999(.A0 (a[10]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_42), .B0
+       (csa_tree_add1_add_30_16_groupi_n_121), .B1
+       (csa_tree_add1_add_30_16_groupi_n_48), .Y
+       (csa_tree_add1_add_30_16_groupi_n_215));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9000(.A0
+       (csa_tree_add1_add_30_16_groupi_n_71), .A1 (n_6), .B0
+       (csa_tree_add1_add_30_16_groupi_n_43), .B1 (a[4]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_214));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9001(.A0
+       (csa_tree_add1_add_30_16_groupi_n_62), .A1 (a[3]), .B0 (n_5),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_67), .Y
+       (csa_tree_add1_add_30_16_groupi_n_212));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9002(.A0
+       (csa_tree_add1_add_30_16_groupi_n_45), .A1 (n_4), .B0
+       (csa_tree_add1_add_30_16_groupi_n_61), .B1 (a[12]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_210));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9003(.A0 (a[4]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_61), .B0 (n_4), .B1
+       (csa_tree_add1_add_30_16_groupi_n_71), .Y
+       (csa_tree_add1_add_30_16_groupi_n_209));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9004(.A0 (a[13]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_61), .B0 (n_4), .B1
+       (csa_tree_add1_add_30_16_groupi_n_46), .Y
+       (csa_tree_add1_add_30_16_groupi_n_207));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9005(.A0
+       (csa_tree_add1_add_30_16_groupi_n_49), .A1 (n_11), .B0
+       (csa_tree_add1_add_30_16_groupi_n_44), .B1 (a[6]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_205));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9006(.A0 (a[10]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_62), .B0 (n_5), .B1
+       (csa_tree_add1_add_30_16_groupi_n_48), .Y
+       (csa_tree_add1_add_30_16_groupi_n_204));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9007(.A0 (a[11]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_44), .B0 (n_11), .B1
+       (csa_tree_add1_add_30_16_groupi_n_73), .Y
+       (csa_tree_add1_add_30_16_groupi_n_203));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9008(.A0
+       (csa_tree_add1_add_30_16_groupi_n_48), .A1 (n_10), .B0
+       (csa_tree_add1_add_30_16_groupi_n_60), .B1 (a[10]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_201));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9009(.A0 (a[5]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_60), .B0 (n_10), .B1
+       (csa_tree_add1_add_30_16_groupi_n_72), .Y
+       (csa_tree_add1_add_30_16_groupi_n_200));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9010(.A0 (a[4]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_60), .B0 (n_10), .B1
+       (csa_tree_add1_add_30_16_groupi_n_71), .Y
+       (csa_tree_add1_add_30_16_groupi_n_199));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9011(.A0
+       (csa_tree_add1_add_30_16_groupi_n_71), .A1 (n_5), .B0
+       (csa_tree_add1_add_30_16_groupi_n_62), .B1 (a[4]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_197));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9012(.A0 (a[3]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_61), .B0 (n_4), .B1
+       (csa_tree_add1_add_30_16_groupi_n_67), .Y
+       (csa_tree_add1_add_30_16_groupi_n_196));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9013(.A0
+       (csa_tree_add1_add_30_16_groupi_n_45), .A1
+       (csa_tree_add1_add_30_16_groupi_n_121), .B0
+       (csa_tree_add1_add_30_16_groupi_n_42), .B1 (a[12]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_194));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9014(.A0 (a[9]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_62), .B0 (n_5), .B1
+       (csa_tree_add1_add_30_16_groupi_n_75), .Y
+       (csa_tree_add1_add_30_16_groupi_n_193));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9015(.A0 (a[11]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_60), .B0 (n_10), .B1
+       (csa_tree_add1_add_30_16_groupi_n_73), .Y
+       (csa_tree_add1_add_30_16_groupi_n_192));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9016(.A0
+       (csa_tree_add1_add_30_16_groupi_n_71), .A1
+       (csa_tree_add1_add_30_16_groupi_n_121), .B0
+       (csa_tree_add1_add_30_16_groupi_n_42), .B1 (a[4]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_191));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9017(.A0
+       (csa_tree_add1_add_30_16_groupi_n_68), .A1 (n_5), .B0
+       (csa_tree_add1_add_30_16_groupi_n_62), .B1 (a[7]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_190));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9018(.A0 (a[9]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_61), .B0 (n_4), .B1
+       (csa_tree_add1_add_30_16_groupi_n_75), .Y
+       (csa_tree_add1_add_30_16_groupi_n_188));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9019(.A0
+       (csa_tree_add1_add_30_16_groupi_n_73), .A1 (n_4), .B0
+       (csa_tree_add1_add_30_16_groupi_n_61), .B1 (a[11]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_186));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9020(.A0
+       (csa_tree_add1_add_30_16_groupi_n_47), .A1 (n_7), .B0
+       (csa_tree_add1_add_30_16_groupi_n_63), .B1 (a[2]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_184));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9021(.A0 (a[7]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_63), .B0 (n_7), .B1
+       (csa_tree_add1_add_30_16_groupi_n_68), .Y
+       (csa_tree_add1_add_30_16_groupi_n_183));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9022(.A0
+       (csa_tree_add1_add_30_16_groupi_n_67), .A1 (n_10), .B0
+       (csa_tree_add1_add_30_16_groupi_n_60), .B1 (a[3]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_181));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9023(.A0
+       (csa_tree_add1_add_30_16_groupi_n_45), .A1 (n_6), .B0
+       (csa_tree_add1_add_30_16_groupi_n_43), .B1 (a[12]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_179));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9024(.A0 (a[5]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_62), .B0 (n_5), .B1
+       (csa_tree_add1_add_30_16_groupi_n_72), .Y
+       (csa_tree_add1_add_30_16_groupi_n_177));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9025(.A0 (a[8]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_63), .B0 (n_7), .B1
+       (csa_tree_add1_add_30_16_groupi_n_74), .Y
+       (csa_tree_add1_add_30_16_groupi_n_176));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9026(.A0 (a[12]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_44), .B0 (n_11), .B1
+       (csa_tree_add1_add_30_16_groupi_n_45), .Y
+       (csa_tree_add1_add_30_16_groupi_n_175));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9027(.A0
+       (csa_tree_add1_add_30_16_groupi_n_72), .A1 (n_7), .B0
+       (csa_tree_add1_add_30_16_groupi_n_63), .B1 (a[5]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_173));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9028(.A0
+       (csa_tree_add1_add_30_16_groupi_n_72), .A1 (n_11), .B0
+       (csa_tree_add1_add_30_16_groupi_n_44), .B1 (a[5]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_172));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9029(.A0
+       (csa_tree_add1_add_30_16_groupi_n_44), .A1 (a[3]), .B0 (n_11),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_67), .Y
+       (csa_tree_add1_add_30_16_groupi_n_170));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9030(.A0
+       (csa_tree_add1_add_30_16_groupi_n_49), .A1 (n_5), .B0
+       (csa_tree_add1_add_30_16_groupi_n_62), .B1 (a[6]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_169));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9031(.A0
+       (csa_tree_add1_add_30_16_groupi_n_62), .A1 (a[1]), .B0 (n_5),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_70), .Y
+       (csa_tree_add1_add_30_16_groupi_n_168));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9032(.A0
+       (csa_tree_add1_add_30_16_groupi_n_50), .A1 (n_5), .B0
+       (csa_tree_add1_add_30_16_groupi_n_62), .B1 (a[15]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_166));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9033(.A0 (a[13]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_44), .B0 (n_11), .B1
+       (csa_tree_add1_add_30_16_groupi_n_46), .Y
+       (csa_tree_add1_add_30_16_groupi_n_165));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9034(.A0
+       (csa_tree_add1_add_30_16_groupi_n_67), .A1 (n_7), .B0
+       (csa_tree_add1_add_30_16_groupi_n_63), .B1 (a[3]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_163));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9035(.A0
+       (csa_tree_add1_add_30_16_groupi_n_44), .A1 (a[2]), .B0 (n_11),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_47), .Y
+       (csa_tree_add1_add_30_16_groupi_n_162));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9036(.A0
+       (csa_tree_add1_add_30_16_groupi_n_72), .A1 (n_6), .B0
+       (csa_tree_add1_add_30_16_groupi_n_43), .B1 (a[5]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_161));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9037(.A0 (a[5]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_61), .B0 (n_4), .B1
+       (csa_tree_add1_add_30_16_groupi_n_72), .Y
+       (csa_tree_add1_add_30_16_groupi_n_159));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9038(.A0
+       (csa_tree_add1_add_30_16_groupi_n_68), .A1 (n_10), .B0
+       (csa_tree_add1_add_30_16_groupi_n_60), .B1 (a[7]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_157));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9039(.A0
+       (csa_tree_add1_add_30_16_groupi_n_74), .A1
+       (csa_tree_add1_add_30_16_groupi_n_121), .B0
+       (csa_tree_add1_add_30_16_groupi_n_42), .B1 (a[8]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_156));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9040(.A0 (a[6]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_63), .B0 (n_7), .B1
+       (csa_tree_add1_add_30_16_groupi_n_49), .Y
+       (csa_tree_add1_add_30_16_groupi_n_155));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9041(.A0
+       (csa_tree_add1_add_30_16_groupi_n_75), .A1
+       (csa_tree_add1_add_30_16_groupi_n_121), .B0
+       (csa_tree_add1_add_30_16_groupi_n_42), .B1 (a[9]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_154));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9042(.A0 (a[2]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_61), .B0 (n_4), .B1
+       (csa_tree_add1_add_30_16_groupi_n_47), .Y
+       (csa_tree_add1_add_30_16_groupi_n_153));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9043(.A0 (a[13]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_63), .B0 (n_7), .B1
+       (csa_tree_add1_add_30_16_groupi_n_46), .Y
+       (csa_tree_add1_add_30_16_groupi_n_151));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9044(.A0 (a[12]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_63), .B0 (n_7), .B1
+       (csa_tree_add1_add_30_16_groupi_n_45), .Y
+       (csa_tree_add1_add_30_16_groupi_n_150));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9045(.A0 (a[15]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_63), .B0 (n_7), .B1
+       (csa_tree_add1_add_30_16_groupi_n_50), .Y
+       (csa_tree_add1_add_30_16_groupi_n_148));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9046(.A0 (a[5]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_42), .B0
+       (csa_tree_add1_add_30_16_groupi_n_121), .B1
+       (csa_tree_add1_add_30_16_groupi_n_72), .Y
+       (csa_tree_add1_add_30_16_groupi_n_146));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9047(.A0
+       (csa_tree_add1_add_30_16_groupi_n_74), .A1 (n_6), .B0
+       (csa_tree_add1_add_30_16_groupi_n_43), .B1 (a[8]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_144));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9048(.A0
+       (csa_tree_add1_add_30_16_groupi_n_70), .A1
+       (csa_tree_add1_add_30_16_groupi_n_121), .B0
+       (csa_tree_add1_add_30_16_groupi_n_42), .B1 (a[1]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_143));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9049(.A0
+       (csa_tree_add1_add_30_16_groupi_n_68), .A1
+       (csa_tree_add1_add_30_16_groupi_n_121), .B0
+       (csa_tree_add1_add_30_16_groupi_n_42), .B1 (a[7]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_142));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9050(.A0
+       (csa_tree_add1_add_30_16_groupi_n_50), .A1
+       (csa_tree_add1_add_30_16_groupi_n_121), .B0
+       (csa_tree_add1_add_30_16_groupi_n_42), .B1 (a[15]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_141));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9051(.A0
+       (csa_tree_add1_add_30_16_groupi_n_49), .A1 (n_6), .B0
+       (csa_tree_add1_add_30_16_groupi_n_43), .B1 (a[6]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_139));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9052(.A0
+       (csa_tree_add1_add_30_16_groupi_n_44), .A1 (a[1]), .B0
+       (csa_tree_add1_add_30_16_groupi_n_70), .B1 (n_11), .Y
+       (csa_tree_add1_add_30_16_groupi_n_138));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9053(.A0 (a[7]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_61), .B0 (n_4), .B1
+       (csa_tree_add1_add_30_16_groupi_n_68), .Y
+       (csa_tree_add1_add_30_16_groupi_n_137));
+  sky130_osu_sc_18T_ms__oai22_l
+       csa_tree_add1_add_30_16_groupi_g9054(.A0
+       (csa_tree_add1_add_30_16_groupi_n_46), .A1 (n_10), .B0
+       (csa_tree_add1_add_30_16_groupi_n_60), .B1 (a[13]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_136));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9055(.A0
+       (csa_tree_add1_add_30_16_groupi_n_62), .A1 (a[2]), .B0 (n_5),
+       .B1 (csa_tree_add1_add_30_16_groupi_n_47), .Y
+       (csa_tree_add1_add_30_16_groupi_n_135));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9056(.A0 (a[6]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_60), .B0 (n_10), .B1
+       (csa_tree_add1_add_30_16_groupi_n_49), .Y
+       (csa_tree_add1_add_30_16_groupi_n_134));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9057(.A0 (a[9]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_44), .B0 (n_11), .B1
+       (csa_tree_add1_add_30_16_groupi_n_75), .Y
+       (csa_tree_add1_add_30_16_groupi_n_132));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9058(.A0 (a[11]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_63), .B0 (n_7), .B1
+       (csa_tree_add1_add_30_16_groupi_n_73), .Y
+       (csa_tree_add1_add_30_16_groupi_n_131));
+  sky130_osu_sc_18T_ms__aoi22_l
+       csa_tree_add1_add_30_16_groupi_g9059(.A0 (a[15]), .A1
+       (csa_tree_add1_add_30_16_groupi_n_61), .B0 (n_4), .B1
+       (csa_tree_add1_add_30_16_groupi_n_50), .Y
+       (csa_tree_add1_add_30_16_groupi_n_129));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9060(.A
+       (csa_tree_add1_add_30_16_groupi_n_120), .Y
+       (csa_tree_add1_add_30_16_groupi_n_119));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9061(.A
+       (csa_tree_add1_add_30_16_groupi_n_118), .Y
+       (csa_tree_add1_add_30_16_groupi_n_117));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9062(.A
+       (csa_tree_add1_add_30_16_groupi_n_116), .Y
+       (csa_tree_add1_add_30_16_groupi_n_115));
+  sky130_osu_sc_18T_ms__nor2_l csa_tree_add1_add_30_16_groupi_g9063(.A
+       (b[2]), .B (csa_tree_add1_add_30_16_groupi_n_42), .Y
+       (csa_tree_add1_add_30_16_groupi_n_113));
+  sky130_osu_sc_18T_ms__nor2_1 csa_tree_add1_add_30_16_groupi_g9064(.A
+       (b[6]), .B (a[0]), .Y (csa_tree_add1_add_30_16_groupi_n_112));
+  sky130_osu_sc_18T_ms__nor2_1 csa_tree_add1_add_30_16_groupi_g9065(.A
+       (b[4]), .B (a[0]), .Y (csa_tree_add1_add_30_16_groupi_n_111));
+  sky130_osu_sc_18T_ms__nor2_l csa_tree_add1_add_30_16_groupi_g9066(.A
+       (b[10]), .B (a[0]), .Y (csa_tree_add1_add_30_16_groupi_n_110));
+  sky130_osu_sc_18T_ms__nor2_l csa_tree_add1_add_30_16_groupi_g9067(.A
+       (b[14]), .B (a[0]), .Y (csa_tree_add1_add_30_16_groupi_n_109));
+  sky130_osu_sc_18T_ms__nor2_l csa_tree_add1_add_30_16_groupi_g9068(.A
+       (b[8]), .B (a[0]), .Y (csa_tree_add1_add_30_16_groupi_n_108));
+  sky130_osu_sc_18T_ms__nor2_l csa_tree_add1_add_30_16_groupi_g9069(.A
+       (b[12]), .B (a[0]), .Y (csa_tree_add1_add_30_16_groupi_n_107));
+  sky130_osu_sc_18T_ms__nor2_1 csa_tree_add1_add_30_16_groupi_g9070(.A
+       (b[2]), .B (a[0]), .Y (csa_tree_add1_add_30_16_groupi_n_106));
+  sky130_osu_sc_18T_ms__nor2_1 csa_tree_add1_add_30_16_groupi_g9071(.A
+       (csa_tree_add1_add_30_16_groupi_n_39), .B
+       (csa_tree_add1_add_30_16_groupi_n_121), .Y
+       (csa_tree_add1_add_30_16_groupi_n_105));
+  sky130_osu_sc_18T_ms__nor2_1 csa_tree_add1_add_30_16_groupi_g9072(.A
+       (csa_tree_add1_add_30_16_groupi_n_69), .B
+       (csa_tree_add1_add_30_16_groupi_n_65), .Y
+       (csa_tree_add1_add_30_16_groupi_n_120));
+  sky130_osu_sc_18T_ms__nand2_1 csa_tree_add1_add_30_16_groupi_g9073(.A
+       (a[6]), .B (b[15]), .Y (csa_tree_add1_add_30_16_groupi_n_118));
+  sky130_osu_sc_18T_ms__nand2_1 csa_tree_add1_add_30_16_groupi_g9074(.A
+       (a[11]), .B (b[15]), .Y (csa_tree_add1_add_30_16_groupi_n_116));
+  sky130_osu_sc_18T_ms__nand2_1 csa_tree_add1_add_30_16_groupi_g9075(.A
+       (a[9]), .B (b[15]), .Y (csa_tree_add1_add_30_16_groupi_n_114));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9077(.A
+       (csa_tree_add1_add_30_16_groupi_n_101), .Y
+       (csa_tree_add1_add_30_16_groupi_n_100));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9078(.A
+       (csa_tree_add1_add_30_16_groupi_n_99), .Y
+       (csa_tree_add1_add_30_16_groupi_n_98));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9079(.A
+       (csa_tree_add1_add_30_16_groupi_n_96), .Y
+       (csa_tree_add1_add_30_16_groupi_n_95));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9080(.A
+       (csa_tree_add1_add_30_16_groupi_n_94), .Y
+       (csa_tree_add1_add_30_16_groupi_n_93));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9081(.A
+       (csa_tree_add1_add_30_16_groupi_n_91), .Y
+       (csa_tree_add1_add_30_16_groupi_n_90));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9082(.A
+       (csa_tree_add1_add_30_16_groupi_n_89), .Y
+       (csa_tree_add1_add_30_16_groupi_n_88));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9083(.A
+       (csa_tree_add1_add_30_16_groupi_n_87), .Y
+       (csa_tree_add1_add_30_16_groupi_n_86));
+  sky130_osu_sc_18T_ms__nand2_1 csa_tree_add1_add_30_16_groupi_g9084(.A
+       (a[15]), .B (b[15]), .Y (csa_tree_add1_add_30_16_groupi_n_104));
+  sky130_osu_sc_18T_ms__nor2_1 csa_tree_add1_add_30_16_groupi_g9085(.A
+       (csa_tree_add1_add_30_16_groupi_n_64), .B
+       (csa_tree_add1_add_30_16_groupi_n_66), .Y
+       (csa_tree_add1_add_30_16_groupi_n_103));
+  sky130_osu_sc_18T_ms__nand2_1 csa_tree_add1_add_30_16_groupi_g9086(.A
+       (a[7]), .B (b[15]), .Y (csa_tree_add1_add_30_16_groupi_n_102));
+  sky130_osu_sc_18T_ms__nand2_1 csa_tree_add1_add_30_16_groupi_g9087(.A
+       (a[13]), .B (b[15]), .Y (csa_tree_add1_add_30_16_groupi_n_101));
+  sky130_osu_sc_18T_ms__nor2_1 csa_tree_add1_add_30_16_groupi_g9088(.A
+       (csa_tree_add1_add_30_16_groupi_n_65), .B
+       (csa_tree_add1_add_30_16_groupi_n_70), .Y
+       (csa_tree_add1_add_30_16_groupi_n_99));
+  sky130_osu_sc_18T_ms__nand2_1 csa_tree_add1_add_30_16_groupi_g9089(.A
+       (a[5]), .B (b[15]), .Y (csa_tree_add1_add_30_16_groupi_n_97));
+  sky130_osu_sc_18T_ms__or2_1 csa_tree_add1_add_30_16_groupi_g9090(.A
+       (csa_tree_add1_add_30_16_groupi_n_48), .B
+       (csa_tree_add1_add_30_16_groupi_n_65), .Y
+       (csa_tree_add1_add_30_16_groupi_n_96));
+  sky130_osu_sc_18T_ms__nor2_1 csa_tree_add1_add_30_16_groupi_g9091(.A
+       (csa_tree_add1_add_30_16_groupi_n_65), .B
+       (csa_tree_add1_add_30_16_groupi_n_67), .Y
+       (csa_tree_add1_add_30_16_groupi_n_94));
+  sky130_osu_sc_18T_ms__nand2_1 csa_tree_add1_add_30_16_groupi_g9092(.A
+       (b[15]), .B (a[4]), .Y (csa_tree_add1_add_30_16_groupi_n_92));
+  sky130_osu_sc_18T_ms__nand2_1 csa_tree_add1_add_30_16_groupi_g9093(.A
+       (a[12]), .B (b[15]), .Y (csa_tree_add1_add_30_16_groupi_n_91));
+  sky130_osu_sc_18T_ms__nand2_1 csa_tree_add1_add_30_16_groupi_g9094(.A
+       (b[15]), .B (a[2]), .Y (csa_tree_add1_add_30_16_groupi_n_89));
+  sky130_osu_sc_18T_ms__nor2_1 csa_tree_add1_add_30_16_groupi_g9095(.A
+       (csa_tree_add1_add_30_16_groupi_n_65), .B
+       (csa_tree_add1_add_30_16_groupi_n_64), .Y
+       (csa_tree_add1_add_30_16_groupi_n_87));
+  sky130_osu_sc_18T_ms__nand2_1 csa_tree_add1_add_30_16_groupi_g9096(.A
+       (a[8]), .B (b[15]), .Y (csa_tree_add1_add_30_16_groupi_n_85));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9097(.A
+       (sum_q[2]), .Y (csa_tree_add1_add_30_16_groupi_n_84));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9098(.A
+       (sum_q[8]), .Y (csa_tree_add1_add_30_16_groupi_n_83));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9099(.A
+       (b[10]), .Y (csa_tree_add1_add_30_16_groupi_n_82));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9100(.A
+       (b[6]), .Y (csa_tree_add1_add_30_16_groupi_n_81));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9101(.A
+       (b[14]), .Y (csa_tree_add1_add_30_16_groupi_n_80));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9105(.A
+       (b[2]), .Y (csa_tree_add1_add_30_16_groupi_n_39));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9106(.A
+       (b[4]), .Y (csa_tree_add1_add_30_16_groupi_n_79));
+  sky130_osu_sc_18T_ms__inv_2 csa_tree_add1_add_30_16_groupi_g9107(.A
+       (csa_tree_add1_add_30_16_groupi_n_38), .Y
+       (csa_tree_add1_add_30_16_groupi_n_78));
+  sky130_osu_sc_18T_ms__buf_1 csa_tree_add1_add_30_16_groupi_g9112(.A
+       (sum_q[24]), .Y (csa_tree_add1_add_30_16_groupi_n_38));
+  sky130_osu_sc_18T_ms__buf_1 csa_tree_add1_add_30_16_groupi_g9113(.A
+       (sum_q[24]), .Y (csa_tree_add1_add_30_16_groupi_n_77));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9120(.A
+       (sum_q[17]), .Y (csa_tree_add1_add_30_16_groupi_n_76));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9121(.A
+       (a[9]), .Y (csa_tree_add1_add_30_16_groupi_n_75));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9122(.A
+       (a[8]), .Y (csa_tree_add1_add_30_16_groupi_n_74));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9123(.A
+       (a[11]), .Y (csa_tree_add1_add_30_16_groupi_n_73));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9124(.A
+       (a[5]), .Y (csa_tree_add1_add_30_16_groupi_n_72));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9125(.A
+       (a[4]), .Y (csa_tree_add1_add_30_16_groupi_n_71));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9126(.A
+       (a[1]), .Y (csa_tree_add1_add_30_16_groupi_n_70));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9127(.A
+       (a[14]), .Y (csa_tree_add1_add_30_16_groupi_n_69));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9128(.A
+       (a[7]), .Y (csa_tree_add1_add_30_16_groupi_n_68));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9129(.A
+       (a[3]), .Y (csa_tree_add1_add_30_16_groupi_n_67));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9130(.A
+       (b[0]), .Y (csa_tree_add1_add_30_16_groupi_n_66));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9131(.A
+       (b[15]), .Y (csa_tree_add1_add_30_16_groupi_n_65));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9132(.A
+       (a[0]), .Y (csa_tree_add1_add_30_16_groupi_n_64));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9133(.A
+       (n_7), .Y (csa_tree_add1_add_30_16_groupi_n_63));
+  sky130_osu_sc_18T_ms__inv_4 csa_tree_add1_add_30_16_groupi_g9134(.A
+       (n_5), .Y (csa_tree_add1_add_30_16_groupi_n_62));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9135(.A
+       (n_4), .Y (csa_tree_add1_add_30_16_groupi_n_61));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9136(.A
+       (n_10), .Y (csa_tree_add1_add_30_16_groupi_n_60));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9138(.A
+       (sum_q[5]), .Y (csa_tree_add1_add_30_16_groupi_n_59));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9139(.A
+       (sum_q[6]), .Y (csa_tree_add1_add_30_16_groupi_n_58));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9140(.A
+       (sum_q[28]), .Y (csa_tree_add1_add_30_16_groupi_n_57));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9141(.A
+       (sum_q[4]), .Y (csa_tree_add1_add_30_16_groupi_n_56));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9142(.A
+       (b[8]), .Y (csa_tree_add1_add_30_16_groupi_n_55));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9143(.A
+       (b[12]), .Y (csa_tree_add1_add_30_16_groupi_n_54));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9146(.A
+       (sum_q[20]), .Y (csa_tree_add1_add_30_16_groupi_n_36));
+  sky130_osu_sc_18T_ms__buf_1 csa_tree_add1_add_30_16_groupi_g9148(.A
+       (sum_q[20]), .Y (csa_tree_add1_add_30_16_groupi_n_53));
+  sky130_osu_sc_18T_ms__inv_2 csa_tree_add1_add_30_16_groupi_g9156(.A
+       (csa_tree_add1_add_30_16_groupi_n_33), .Y
+       (csa_tree_add1_add_30_16_groupi_n_34));
+  sky130_osu_sc_18T_ms__buf_1 csa_tree_add1_add_30_16_groupi_g9157(.A
+       (sum_q[22]), .Y (csa_tree_add1_add_30_16_groupi_n_33));
+  sky130_osu_sc_18T_ms__buf_1 csa_tree_add1_add_30_16_groupi_g9158(.A
+       (sum_q[22]), .Y (csa_tree_add1_add_30_16_groupi_n_51));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9159(.A
+       (a[15]), .Y (csa_tree_add1_add_30_16_groupi_n_50));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9160(.A
+       (a[6]), .Y (csa_tree_add1_add_30_16_groupi_n_49));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9161(.A
+       (a[10]), .Y (csa_tree_add1_add_30_16_groupi_n_48));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9162(.A
+       (a[2]), .Y (csa_tree_add1_add_30_16_groupi_n_47));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9163(.A
+       (a[13]), .Y (csa_tree_add1_add_30_16_groupi_n_46));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9164(.A
+       (a[12]), .Y (csa_tree_add1_add_30_16_groupi_n_45));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9165(.A
+       (n_11), .Y (csa_tree_add1_add_30_16_groupi_n_44));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9166(.A
+       (n_6), .Y (csa_tree_add1_add_30_16_groupi_n_43));
+  sky130_osu_sc_18T_ms__inv_1 csa_tree_add1_add_30_16_groupi_g9167(.A
+       (csa_tree_add1_add_30_16_groupi_n_121), .Y
+       (csa_tree_add1_add_30_16_groupi_n_42));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g3(.A
+       (csa_tree_add1_add_30_16_groupi_n_32), .Y
+       (csa_tree_add1_add_30_16_groupi_n_31));
+  sky130_osu_sc_18T_ms__aoi21_l csa_tree_add1_add_30_16_groupi_g2(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1329), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1008), .B0
+       (csa_tree_add1_add_30_16_groupi_n_940), .Y
+       (csa_tree_add1_add_30_16_groupi_n_32));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g9168(.A
+       (csa_tree_add1_add_30_16_groupi_n_30), .Y
+       (csa_tree_add1_add_30_16_groupi_n_29));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g9169(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1327), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1130), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1037), .Y
+       (csa_tree_add1_add_30_16_groupi_n_30));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g9170(.A
+       (csa_tree_add1_add_30_16_groupi_n_28), .Y
+       (csa_tree_add1_add_30_16_groupi_n_27));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g9171(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1325), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1154), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1141), .Y
+       (csa_tree_add1_add_30_16_groupi_n_28));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g9172(.A
+       (csa_tree_add1_add_30_16_groupi_n_26), .Y
+       (csa_tree_add1_add_30_16_groupi_n_25));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g9173(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1323), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1157), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1175), .Y
+       (csa_tree_add1_add_30_16_groupi_n_26));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g9174(.A
+       (csa_tree_add1_add_30_16_groupi_n_24), .Y
+       (csa_tree_add1_add_30_16_groupi_n_23));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g9175(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1321), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1171), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1188), .Y
+       (csa_tree_add1_add_30_16_groupi_n_24));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g9176(.A
+       (csa_tree_add1_add_30_16_groupi_n_22), .Y
+       (csa_tree_add1_add_30_16_groupi_n_21));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g9177(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1319), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1198), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1187), .Y
+       (csa_tree_add1_add_30_16_groupi_n_22));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g9178(.A
+       (csa_tree_add1_add_30_16_groupi_n_20), .Y
+       (csa_tree_add1_add_30_16_groupi_n_19));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g9179(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1317), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1199), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1210), .Y
+       (csa_tree_add1_add_30_16_groupi_n_20));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g9180(.A
+       (csa_tree_add1_add_30_16_groupi_n_18), .Y
+       (csa_tree_add1_add_30_16_groupi_n_17));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g9181(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1315), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1227), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1221), .Y
+       (csa_tree_add1_add_30_16_groupi_n_18));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g9182(.A
+       (csa_tree_add1_add_30_16_groupi_n_16), .Y
+       (csa_tree_add1_add_30_16_groupi_n_15));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g9183(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1313), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1228), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1238), .Y
+       (csa_tree_add1_add_30_16_groupi_n_16));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g9184(.A
+       (csa_tree_add1_add_30_16_groupi_n_14), .Y
+       (csa_tree_add1_add_30_16_groupi_n_13));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g9185(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1311), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1244), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1226), .Y
+       (csa_tree_add1_add_30_16_groupi_n_14));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g9186(.A
+       (csa_tree_add1_add_30_16_groupi_n_12), .Y
+       (csa_tree_add1_add_30_16_groupi_n_11));
+  sky130_osu_sc_18T_ms__aoi21_l
+       csa_tree_add1_add_30_16_groupi_g9187(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1309), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1235), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1243), .Y
+       (csa_tree_add1_add_30_16_groupi_n_12));
+  sky130_osu_sc_18T_ms__inv_l csa_tree_add1_add_30_16_groupi_g9188(.A
+       (csa_tree_add1_add_30_16_groupi_n_10), .Y
+       (csa_tree_add1_add_30_16_groupi_n_9));
+  sky130_osu_sc_18T_ms__oai21_l
+       csa_tree_add1_add_30_16_groupi_g9189(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1249), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1307), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1242), .Y
+       (csa_tree_add1_add_30_16_groupi_n_10));
+  sky130_osu_sc_18T_ms__and2_1 csa_tree_add1_add_30_16_groupi_g9190(.A
+       (csa_tree_add1_add_30_16_groupi_n_1163), .B
+       (csa_tree_add1_add_30_16_groupi_n_1222), .Y
+       (csa_tree_add1_add_30_16_groupi_n_8));
+  sky130_osu_sc_18T_ms__and2_1 csa_tree_add1_add_30_16_groupi_g9191(.A
+       (csa_tree_add1_add_30_16_groupi_n_1102), .B
+       (csa_tree_add1_add_30_16_groupi_n_1201), .Y
+       (csa_tree_add1_add_30_16_groupi_n_7));
+  sky130_osu_sc_18T_ms__and2_1 csa_tree_add1_add_30_16_groupi_g9192(.A
+       (csa_tree_add1_add_30_16_groupi_n_1117), .B
+       (csa_tree_add1_add_30_16_groupi_n_1200), .Y
+       (csa_tree_add1_add_30_16_groupi_n_6));
+  sky130_osu_sc_18T_ms__xor2_l csa_tree_add1_add_30_16_groupi_g9193(.A
+       (csa_tree_add1_add_30_16_groupi_n_41), .B
+       (csa_tree_add1_add_30_16_groupi_n_1131), .Y
+       (csa_tree_add1_add_30_16_groupi_n_5));
+  sky130_osu_sc_18T_ms__xnor2_l csa_tree_add1_add_30_16_groupi_g9194(.A
+       (n_1408), .B (csa_tree_add1_add_30_16_groupi_n_582), .Y
+       (csa_tree_add1_add_30_16_groupi_n_4));
+  sky130_osu_sc_18T_ms__xnor2_l csa_tree_add1_add_30_16_groupi_g9195(.A
+       (n_1409), .B (csa_tree_add1_add_30_16_groupi_n_713), .Y
+       (csa_tree_add1_add_30_16_groupi_n_3));
+  sky130_osu_sc_18T_ms__xnor2_l csa_tree_add1_add_30_16_groupi_g9196(.A
+       (csa_tree_add1_add_30_16_groupi_n_667), .B
+       (csa_tree_add1_add_30_16_groupi_n_489), .Y
+       (csa_tree_add1_add_30_16_groupi_n_2));
+  sky130_osu_sc_18T_ms__and2_1 csa_tree_add1_add_30_16_groupi_g9197(.A
+       (csa_tree_add1_add_30_16_groupi_n_103), .B (sum_q[0]), .Y
+       (csa_tree_add1_add_30_16_groupi_n_1));
+  sky130_osu_sc_18T_ms__xnor2_l csa_tree_add1_add_30_16_groupi_g9198(.A
+       (sum_q[18]), .B (csa_tree_add1_add_30_16_groupi_n_746), .Y
+       (csa_tree_add1_add_30_16_groupi_n_0));
+  sky130_osu_sc_18T_ms__oai21_l g2(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1220), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1299), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1229), .Y (n_1403));
+  sky130_osu_sc_18T_ms__oai21_l g9202(.A0
+       (csa_tree_add1_add_30_16_groupi_n_1295), .A1
+       (csa_tree_add1_add_30_16_groupi_n_1234), .B0
+       (csa_tree_add1_add_30_16_groupi_n_1230), .Y (n_1404));
+  sky130_osu_sc_18T_ms__inv_l g3(.A
+       (csa_tree_add1_add_30_16_groupi_n_966), .Y (n_1407));
+  sky130_osu_sc_18T_ms__oai21_l g9204(.A0
+       (csa_tree_add1_add_30_16_groupi_n_756), .A1
+       (csa_tree_add1_add_30_16_groupi_n_364), .B0
+       (csa_tree_add1_add_30_16_groupi_n_704), .Y
+       (csa_tree_add1_add_30_16_groupi_n_966));
+  sky130_osu_sc_18T_ms__aoi22_l g9205(.A0
+       (csa_tree_add1_add_30_16_groupi_n_523), .A1
+       (csa_tree_add1_add_30_16_groupi_n_488), .B0
+       (csa_tree_add1_add_30_16_groupi_n_524), .B1
+       (csa_tree_add1_add_30_16_groupi_n_487), .Y (n_1408));
+  sky130_osu_sc_18T_ms__aoi22_l g9206(.A0
+       (csa_tree_add1_add_30_16_groupi_n_393), .A1
+       (csa_tree_add1_add_30_16_groupi_n_518), .B0
+       (csa_tree_add1_add_30_16_groupi_n_394), .B1
+       (csa_tree_add1_add_30_16_groupi_n_517), .Y (n_1409));
+  sky130_osu_sc_18T_ms__addf_l g9207(.A
+       (csa_tree_add1_add_30_16_groupi_n_874), .B
+       (csa_tree_add1_add_30_16_groupi_n_813), .CI
+       (csa_tree_add1_add_30_16_groupi_n_994), .CO (n_1411), .CON
+       (n_1412), .S (n_1410));
+  sky130_osu_sc_18T_ms__addf_l g9208(.A
+       (csa_tree_add1_add_30_16_groupi_n_434), .B
+       (csa_tree_add1_add_30_16_groupi_n_443), .CI
+       (csa_tree_add1_add_30_16_groupi_n_396), .CO (n_1415), .CON
+       (n_1414), .S (n_1413));
+endmodule
+
diff --git a/sky130_cds/synth/reports/mult_seq_area.rep b/sky130_cds/synth/reports/mult_seq_area.rep
new file mode 100755
index 000000000..35271c124
--- /dev/null
+++ b/sky130_cds/synth/reports/mult_seq_area.rep
@@ -0,0 +1,14 @@
+============================================================
+  Generated by:           Genus(TM) Synthesis Solution 20.11-s111_1
+  Generated on:           Aug 06 2022  12:33:10 pm
+  Module:                 mult_seq
+  Operating conditions:   PVT_1P8V_25C (balanced_tree)
+  Wireload mode:          enclosed
+  Area mode:              timing library
+============================================================
+
+Instance      Module      Cell Count  Cell Area  Net Area   Total Area   Wireload  
+-----------------------------------------------------------------------------------
+mult_seq                        1440  21346.499     0.000    21346.499  (D)  
+  reg1   flopenr_WIDTH32         122   2515.748     0.000     2515.748  (D)  
+  (D) = wireload is default in technology library
diff --git a/sky130_cds/synth/reports/mult_seq_clocks.rep b/sky130_cds/synth/reports/mult_seq_clocks.rep
new file mode 100755
index 000000000..ce79162b2
--- /dev/null
+++ b/sky130_cds/synth/reports/mult_seq_clocks.rep
@@ -0,0 +1,33 @@
+============================================================
+  Generated by:           Genus(TM) Synthesis Solution 20.11-s111_1
+  Generated on:           Aug 06 2022  12:33:10 pm
+  Module:                 mult_seq
+  Operating conditions:   PVT_1P8V_25C (balanced_tree)
+  Wireload mode:          enclosed
+  Area mode:              timing library
+============================================================
+
+
+ Clock Description
+ ----------------- 
+
+ Clock                             Clock    Source     No of   
+ Name    Period   Rise    Fall     Domain  Pin/Port  Registers 
+---------------------------------------------------------------
+ clk     10000.0   0.0   5000.0   domain_1   clk            32 
+
+ Clock Network Latency / Setup Uncertainty
+ ----------------------------------------- 
+
+        Network   Network   Source   Source     Setup        Setup    
+Clock   Latency   Latency  Latency  Latency  Uncertainty  Uncertainty 
+ Name    Rise      Fall      Rise     Fall       Rise         Fall    
+----------------------------------------------------------------------
+clk         0.0       0.0      0.0      0.0       1000.0       1000.0 
+
+ Clock Relationship (with uncertainty & latency)
+ ----------------------------------------------- 
+
+  From    To    R->R     R->F     F->R     F->F  
+-------------------------------------------------
+  clk    clk   9000.0   4000.0   4000.0   9000.0 
diff --git a/sky130_cds/synth/reports/mult_seq_power.rep b/sky130_cds/synth/reports/mult_seq_power.rep
new file mode 100755
index 000000000..e7a0d05c9
--- /dev/null
+++ b/sky130_cds/synth/reports/mult_seq_power.rep
@@ -0,0 +1,47 @@
+Warning: Library 'sky130_osu_sc_18T_ms_TT_1P8_25C.ccs' found in multiple domains.
+Info: Use -domain to uniquify.
+Info: Selecting library 'sky130_osu_sc_18T_ms_TT_1P8_25C.ccs' in domain '-1'
+Info    : Joules engine is used. [RPT-16]
+        : Joules engine is being used for the command report_power.
+Info   : ACTP-0001 [ACTPInfo] Activity propagation started for stim#0 netlist
+       : mult_seq
+Info   : ACTP-0009 [ACTPInfo] Activity Propagation Progress Report :   0%   1%   2%   3%   4%   5%   6%   7%   8%   9%  10%  11%  12%  13%  14%  15%  16%  17%  18%  19%  20%  21%  22%  23%  24%  25%  26%  27%  28%  29%  30%  31%  32%  33%  34%  35%  36%  37%  38%  39%  40%  41%  42%  43%  44%  45%  46%  47%  48%  49%  50%  51%  52%  53%  54%  55%  56%  57%  58%  59%  60%  61%  62%  63%  64%  65%  66%  67%  68%  69%  70%  71%  72%  73%  74%  75%  76%  77%  78%  79%  80%  81%  82%  83%  84%  85%  86%  87%  88%  89%  90%  91%  92%  93%  94%  95%  96%  97%  98%  99% 100%
+Info   : ACTP-0001 Activity propagation ended for stim#0
+Info   : PWRA-0001 [PwrInfo] compute_power effective options 
+       : -mode : vectorless
+       : -skip_propagation : 1
+       : -frequency_scaling_factor : 1.0
+       : -use_clock_freq : stim
+       : -stim :/stim#0
+       : -fromGenus : 1
+Info   : ACTP-0001 Timing initialization started
+Info   : ACTP-0001 Timing initialization ended
+Info   : PWRA-0002 [PwrInfo] Skipping activity propagation due to -skip_ap
+       : option....
+Warning: PWRA-0302 [PwrWarn] Frequency scaling is not applicable for vectorless
+       : flow. Ignoring frequency scaling.
+Warning: PWRA-0304 [PwrWarn] -stim option is not applicable with vectorless mode
+       : of power analysis, ignored this option.
+Info   : PWRA-0002 Started 'vectorless' power computation.
+Info   : PWRA-0009 [PwrInfo] Power Computation Progress Report :   0%   1%   2%   3%   4%   5%   6%   7%   8%   9%  10%  11%  12%  13%  14%  15%  16%  17%  18%  19%  20%  21%  22%  23%  24%  25%  26%  27%  28%  29%  30%  31%  32%  33%  34%  35%  36%  37%  38%  39%  40%  41%  42%  43%  44%  45%  46%  47%  48%  49%  50%  51%  52%  53%  54%  55%  56%  57%  58%  59%  60%  61%  62%  63%  64%  65%  66%  67%  68%  69%  70%  71%  72%  73%  74%  75%  76%  77%  78%  79%  80%  81%  82%  83%  84%  85%  86%  87%  88%  89%  90%  91%  92%  93%  94%  95%  96%  97%  98%  99% 100%
+Info   : PWRA-0002 Finished power computation.
+Info   : PWRA-0007 [PwrInfo] Completed successfully.
+       : Info=6, Warn=2, Error=0, Fatal=0
+Instance: /mult_seq
+Power Unit: W
+PDB Frames: /stim#0/frame#0
+  -------------------------------------------------------------------------
+    Category         Leakage     Internal    Switching        Total    Row%
+  -------------------------------------------------------------------------
+      memory     0.00000e+00  0.00000e+00  0.00000e+00  0.00000e+00   0.00%
+    register     2.88411e-08  1.14902e-04  2.54704e-05  1.40401e-04   3.20%
+       latch     0.00000e+00  0.00000e+00  0.00000e+00  0.00000e+00   0.00%
+       logic     2.95700e-07  6.17512e-04  3.46643e-03  4.08424e-03  93.13%
+        bbox     0.00000e+00  0.00000e+00  0.00000e+00  0.00000e+00   0.00%
+       clock     0.00000e+00  0.00000e+00  1.60704e-04  1.60704e-04   3.66%
+         pad     0.00000e+00  0.00000e+00  0.00000e+00  0.00000e+00   0.00%
+          pm     0.00000e+00  0.00000e+00  0.00000e+00  0.00000e+00   0.00%
+  -------------------------------------------------------------------------
+    Subtotal     3.24541e-07  7.32414e-04  3.65260e-03  4.38534e-03  99.99%
+  Percentage           0.01%       16.70%       83.29%      100.00% 100.00%
+  -------------------------------------------------------------------------
diff --git a/sky130_cds/synth/reports/mult_seq_qor.rep b/sky130_cds/synth/reports/mult_seq_qor.rep
new file mode 100755
index 000000000..55725b06f
--- /dev/null
+++ b/sky130_cds/synth/reports/mult_seq_qor.rep
@@ -0,0 +1,51 @@
+============================================================
+  Generated by:           Genus(TM) Synthesis Solution 20.11-s111_1
+  Generated on:           Aug 06 2022  12:33:10 pm
+  Module:                 mult_seq
+  Operating conditions:   PVT_1P8V_25C (balanced_tree)
+  Wireload mode:          enclosed
+  Area mode:              timing library
+============================================================
+
+Timing
+--------
+
+Clock  Period 
+--------------
+clk   10000.0 
+
+
+  Cost    Critical         Violating 
+ Group   Path Slack  TNS     Paths   
+-------------------------------------
+clk             0.8   0.0          0 
+default    No paths   0.0            
+-------------------------------------
+Total                 0.0          0 
+
+Instance Count
+--------------
+Leaf Instance Count             1440 
+Physical Instance count            0 
+Sequential Instance Count         32 
+Combinational Instance Count    1408 
+Hierarchical Instance Count        1 
+
+Area
+----
+Cell Area                          21346.499
+Physical Cell Area                 0.000
+Total Cell Area (Cell+Physical)    21346.499
+Net Area                           0.000
+Total Area (Cell+Physical+Net)     21346.499
+
+Max Fanout                         33 (en)
+Min Fanout                         1 (sum[0])
+Average Fanout                     2.4
+Terms to net ratio                 3.4050
+Terms to instance ratio            3.4972
+Runtime                            27.359624000000004 seconds
+Elapsed Runtime                    28 seconds
+Genus peak memory usage            1378.00 
+Innovus peak memory usage          no_value 
+Hostname                           sakuya.ecen.okstate.edu
diff --git a/sky130_cds/synth/reports/mult_seq_timing.rep b/sky130_cds/synth/reports/mult_seq_timing.rep
new file mode 100755
index 000000000..8addb3030
--- /dev/null
+++ b/sky130_cds/synth/reports/mult_seq_timing.rep
@@ -0,0 +1,196 @@
+============================================================
+  Generated by:           Genus(TM) Synthesis Solution 20.11-s111_1
+  Generated on:           Aug 06 2022  12:33:10 pm
+  Module:                 mult_seq
+  Operating conditions:   PVT_1P8V_25C (balanced_tree)
+  Wireload mode:          enclosed
+  Area mode:              timing library
+============================================================
+
+
+Path 1: MET (1 ps) Setup Check with Pin reg1/q_reg[31]/CK->D
+          Group: clk
+     Startpoint: (R) b[3]
+          Clock: (R) clk
+       Endpoint: (F) reg1/q_reg[31]/D
+          Clock: (R) clk
+
+                     Capture       Launch     
+        Clock Edge:+   10000            0     
+        Drv Adjust:+       0           34     
+       Src Latency:+       0            0     
+       Net Latency:+       0 (I)        0 (I) 
+           Arrival:=   10000           34     
+                                              
+             Setup:-     143                  
+       Uncertainty:-    1000                  
+     Required Time:=    8857                  
+      Launch Clock:-      34                  
+       Input Delay:-       0                  
+         Data Path:-    8822                  
+             Slack:=       1                  
+
+Exceptions/Constraints:
+  input_delay              0              constraints_top.sdc_line_3_28_1 
+
+#------------------------------------------------------------------------------------------------------------------------------------------
+#                Timing Point                  Flags   Arc   Edge             Cell               Fanout  Load Trans Delay Arrival Instance 
+#                                                                                                        (fF)  (ps)  (ps)   (ps)  Location 
+#------------------------------------------------------------------------------------------------------------------------------------------
+  b[3]                                         -       -     R     (arrival)                          1   5.7    33     0      34    (-,-) 
+  b[3]                                         -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  g11/Y                                        -       A->Y  R     sky130_osu_sc_18T_ms__buf_2       23 127.6   225   218     252    (-,-) 
+  n_4                                          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9135/Y       -       A->Y  F     sky130_osu_sc_18T_ms__inv_1       18  99.7   278   293     545    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_61          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g8948/Y       -       A1->Y R     sky130_osu_sc_18T_ms__aoi22_l     14  80.5   620   548    1094    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_254         -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g8843__5115/Y -       B->Y  F     sky130_osu_sc_18T_ms__nand2_1     13  72.7   354   413    1507    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_346         -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g8791__1705/Y -       A1->Y R     sky130_osu_sc_18T_ms__oai22_l      3  20.8   236   254    1760    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_391         -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g8476__3680/Y -       A->Y  R     sky130_osu_sc_18T_ms__xor2_l       1  10.5   113   170    1930    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_678         -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g8331__5115/Y -       B->Y  R     sky130_osu_sc_18T_ms__xor2_l       2  15.0   138   159    2089    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_853         -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g8243__9315/Y -       B->Y  R     sky130_osu_sc_18T_ms__xor2_l       3  22.8   186   199    2288    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_943         -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g8147__5122/Y -       B->Y  F     sky130_osu_sc_18T_ms__nor2_1       1   5.3    50    66    2354    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1000        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7934__4733/Y -       B0->Y R     sky130_osu_sc_18T_ms__aoi21_l      1   4.7    67    74    2428    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1218        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7913__4319/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      2  11.0    86    92    2519    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1240        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7901__2883/Y -       A1->Y R     sky130_osu_sc_18T_ms__aoi21_l      1   4.7    67    96    2615    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1250        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7892__7098/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      2  11.0    81    92    2707    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1259        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7890__8246/Y -       A1->Y R     sky130_osu_sc_18T_ms__aoi21_l      1   4.7    67    95    2801    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1261        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7888__1705/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      2  11.0    81    92    2893    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1263        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7886__2802/Y -       A1->Y R     sky130_osu_sc_18T_ms__aoi21_l      1   4.7    67    95    2988    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1265        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7884__3680/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      2  11.2    81    92    3080    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1267        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7883/Y       -       A->Y  R     sky130_osu_sc_18T_ms__inv_1        2  17.0    72    85    3165    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1268        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7880__8428/Y -       A1->Y F     sky130_osu_sc_18T_ms__oai21_l      2  11.0    80   101    3266    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1271        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7878__4319/Y -       A1->Y R     sky130_osu_sc_18T_ms__aoi21_l      1   4.7    71    94    3360    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1273        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7876__5107/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      2  11.0    81    93    3453    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1275        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7874__2398/Y -       A1->Y R     sky130_osu_sc_18T_ms__aoi21_l      1   4.7    67    95    3547    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1277        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7872__6417/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      2  11.0    80    92    3639    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1279        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7870__7410/Y -       A1->Y R     sky130_osu_sc_18T_ms__aoi21_l      1   4.7    67    94    3733    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1281        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7868__2346/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      2  11.0    81    92    3825    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1283        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7866__2883/Y -       A1->Y R     sky130_osu_sc_18T_ms__aoi21_l      1   4.7    67    95    3920    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1285        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7864__9315/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      2  11.0    81    92    4011    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1287        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7862__6161/Y -       A1->Y R     sky130_osu_sc_18T_ms__aoi21_l      1   4.7    67    95    4106    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1289        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7860__7482/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      2  11.2    81    92    4198    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1291        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7858__5115/Y -       B0->Y R     sky130_osu_sc_18T_ms__aoi22_l      1   4.7   129    86    4284    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1293        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7856__6131/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      2  11.0   110   111    4395    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1295        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  g9202/Y                                      -       A0->Y R     sky130_osu_sc_18T_ms__oai21_l      1   4.7   132    95    4491    (-,-) 
+  n_1404                                       -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7852__5122/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      2  11.1   110   112    4603    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1299        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  g2/Y                                         -       A1->Y R     sky130_osu_sc_18T_ms__oai21_l      1   4.7   151   115    4718    (-,-) 
+  n_1403                                       -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7848__1617/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      2  11.2   111   119    4837    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1303        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7846__3680/Y -       B0->Y R     sky130_osu_sc_18T_ms__aoi22_l      1   4.7   128    96    4932    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1305        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7844__5526/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      3  22.5   170   149    5082    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1307        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9189/Y       -       A1->Y R     sky130_osu_sc_18T_ms__oai21_l      1   4.2    78   132    5213    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_10          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9188/Y       -       A->Y  F     sky130_osu_sc_18T_ms__inv_l        1   5.3    35    52    5265    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_9           -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7840__4319/Y -       B0->Y R     sky130_osu_sc_18T_ms__aoi21_l      3  22.3   188   155    5420    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1309        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9187/Y       -       A0->Y F     sky130_osu_sc_18T_ms__aoi21_l      1   4.2    64   102    5522    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_12          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9186/Y       -       A->Y  R     sky130_osu_sc_18T_ms__inv_l        1   4.7    39    56    5578    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_11          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7836__5107/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      3  22.4   129   119    5697    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1311        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9185/Y       -       A0->Y R     sky130_osu_sc_18T_ms__oai21_l      1   4.2    79    99    5796    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_14          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9184/Y       -       A->Y  F     sky130_osu_sc_18T_ms__inv_l        1   5.3    36    52    5848    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_13          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7832__5477/Y -       B0->Y R     sky130_osu_sc_18T_ms__aoi21_l      3  22.3   188   155    6003    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1313        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9183/Y       -       A0->Y F     sky130_osu_sc_18T_ms__aoi21_l      1   4.2    65   102    6105    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_16          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9182/Y       -       A->Y  R     sky130_osu_sc_18T_ms__inv_l        1   4.7    39    56    6161    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_15          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7828__7410/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      3  22.4   129   120    6281    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1315        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9181/Y       -       A0->Y R     sky130_osu_sc_18T_ms__oai21_l      1   4.2    80    99    6380    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_18          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9180/Y       -       A->Y  F     sky130_osu_sc_18T_ms__inv_l        1   5.3    36    52    6432    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_17          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7824__2346/Y -       B0->Y R     sky130_osu_sc_18T_ms__aoi21_l      3  22.3   191   155    6587    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1317        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9179/Y       -       A0->Y F     sky130_osu_sc_18T_ms__aoi21_l      1   4.2    65   103    6690    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_20          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9178/Y       -       A->Y  R     sky130_osu_sc_18T_ms__inv_l        1   4.7    39    56    6746    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_19          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7820__9945/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      3  22.4   129   120    6866    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1319        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9177/Y       -       A0->Y R     sky130_osu_sc_18T_ms__oai21_l      1   4.2    88    99    6965    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_22          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9176/Y       -       A->Y  F     sky130_osu_sc_18T_ms__inv_l        1   5.3    38    54    7018    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_21          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7816__6161/Y -       B0->Y R     sky130_osu_sc_18T_ms__aoi21_l      3  22.3   188   156    7174    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1321        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9175/Y       -       A0->Y F     sky130_osu_sc_18T_ms__aoi21_l      1   4.2    65   102    7276    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_24          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9174/Y       -       A->Y  R     sky130_osu_sc_18T_ms__inv_l        1   4.7    39    56    7332    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_23          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7812__7482/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      3  22.4   129   120    7452    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1323        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9173/Y       -       A0->Y R     sky130_osu_sc_18T_ms__oai21_l      1   4.2    80    99    7551    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_26          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9172/Y       -       A->Y  F     sky130_osu_sc_18T_ms__inv_l        1   5.3    36    52    7603    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_25          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7808__1881/Y -       B0->Y R     sky130_osu_sc_18T_ms__aoi21_l      3  22.3   191   155    7758    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1325        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9171/Y       -       A0->Y F     sky130_osu_sc_18T_ms__aoi21_l      1   4.2    65   103    7861    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_28          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9170/Y       -       A->Y  R     sky130_osu_sc_18T_ms__inv_l        1   4.7    39    56    7917    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_27          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7804__7098/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      3  22.4   129   120    8036    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1327        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9169/Y       -       A0->Y R     sky130_osu_sc_18T_ms__oai21_l      1   4.2    88    99    8136    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_30          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g9168/Y       -       A->Y  F     sky130_osu_sc_18T_ms__inv_l        1   5.3    38    54    8189    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_29          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7800__5122/Y -       B0->Y R     sky130_osu_sc_18T_ms__aoi21_l      3  22.3   191   156    8345    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1329        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g2/Y          -       A0->Y F     sky130_osu_sc_18T_ms__aoi21_l      1   4.2    70   103    8448    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_32          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g3/Y          -       A->Y  R     sky130_osu_sc_18T_ms__inv_l        1   4.7    40    57    8505    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_31          -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7796__2802/Y -       B0->Y F     sky130_osu_sc_18T_ms__oai21_l      1  11.4    87    84    8590    (-,-) 
+  csa_tree_add1_add_30_16_groupi_n_1331        -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  csa_tree_add1_add_30_16_groupi_g7795__1617/Y -       A->Y  F     sky130_osu_sc_18T_ms__xor2_l       1   5.7    66   115    8705    (-,-) 
+  sum[31]                                      -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  reg1/g160__5526/Y                            -       B0->Y R     sky130_osu_sc_18T_ms__aoi22_l      1   5.8   172    87    8791    (-,-) 
+  reg1/n_30                                    -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  reg1/g127__2398/Y                            -       B->Y  F     sky130_osu_sc_18T_ms__nor2_1       1   5.6   111    64    8856    (-,-) 
+  reg1/n_63                                    -       -     -     (net)                              -     -     -     -       -    (-,-) 
+  reg1/q_reg[31]/D                             <<<     -     F     sky130_osu_sc_18T_ms__dff_l        1     -     -     0    8856    (-,-) 
+#------------------------------------------------------------------------------------------------------------------------------------------
+
diff --git a/sky130_cds/synth/reports/mult_seq_timing_summary.rep b/sky130_cds/synth/reports/mult_seq_timing_summary.rep
new file mode 100755
index 000000000..ab1f59776
--- /dev/null
+++ b/sky130_cds/synth/reports/mult_seq_timing_summary.rep
@@ -0,0 +1,26 @@
+============================================================
+  Generated by:           Genus(TM) Synthesis Solution 20.11-s111_1
+  Generated on:           Aug 06 2022  12:33:10 pm
+  Module:                 mult_seq
+  Operating conditions:   PVT_1P8V_25C (balanced_tree)
+  Wireload mode:          enclosed
+  Area mode:              timing library
+============================================================
+
+# SETUP                  WNS  TNS    FEP 
+# -----------------------------------------
+ View: ALL               0.8  0.0      0 
+    Group : in2out       N/A  N/A    N/A 
+    Group : in2reg       0.8  0.0      0 
+    Group : reg2out   8462.7  0.0      0 
+    Group : reg2reg    199.7  0.0      0 
+
+# -----------------------------------------
+# DRV                        WNS  TNS  FEP 
+# -------------------------------------------
+ View: ALL                                 
+    Check: max_transition    N/A  N/A    0 
+    Check: max_capacitance   N/A  N/A    0 
+    Check: max_fanout        N/A  N/A    0 
+
+# -------------------------------------------