blob: 2c8ce48b786201ef8d7bbca8e055afbfced489e1 [file] [log] [blame]
#!/usr/bin/env python3
#
#--------------------------------------------------------------------
# Workaround for the problem that ngspice is unable to accept a
# parameter name that shadows a device name. Parameters in the
# files critical.spice and montecarlo.spice that shadow parameter
# names have the leading sky130_fd_pr__ stripped off to prevent
# this from being a problem.
#--------------------------------------------------------------------
import os
import re
import sys
searchpath = ['sky130A/libs.tech/ngspice/parameters/critical.spice',
'sky130A/libs.tech/ngspice/parameters/montecarlo.spice']
if len(sys.argv) > 1:
searchpath = sys.argv[1]
# Flag all parameters that have the same name as devices.
# These parameters are unused and must be deleted.
excludelist = [
'sky130_fd_pr__nfet_20v0_nvt_iso',
'sky130_fd_pr__nfet_20v0_nvt',
'sky130_fd_pr__nfet_20v0_iso',
'sky130_fd_pr__nfet_20v0_zvt',
'sky130_fd_pr__nfet_20v0',
'sky130_fd_pr__pfet_20v0',
'sky130_fd_pr__nfet_01v8_lvt',
'sky130_fd_pr__pfet_01v8_mvt',
'sky130_fd_pr__pfet_01v8',
'sky130_fd_pr__nfet_g5v0d16v0',
'sky130_fd_pr__pfet_g5v0d16v0',
'sky130_fd_pr__special_nfet_pass_lvt',
'sky130_fd_pr__pnp_05v5_W0p68L0p68']
# For each entry in the exclude list, create a regular expression
# for detecting that entry and excluding other similar cases that
# aren't the parameter. Items with preceding "/" are the device
# filename, and items with additional text are other parameters.
rexpat = {}
rexdict = {}
for item in excludelist:
rexpat[item] = '([^/])' + item + '(?=[^_])'
rexdict[item] = re.compile('([^/])' + item + '(?=[^_])')
#--------------------------------------------------------------------
for infile_name in searchpath:
filepath = os.path.split(infile_name)[0]
outfile_name = os.path.join(filepath, 'temp')
infile = open(infile_name, 'r')
outfile = open(outfile_name, 'w')
line_number = 0
replaced_something = False
for line in infile:
line_number += 1
newline = line
for device in excludelist:
rmatch = rexdict[device].search(line)
if rmatch:
replacement = device[14:]
newline = re.sub(rexpat[device], '\g<1>' + replacement, newline)
replaced_something = True
outfile.write(newline)
infile.close()
outfile.close()
if replaced_something:
print("Something was replaced in '{}'".format(infile_name))
os.rename(outfile_name, infile_name)
else:
print("Nothing was replaced in '{}'.".format(infile_name))
os.remove(outfile_name)