| ;; Copyright 2019-2021 SkyWater PDK Authors |
| ;; |
| ;; 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 |
| ;; |
| ;; https://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. |
| ;; |
| ;; This code is *alternatively* available under a BSD-3-Clause license, see |
| ;; details in the README.md at the top level and the license text at |
| ;; https://github.com/google/skywater-pdk-libs-sky130_bag3_pr/blob/master/LICENSE.alternative |
| ;; |
| ;; SPDX-License-Identifier: BSD-3-Clause OR Apache 2.0 |
| |
| ;; This skill file compiles schematic PCells for BAG primitives |
| |
| lib_obj = ddGetObj("BAG_prim") |
| |
| {% for mtype, threshold, model, model_thres, w_def, l_def in mos_list %} |
| ; {{ mtype }}_{{ threshold }}/{{ model_thres }} |
| pcDefinePCell( |
| list( lib_obj "{{ mtype }}_{{ threshold }}" "schematic" "schematic") |
| ((w string "{{ w_def }}") |
| (l string "{{ l_def }}") |
| (nf string "1") |
| ) |
| let((inst iopin_master io_net io_pin) |
| wval = cdfParseFloatString(w) * 1e6 |
| lval = cdfParseFloatString(l) * 1e6 |
| nval = atoi(nf) |
| inst = dbCreateParamInstByMasterName( pcCellView "{{ tech_lib }}" "{{ model }}" "symbol" |
| "N0" -0.375:0 "R0" 1 |
| list(list("hspiceModel" "string" "{{ model_thres }}") |
| list("hspiceModelMenu" "string" "{{ model_thres }}") |
| list("w" "string" sprintf(nil "%0.2f" wval)) |
| list("{{ model_thres }}_l0_w" "string" sprintf(nil "%0.2f" wval)) |
| list("l" "string" sprintf(nil "%0.2f" lval)) |
| list("{{ model_thres }}_l" "string" sprintf(nil "%0.2f" lval)) |
| list("m" "string" nf) |
| list("totalW" "string" sprintf(nil "%0.2f" wval * nval))) |
| ) |
| iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r") |
| io_net = dbCreateNet(pcCellView "D") |
| io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "D" -0.5:0.5625 "R0") |
| "D" dbCreateTerm(io_net "D" "inputOutput")) |
| dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "d")) |
| io_net = dbCreateNet(pcCellView "G") |
| io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "G" -0.875:0 "R0") |
| "G" dbCreateTerm(io_net "G" "inputOutput")) |
| dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "g")) |
| io_net = dbCreateNet(pcCellView "S") |
| io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "S" -0.5:-0.5 "R0") |
| "S" dbCreateTerm(io_net "S" "inputOutput")) |
| dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "s")) |
| io_net = dbCreateNet(pcCellView "B") |
| io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "B" 0.125:0 "R0") |
| "B" dbCreateTerm(io_net "B" "inputOutput")) |
| dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "b")) |
| ) |
| ) |
| {% endfor %} |
| |
| {% for intent, model, w_def, l_def in res_list %} |
| ; res_{{ intent }}/{{ model }} |
| pcDefinePCell( |
| list( lib_obj "res_{{ intent }}" "schematic" "schematic") |
| ((w string "{{ w_def }}") |
| (l string "{{ l_def }}") |
| ) |
| let((inst iopin_master io_net io_pin) |
| wval = cdfParseFloatString(w) * 1e6 |
| lval = cdfParseFloatString(l) * 1e6 |
| wstr = sprintf(nil "%0.3f" wval) |
| lstr = sprintf(nil "%0.3f" lval) |
| inst = dbCreateParamInstByMasterName( pcCellView "{{ tech_lib }}" "{{ model }}" "symbol" |
| "R0" 0.5:0 "R270" 1 |
| list(list("segW" "string" wstr) |
| list("w" "string" wstr) |
| list("segL" "string" lstr) |
| list("l" "string" lstr) |
| list("rCalcMethod" "string" "Segment Length") |
| ) |
| ) |
| iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r") |
| io_net = dbCreateNet(pcCellView "PLUS") |
| io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "PLUS" 1:0 "R0") |
| "PLUS" dbCreateTerm(io_net "PLUS" "inputOutput")) |
| dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "PLUS")) |
| io_net = dbCreateNet(pcCellView "MINUS") |
| io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "MINUS" -0.15:0 "R0") |
| "MINUS" dbCreateTerm(io_net "MINUS" "inputOutput")) |
| dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "MINUS")) |
| io_net = dbCreateNet(pcCellView "BULK") |
| io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "BULK" -0.15:-0.4 "R0") |
| "BULK" dbCreateTerm(io_net "BULK" "inputOutput")) |
| dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "B")) |
| ) |
| ) |
| {% endfor %} |
| |
| {% for layer in res_metal_list %} |
| ; res_metal_{{ layer }}/mrm{{ layer }} |
| pcDefinePCell( |
| list( lib_obj "res_metal_{{ layer }}" "schematic" "schematic") |
| ((w string "{{ res_metal_w_default }}") |
| (l string "{{ res_metal_l_default }}") |
| ) |
| let((inst iopin_master io_net io_pin) |
| wval = cdfParseFloatString(w) * 1e6 |
| lval = cdfParseFloatString(l) * 1e6 |
| wstr = sprintf(nil "%0.3f" wval) |
| lstr = sprintf(nil "%0.3f" lval) |
| inst = dbCreateParamInstByMasterName( pcCellView "{{ tech_lib }}" "res" "symbol" |
| "R0" 0.1:0 "R90" 1 |
| list(list("resistorTypr" "string" "met{{ layer }}") |
| list("rw" "string" wstr) |
| list("rl" "string" lstr) |
| list("model" "string" "mrm{{ layer }}") |
| ) |
| ) |
| |
| iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r") |
| io_net = dbCreateNet(pcCellView "PLUS") |
| io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "PLUS" -0.15:0 "R0") |
| "PLUS" dbCreateTerm(io_net "PLUS" "inputOutput")) |
| dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "r0")) |
| io_net = dbCreateNet(pcCellView "MINUS") |
| io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "MINUS" 1.15:0 "R0") |
| "MINUS" dbCreateTerm(io_net "MINUS" "inputOutput")) |
| dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "r1")) |
| ) |
| ) |
| {% endfor %} |
| |
| |
| {% for dtype, intent, model in dio_list %} |
| ; {{ dtype }}_{{ intent }}/{{ model }} |
| pcDefinePCell( |
| list( lib_obj "{{ dtype }}_{{ intent }}" "schematic" "schematic") |
| ((w string "{{ dio_w_default }}") |
| (l string "{{ dio_l_default }}") |
| ) |
| let((inst iopin_master io_net io_pin wval lval dio_w dio_l) |
| wval = atoi(w) |
| lval = atoi(l) |
| dio_w = (wval - 1)*48 + 14 |
| dio_l = (lval + 1)*86 - 18 |
| |
| inst = dbCreateParamInstByMasterName( pcCellView "{{ tech_lib }}" "{{ model }}" "symbol" |
| "R0" 0.1:0 "R90" 1 |
| list(list("nfin" "string" w) |
| list("fw" "string" sprintf(nil "%dn" dio_w)) |
| list("nf" "string" l) |
| list("dl" "string" sprintf(nil "%dn" dio_l)) |
| list("m" "string" "1") |
| list("area" "float" dio_w*dio_l*1e-18) |
| list("pj" "float" 2*1e-9*(dio_w + dio_l)) |
| ) |
| ) |
| |
| iopin_master = dbOpenCellViewByType("basic" "iopin" "symbolr" nil "r") |
| io_net = dbCreateNet(pcCellView "PLUS") |
| io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "PLUS" -0.15:0 "R0") |
| "PLUS" dbCreateTerm(io_net "PLUS" "inputOutput")) |
| dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "PLUS")) |
| io_net = dbCreateNet(pcCellView "MINUS") |
| io_pin = dbCreatePin(io_net dbCreateInst(pcCellView iopin_master "MINUS" 1.15:0 "R0") |
| "MINUS" dbCreateTerm(io_net "MINUS" "inputOutput")) |
| dbCreateInstTerm(io_net inst dbFindTermByName(inst~>master "MINUS")) |
| ) |
| ) |
| {% endfor %} |