#!/usr/bin/env python3
#
# fix_xschemrc.py ---
#
# Special-purpose script that does the work of modifying a few items in
# the source xschemrc file to make it open_pdks-specific

import sys

if len(sys.argv) != 3:
    print('Usage:  fix_xschemrc.py <filename> <techname>')
    sys.exit(1)
else:
    file_name = sys.argv[1]
    tech_name = sys.argv[2]

with open(file_name, 'r') as ifile:
    xlines = ifile.read().splitlines()

# Replace lines which assume PDK is in the user directory above
outlines = []
skipnext = 0
for line in xlines:
    if skipnext == 0:
        if 'trying to find' in line:
            skipnext = 2
        outlines.append(line)
    else:
        skipnext -= 1
        if skipnext == 0:
            outlines.append('  if {[file isdir /usr/share/pdk]} {set PDK_ROOT /usr/share/pdk')
            outlines.append('  } elseif {[file isdir /usr/local/share/pdk]} {set PDK_ROOT /usr/local/share/pdk')
            outlines.append('  } elseif {[file isdir $env(HOME)/share/pdk]} {set PDK_ROOT $env(HOME)/share/pdk')

# Append these lines:
outlines.append('')
outlines.append('# open_pdks-specific')
outlines.append('set XSCHEM_START_WINDOW ${PDK_ROOT}/' + tech_name + '/libs.tech/xschem/tests/0_top.sch')
outlines.append('append XSCHEM_LIBRARY_PATH :${PDK_ROOT}/' + tech_name + '/libs.tech/xschem')
outlines.append('')
outlines.append('# allow a user-specific path add-on')
outlines.append('if { [info exists ::env(XSCHEM_USER_LIBRARY_PATH) ] } {')
outlines.append('    append XSCHEM_LIBRARY_PATH :$env(XSCHEM_USER_LIBRARY_PATH)')
outlines.append('}')

# Write back into the same file
with open(file_name, 'w') as ofile:
    for line in outlines:
        print(line, file=ofile)

print("Done!")
