From 9d7bc55291b0ddf1d4477295516b4e5991a1c697 Mon Sep 17 00:00:00 2001 From: Aquiles Viza Date: Fri, 22 Sep 2023 04:02:53 -0300 Subject: [PATCH] Added new image stage --- base/desktop.Dockerfile | 2 +- compile.bat | 4 +- run.bat | 2 +- stacks/analog-tools/Dockerfile | 12 + stacks/analog-tools/scripts/.bashrc | 29 ++ .../scripts/iic-spice-model-red.py | 133 +++++++ .../analog-tools/scripts/install-open-pdks.sh | 63 ++++ stacks/analog-tools/scripts/xschemrc | 336 ++++++++++++++++++ 8 files changed, 577 insertions(+), 4 deletions(-) create mode 100644 stacks/analog-tools/Dockerfile create mode 100644 stacks/analog-tools/scripts/.bashrc create mode 100644 stacks/analog-tools/scripts/iic-spice-model-red.py create mode 100644 stacks/analog-tools/scripts/install-open-pdks.sh create mode 100644 stacks/analog-tools/scripts/xschemrc diff --git a/base/desktop.Dockerfile b/base/desktop.Dockerfile index 7bb9ac6..5648cb1 100644 --- a/base/desktop.Dockerfile +++ b/base/desktop.Dockerfile @@ -6,7 +6,7 @@ FROM greyltc/archlinux-aur:paru RUN pacman -Syuq --noconfirm # Install packages -RUN aur-install sudo git git-lfs python python-pip python-pipx xz gnu-free-fonts vim ngspice gedit jupyter-lab xterm +RUN aur-install sudo git git-lfs python python-pip python-pipx xz gnu-free-fonts vim ngspice gedit jupyterlab xterm # Clean cache RUN pacman -Scc diff --git a/compile.bat b/compile.bat index c28922b..a5971d0 100644 --- a/compile.bat +++ b/compile.bat @@ -32,8 +32,8 @@ SET CALL=call %CALL% docker build --rm -t osicstacks-base-desktop -f base/desktop.Dockerfile . %CALL% docker build --rm -t osicstacks-base-web -f base/web.Dockerfile . - %CALL% docker build --rm --build-arg BASE_IMG=osicstacks-base-web --target %STACK%-desktop -t %DOCKER_USER%/%STACK%:latest -f stacks/%STACK%.Dockerfile . - ::%CALL% docker build --rm --build-arg BASE_IMG=%DOCKER_USER%/%STACK%:latest -t %TAG% -f stacks/analog/Dockerfile + %CALL% docker build --rm --build-arg BASE_IMG=osicstacks-base-web --target %STACK%-web -t %DOCKER_USER%/%STACK%:latest -f stacks/%STACK%.Dockerfile . + %CALL% docker build --rm --build-arg BASE_IMG=%DOCKER_USER%/%STACK%:latest -t %TAG% -f stacks/analog-tools/Dockerfile GOTO end :end diff --git a/run.bat b/run.bat index 1b5eccb..80e7b7a 100644 --- a/run.bat +++ b/run.bat @@ -2,6 +2,7 @@ setlocal SET IMAGE=akilesalreadytaken/analog-xk:latest +SET IMAGE=akilesalreadytaken/analog-tools:latest SET CALL=call :parse @@ -104,7 +105,6 @@ SET CALL=call @REM SET COMMAND=jupyter-lab --no-browser @REM SET COMMAND=sudo vncserver -select-de xfce @REM SET COMMAND=sleep infinity - @REM SET COMMAND=bash @echo on %CALL% docker run %PARAMS% %IMAGE% %COMMAND% diff --git a/stacks/analog-tools/Dockerfile b/stacks/analog-tools/Dockerfile new file mode 100644 index 0000000..18904a0 --- /dev/null +++ b/stacks/analog-tools/Dockerfile @@ -0,0 +1,12 @@ +ARG BASE_IMG=analog-xk +FROM $BASE_IMG as analog-tools + +# Add scripts +COPY scripts/* . + +RUN ./install-open-pdks.sh + +RUN rm *.sh + +# Initialize the enviroment keeping container alive +CMD ["sleep", "infinity"] \ No newline at end of file diff --git a/stacks/analog-tools/scripts/.bashrc b/stacks/analog-tools/scripts/.bashrc new file mode 100644 index 0000000..bb92fd1 --- /dev/null +++ b/stacks/analog-tools/scripts/.bashrc @@ -0,0 +1,29 @@ +[[ $- != *i* ]] && return + +case "$PDK" in +gf180mcuC) + export PDKPATH=$PDK_ROOT/$PDK + export STD_CELL_LIBRARY=gf180mcu_fd_sc_mcu7t5v0 + ;; +sky130A) + export PDKPATH=$PDK_ROOT/$PDK + export STD_CELL_LIBRARY=sky130_fd_sc_hd + ;; +*) + echo "PDK not defined, using default one (gf180mcuC)" + export PDK=gf180mcuC + export PDKPATH=$PDK_ROOT/$PDK + export STD_CELL_LIBRARY=gf180mcu_fd_sc_mcu7t5v0 + ;; +esac + + +alias ls="ls --color=auto -XA" +alias grep="grep --color=auto" + +PS1="[\u@\h \W]\$ " + +## Tools Support + +alias xschem='xschem -b --rcfile $PDKPATH/libs.tech/xschem/xschemrc' +alias xschemtcl='xschem --rcfile $PDKPATH/libs.tech/xschem/xschemrc' \ No newline at end of file diff --git a/stacks/analog-tools/scripts/iic-spice-model-red.py b/stacks/analog-tools/scripts/iic-spice-model-red.py new file mode 100644 index 0000000..544b4e0 --- /dev/null +++ b/stacks/analog-tools/scripts/iic-spice-model-red.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python3 +# ======================================================================== +# SPDX-FileCopyrightText: 2021-2022 Harald Pretl +# Johannes Kepler University, Institute for Integrated Circuits +# +# 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. +# SPDX-License-Identifier: Apache-2.0 +# +# This script traverses SPICE model files (e.g. from SKY130) and +# extracts only the wanted model section, removes all comments and +# empty lines, and resolves all includes so that a flat model file +# results. This should speed up ngspice starts. +# ======================================================================== + +import sys,re,os + +def process_file(file_in_name, top_file): + global is_warning + try: + f_in = open(file_in_name, 'r') + except FileNotFoundError: + print('Warning! File ' + file_in_name + ' not found.') + is_warning = True + return; + + # process_file can be called recursively, so that nested include + # files can be traversed + + # write_active indicates whether we are in the right model section; in + # include files, it is always true + + if top_file == True: + write_active = False + else: + write_active = True + + for line in f_in: + line_trim = (line.lower()).strip() + + if top_file == True: + # we assume that .lib statements are only used in the main file + if '.lib' in line_trim: + if model_section in line_trim: + write_active = True + else: + write_active = False + + if '.endl' == line_trim: + write_active = False + f_out.write(line) + + if len(line_trim) > 0: # write no empty lines + if (line_trim[0] != '*'): # write no comments + if (write_active == True): + if '.include' in line_trim: + # need to save and restore working dir so that nested + # includes work + current_wd = os.getcwd() + newfile = re.findall(r'"(.*?)(? 0: + try: + os.chdir(new_wd) + except OSError: + print('Warning: Could not enter directory ' + new_wd) + is_warning = True + + # traverse into new include file + new_file_name = os.path.basename(newfile[0]) + process_file(new_file_name, False) + + # restore old working dir after return + os.chdir(current_wd) + else: + f_out.write(line) + + f_in.close() + return; + +# main routine + +if len(sys.argv) == 3: + model_section = sys.argv[2] +else: + model_section = 'tt' + +if (len(sys.argv) == 2) or (len(sys.argv) == 3): + infile_name = sys.argv[1] + outfile_name = infile_name + '.' + model_section + '.red' + + try: + f_out = open(outfile_name, 'w') + except OSError: + print('Error: Cannot write file ' + outfile_name + '.') + sys.exit(1) + + is_warning = False + process_file(infile_name, True) + f_out.close() + + print() + print('Model file ' + outfile_name + ' written.') + if is_warning == True: + print('There have been warnings! Please check output log.') + sys.exit(0) + else: + sys.exit(0) +else: + print() + print('iic-spice-model-red.py SPICE model file reducer') + print(' (c) 2021 Harald Pretl, JKU') + print() + print('Usage: iic-spice-model-red [corner] (default corner = tt)') + print() + print('Return codes for script automation:') + print(' 0 = all OK or warnings') + print(' 1 = errors') + print(' 2 = call of script w/o parameters (= showing this message)') + print() + sys.exit(2) diff --git a/stacks/analog-tools/scripts/install-open-pdks.sh b/stacks/analog-tools/scripts/install-open-pdks.sh new file mode 100644 index 0000000..48727d0 --- /dev/null +++ b/stacks/analog-tools/scripts/install-open-pdks.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +set -e + +if [ -d xschemrc ]; then + echo File xschemrc not found + return -1 +fi + +export OPEN_PDKS_VERSION="dd7771c384ed36b91a25e9f8b314355fc26561be" +export SCRIPT_DIR=. + +#################### +# INSTALL SKY130 PDK +#################### + +volare enable "${OPEN_PDKS_VERSION}" --pdk sky130 + +# remove version sky130B to save space (efabless TO use mostly sky130A) +rm -rf "$PDK_ROOT"/volare/sky130/versions/*/sky130B +rm -rf "$PDK_ROOT"/sky130B + +if [ -d "$PDK_ROOT/sky130A" ]; then + # apply SPICE mode file reduction (for the variants that exist) + # add custom IIC bind keys to magicrc + + cd "$PDK_ROOT/sky130A/libs.tech/ngspice" || exit 1 + "$SCRIPT_DIR/iic-spice-model-red.py" sky130.lib.spice tt + "$SCRIPT_DIR/iic-spice-model-red.py" sky130.lib.spice ss + "$SCRIPT_DIR/iic-spice-model-red.py" sky130.lib.spice ff + + # FIXME: Repair klayout tech file + sed -i 's/>sky130sky130A/c\ ' "$PDK_ROOT/sky130A/libs.tech/klayout/tech/sky130A.lyt" + # shellcheck disable=SC2016 + sed -i '//c\ $PDK_ROOT/$PDK/libs.tech/klayout' "$PDK_ROOT/sky130A/libs.tech/klayout/tech/sky130A.lyt" +fi + +###################### +# INSTALL GF180MCU PDK +###################### + +volare enable "${OPEN_PDKS_VERSION}" --pdk gf180mcu + +if [ -d "$PDK_ROOT/sky130A" ]; then + + rm -rf $PDK_ROOT/volare/gf180mcu/versions/*/gf180mcuA + rm -rf $PDK_ROOT/volare/gf180mcu/versions/*/gf180mcuB + rm -rf $PDK_ROOT/volare/gf180mcu/versions/*/gf180mcuD + rm -rf $PDK_ROOT/gf180mcuA + rm -rf $PDK_ROOT/gf180mcuB + rm -rf $PDK_ROOT/gf180mcuD + + mv $KLAYOUT_HOME/pymacros temp + mkdir $KLAYOUT_HOME/pymacros + mv temp $KLAYOUT_HOME/pymacros/cells + mv $KLAYOUT_HOME/tech/gf180mcu.lym $KLAYOUT_HOME/pymacros + + mv xschemrc $PDK_ROOT/$PDK/libs.tech/xschem/xschemrc +fi + +rm -rf $SCRIPT_DIR/iic-spice-model-red.py \ No newline at end of file diff --git a/stacks/analog-tools/scripts/xschemrc b/stacks/analog-tools/scripts/xschemrc new file mode 100644 index 0000000..193a5c4 --- /dev/null +++ b/stacks/analog-tools/scripts/xschemrc @@ -0,0 +1,336 @@ +#### xschemrc system configuration file + +#### values may be overridden by user's ~/.xschem/xschemrc configuration file +#### or by project-local ./xschemrc + +########################################################################### +#### XSCHEM INSTALLATION DIRECTORY: XSCHEM_SHAREDIR +########################################################################### +#### Normally there is no reason to set this variable if using standard +#### installation. Location of files is set at compile time but may be overridden +#### with following line: +# set XSCHEM_SHAREDIR $env(HOME)/share/xschem + +########################################################################### +#### XSCHEM SYSTEM-WIDE DESIGN LIBRARY PATHS: XSCHEM_LIBRARY_PATH +########################################################################### +#### If unset xschem starts with XSCHEM_LIBRARY_PATH set to the default, typically: +# /home/schippes/.xschem/xschem_library +# /home/schippes/share/xschem/xschem_library/devices +# /home/schippes/share/doc/xschem/examples +# /home/schippes/share/doc/xschem/ngspice +# /home/schippes/share/doc/xschem/logic +# /home/schippes/share/doc/xschem/xschem_simulator +# /home/schippes/share/doc/xschem/binto7seg +# /home/schippes/share/doc/xschem/pcb +# /home/schippes/share/doc/xschem/rom8k + +#### Flush any previous definition +set XSCHEM_LIBRARY_PATH {} +#### include devices/*.sym +append XSCHEM_LIBRARY_PATH ${XSCHEM_SHAREDIR}/xschem_library +#### include skywater libraries. Here i use [pwd]. This works if i start xschem from here. +append XSCHEM_LIBRARY_PATH :$env(PDK_ROOT)/$env(PDK)/libs.tech/xschem +# append XSCHEM_LIBRARY_PATH :/mnt/sda7/home/schippes/pdks/sky130A/libs.tech/xschem +#### add ~/.xschem/xschem_library (USER_CONF_DIR is normally ~/.xschem) +append XSCHEM_LIBRARY_PATH :$USER_CONF_DIR/xschem_library + +########################################################################### +#### SET CUSTOM COLORS FOR XSCHEM LIBRARIES MATCHING CERTAIN PATTERNS +########################################################################### +#### each line contains a dircolor(pattern) followed by a color +#### color can be an ordinary name (grey, brown, blue) or a hex code {#77aaff} +#### hex code must be enclosed in braces +array unset dircolor +set dircolor(xschem_examples$) blue +set dircolor(xschem_180MCU_PDK$) blue +set dircolor(xschem_library$) red +set dircolor(devices$) red + +########################################################################### +#### WINDOW TO OPEN ON STARTUP: XSCHEM_START_WINDOW +########################################################################### +#### Start without a design if no filename given on command line: +#### To avoid absolute paths, use a path that is relative to one of the +#### XSCHEM_LIBRARY_PATH directories. Default: empty +set XSCHEM_START_WINDOW {tests/0_top.sch} + +########################################################################### +#### DIRECTORY WHERE SIMULATIONS, NETLIST AND SIMULATOR OUTPUTS ARE PLACED +########################################################################### +#### If unset $USER_CONF_DIR/simulations is assumed (normally ~/.xschem/simulations) +# set netlist_dir $env(HOME)/.xschem/simulations + +########################################################################### +#### NETLIST AND HIERARCHICAL PRINT EXCLUDE PATTERNS +########################################################################### +#### xschem_libs is a list of patterns of cells to exclude from netlisting. +#### Matching is done as regular expression on full cell path +#### Example: +#### set xschem_libs { {/cmoslib/} {/analoglib/.*pass} buffer } +#### in this case all schematic cells of directory cmoslib and cells containing +#### /analoglib/...pass and buffer will be excluded from netlisting +#### default value: empty +# set xschem_libs {} +#### noprint_libs is a list with same rules as for xschem_libs. This +#### variable controls hierarchical print +#### default value: empty +# set noprint_libs {} + +########################################################################### +#### CHANGE DEFAULT [] WITH SOME OTHER CHARACTERS FOR BUSSED SIGNALS +#### IN SPICE NETLISTS (EXAMPLE: DATA[7] --> DATA<7>) +########################################################################### +#### default: empty (use xschem default, [ ]) +# set bus_replacement_char {<>} +#### for XSPICE: replace square brackets as the are used for XSPICE vector nodes. +# set bus_replacement_char {__} + +########################################################################### +#### SOME DEFAULT BEHAVIOR +########################################################################### +#### Allowed values: spice, verilog, vhdl, tedax, default: spice +# set netlist_type spice + +#### Some netlisting options (these are the defaults) +# set hspice_netlist 1 +# set verilog_2001 1 + +#### to use a fixed line with set change_lw to 0 and set some value to line_width +#### these are the defaults +# set line_width 0 +# set change_lw 1 + +#### allow color postscript and svg exports. Default: 1, enable color +# set color_ps 1 + +#### initial size of xschem window you can specify also position with (wxh+x+y) +#### this is the default: +# set initial_geometry {900x600} + +#### if set to 0, when zooming out allow the viewport do drift toward the mouse position, +#### allowing to move away by zooming / unzooming with mouse wheel +#### default setting: 0 +# set unzoom_nodrift 0 + +#### if set to 1 allow to place multiple components with same name. +#### Warning: this is normally not allowed in any simulation netlist. +#### default: 0, do not allow place multiple elements with same name (refdes) +# set disable_unique_names 0 + +#### if set to 1 continue drawing lines / wires after click +#### default: 0 +# set persistent_command 1 + +#### if set to 1 a wire is inserted when separating components that are +#### connected by pins. Default: not enabled (0) +# set connect_by_kissing 1 + +#### if set to 1 automatically join/trim wires while editing +#### this may slow down on rally big designs. Can be disabled via menu +#### default: 0 +# set autotrim_wires 0 + +#### set widget scaling (mainly for font display), this is useful on 4K displays +#### default: unset (tk uses its default) > 1.0 ==> bigger +# set tk_scaling 1.7 + +#### disable some symbol layers. Default: none, all layers are visible. +# set enable_layer(5) 0 ;# example to disable pin red boxes + +#### enable to scale grid point size as done with lines at close zoom, default: 0 +# set big_grid_points 0 + +########################################################################### +#### EXPORT FORMAT TRANSLATORS, PNG AND PDF +########################################################################### +#### command to translate xpm to png; (assumes command takes source +#### and dest file as arguments, example: gm convert plot.xpm plot.png) +#### default: {gm convert} +# set to_png {gm convert} + +#### command to translate ps to pdf; (assumes command takes source +#### and dest file as arguments, example: ps2pdf plot.ps plot.pdf) +#### default: ps2pdf +# set to_pdf ps2pdf +set to_pdf {ps2pdf -dAutoRotatePages=/None} + +########################################################################### +#### UNDO: SAVE ON DISK OR KEEP IN MEMORY +########################################################################### +#### Alloved: 'disk'or 'memory'. +#### Saving undo on disk is safer but slower on extremely big schematics. +#### In most cases you won't notice any delay. Undo on disk allows previous +#### state recovery in case of crashes. In-memory undo is extremely fast +#### but should a crash occur everything is lost. +#### It is highly recommended to keep undo on disk. +#### Default: disk +# set undo_type disk + +########################################################################### +#### CUSTOM GRID / SNAP VALUE SETTINGS +########################################################################### +#### Warning: changing these values will likely break compatibility +#### with existing symbol libraries. Defaults: grid 20, snap 10. +# set grid 20 +# set snap 10 + +########################################################################### +#### CUSTOM COLORS MAY BE DEFINED HERE +########################################################################### +# set cadlayers 22 +# set light_colors { +# "#ffffff" "#0044ee" "#aaaaaa" "#222222" "#229900" +# "#bb2200" "#00ccee" "#ff0000" "#888800" "#00aaaa" +# "#880088" "#00ff00" "#0000cc" "#666600" "#557755" +# "#aa2222" "#7ccc40" "#00ffcc" "#ce0097" "#d2d46b" +# "#ef6158" "#fdb200" } + +# set dark_colors { +# "#000000" "#00ccee" "#3f3f3f" "#cccccc" "#88dd00" +# "#bb2200" "#00ccee" "#ff0000" "#ffff00" "#ffffff" +# "#ff00ff" "#00ff00" "#0000cc" "#aaaa00" "#aaccaa" +# "#ff7777" "#bfff81" "#00ffcc" "#ce0097" "#d2d46b" +# "#ef6158" "#fdb200" } + +########################################################################### +#### CAIRO STUFF +########################################################################### +#### Scale all fonts by this number +# set cairo_font_scale 1.0 + +#### default for following two is 0.85 (xscale) and 0.88 (yscale) to +#### match cairo font spacing +# set nocairo_font_xscale 1.0 +#### set nocairo_font_yscale 1.0 + +#### Scale line spacing by this number +# set cairo_font_line_spacing 1.0 + +#### Specify a font +# set cairo_font_name {Sans-Serif} +# set svg_font_name {Sans-Serif} + +#### Lift up text by some zoom-corrected pixels for +#### better compatibility wrt no cairo version. +#### Useful values in the range [-1, 3] +# set cairo_vert_correct 0 +# set nocairo_vert_correct 0 + +########################################################################### +#### KEYBINDINGS +########################################################################### +#### General format for specifying a replacement for a keybind +#### Replace Ctrl-d with Escape (so you wont kill the program) +# set replace_key(Control-d) Escape + +#### swap w and W keybinds; Always specify Shift for capital letters +# set replace_key(Shift-W) w +# set replace_key(w) Shift-W + +########################################################################### +#### TERMINAL +########################################################################### +#### default for linux: xterm +# set terminal {xterm -geometry 100x35 -fn 9x15 -bg black -fg white -cr white -ms white } +#### lxterminal is not OK since it will not inherit env vars: +#### In order to reduce memory usage and increase the performance, all instances +#### of the lxterminal are sharing a single process. LXTerminal is part of LXDE + +########################################################################### +#### EDITOR +########################################################################### +#### editor must not detach from launching shell (-f mandatory for gvim) +#### default for linux: gvim -f +# set editor {gvim -f -geometry 90x28} +# set editor { xterm -geometry 100x40 -e nano } +# set editor { xterm -geometry 100x40 -e pico } + +#### For Windows +# set editor {notepad.exe} + +########################################################################### +#### SHOW ERC INFO WINDOW (erc errors, warnings etc) +########################################################################### +#### default: 0 (can be enabled by menu) +# set show_infowindow 0 + +########################################################################### +#### CONFIGURE COMPUTER FARM JOB REDIRECTORS FOR SIMULATIONS +########################################################################### +#### RTDA NC +# set computerfarm {nc run -Il} +#### LSF BSUB +# set computerfarm {bsub -Is} + +########################################################################### +#### TCP CONNECTION WITH GAW +########################################################################### +#### set gaw address for socket connection: {host port} +#### default: set to localhost, port 2020 +# set gaw_tcp_address {localhost 2020} + +########################################################################### +#### XSCHEM LISTEN TO TCP PORT +########################################################################### +#### set xschem listening port; default: not enabled +# set xschem_listen_port 2021 + +########################################################################### +#### BESPICE WAVE SOCKET CONNECTION +########################################################################### +#### set bespice wave listening port; default: not enabled +set bespice_listen_port 2022 + +########################################################################### +#### TCL FILES TO LOAD AT STARTUP +########################################################################### +#### list of tcl files to preload. +# lappend tcl_files ${XSCHEM_SHAREDIR}/change_index.tcl +lappend tcl_files ${XSCHEM_SHAREDIR}/ngspice_backannotate.tcl + +########################################################################### +#### XSCHEM TOOLBAR +########################################################################### +#### default: not enabled. +set toolbar_visible 1 +# set toolbar_horiz 1 + +########################################################################### +#### TABBED WINDOWS +########################################################################### +# default: not enabled. Interface can be changed runtime if only one window +# or tab is open. +set tabbed_interface 1 + +########################################################################### +#### SKYWATER PDK SPECIFIC VARIABLES +########################################################################### + +## check if env var PDK_ROOT exists, and use it for building open_pdks paths +if { [info exists env(PDK_ROOT)] && $env(PDK_ROOT) ne {} } { + ## found variable, set tcl PDK_ROOT var + if {![file isdir $env(PDK_ROOT)]} { + puts stderr "Warning: PDK_ROOT environment variable is set but path not found on the system." + } + set PDK_ROOT $env(PDK_ROOT) +} else { + ## not existing or empty. + puts stderr "Warning: PDK_ROOT env. var. not found or empty, trying to find a pdk install" + if {[file isdir [pwd]/..]} { + set PDK_ROOT [file normalize [pwd]/../..] + } else { + puts stderr {No pdk installation found, set PDK_ROOT env. var. and restart xschem} + } +} + +if {[info exists PDK_ROOT]} { + set 180MCU_MODELS $env(PDK_ROOT)/$env(PDK)/libs.tech/ngspice + puts stderr "pdk installation: using $PDK_ROOT" + puts stderr "180MCU_MODELS: $180MCU_MODELS" +} + +# allow a user-specific path add-on (https://github.com/iic-jku/iic-osic-tools/issues/7) +if { [info exists ::env(XSCHEM_USER_LIBRARY_PATH) ] } { + append XSCHEM_LIBRARY_PATH :$env(XSCHEM_USER_LIBRARY_PATH) +}