blob: 596ec038f72a5a6e3c1be97b5a8b7018e67a9953 [file] [log] [blame]
#!/usr/bin/env python3
import os
import pprint
import sys
def main(outdir, f):
outdir = os.path.abspath(outdir)
fpath = os.path.abspath(f)
assert os.path.exists(fpath), fpath
assert os.path.isfile(fpath), fpath
fdir = os.path.dirname(f)
assert os.path.exists(fdir), fdir
assert os.path.isdir(fdir), fdir
ffile = os.path.basename(f)
fbase, fext = ffile.split('.', 1)
print("split_one_model.py: Reading", fpath)
data = open(fpath).read().splitlines()
sections = [[]]
while len(data) > 0:
line = data.pop(0)
if line.startswith('.model'):
sections.append([])
if sections[-1] and sections[-1][0].startswith('.model'):
if line.strip() and (line.strip()[0] not in ('*', '+')):
sections.append([])
if 'subckt' in line:
sections.append([])
sections[-1].append(line)
if sections[-1] and 'subckt' in sections[-1][0]:
if 'ends' in line:
sections.append([])
top = sections.pop(0)
top_file = list(top)
for s in sections:
if not s:
continue
if s[0].startswith('.model'):
bits = s[0].split()
assert len(bits) > 2, bits
outname = bits[1]+'.'+fext
elif 'subckt' in s[0]:
bits = s[0].replace('.subckt', 'subckt').split()
assert 'subckt' in bits, bits
outname = bits[bits.index('subckt')+1]+'.'+fext
else:
top_file.extend(s)
continue
foutpath = os.path.join(outdir, outname)
assert not os.path.exists(foutpath), foutpath
print("split_one_model.py: Writing", foutpath)
with open(foutpath, 'w') as f:
f.write("\n".join(top+s))
top_file.append('.include "{}"'.format(outname))
foutpath = os.path.join(outdir, fbase+'_top.'+fext)
assert not os.path.exists(foutpath), foutpath
print("split_one_model.py: Writing", foutpath)
with open(foutpath, 'w') as f:
f.write("\n".join(top_file))
return 0
if __name__ == "__main__":
files = list(sys.argv[1:])
outdir = files.pop(-1)
for f in files:
retcode = main(outdir, f)
if retcode != 0:
sys.exit(retcode)
sys.exit(0)