Added spinit file under custom/models to get the correct startup
options for ngspice. Made a "create_project" script to create some
basic project subdirectories and seed them with links to the
appropriate startup files. Modified the "preproc" script so that
it maintains the file permissions from input to output.
diff --git a/common/create_project.py b/common/create_project.py
new file mode 100755
index 0000000..3c4cb4a
--- /dev/null
+++ b/common/create_project.py
@@ -0,0 +1,161 @@
+#!/usr/bin/env python3
+#-----------------------------------------------------------------------
+# create_project.py
+#-----------------------------------------------------------------------
+#
+# Create a project in the form preferred by open_pdks.
+#
+#---------------------------------------------------------------------
+# Written by Tim Edwards
+# March 15, 2021
+# Version 1.0
+#---------------------------------------------------------------------
+
+import os
+import re
+import sys
+import json
+
+def usage():
+ print('Usage:')
+ print(' create_project.py <project_name> [<pdk_name>] [-options]')
+ print('')
+ print('Arguments:')
+ print(' <project_name> is the name of the project and the top-level directory')
+ print(' <pdk_name> is the name of the PDK')
+ print('')
+ print(' <pdk_name> can be a full path to the PDK')
+ print(' <project_name> can be a full path to the project, otherwise use cwd.')
+ print('')
+ print('Options:')
+ print(' -help Print this help text.')
+
+# Main procedure
+
+if __name__ == '__main__':
+
+ # Parse command line for options and arguments
+ optionlist = []
+ arguments = []
+ for item in sys.argv[1:]:
+ if item.find('-', 0) == 0:
+ optionlist.append(item)
+ else:
+ arguments.append(item)
+
+ if len(arguments) > 0:
+ projectname = arguments[0]
+ if len(arguments) > 1:
+ pdkname = arguments[1]
+ else:
+ pdkname = None
+ else:
+ usage()
+ sys.exit(0)
+
+ if pdkname:
+ if pdkname.startswith('/'):
+ pdkpath = pdkname
+ else:
+ pdkpath = os.path.join('PREFIX', 'pdk', pdkname)
+ else:
+ try:
+ pdkpath = os.getenv()['PDK_PATH']
+ except:
+ try:
+ pdkpath = os.getenv()['PDKPATH']
+ except:
+ print('If PDK name is not specified, then PDKPATH must be set.')
+ sys.exit(1)
+
+ if not os.path.isdir(pdkpath):
+ print('Path to PDK ' + pdkpath + ' does not exist or is not readable.')
+ sys.exit(1)
+
+ for item in optionlist:
+ result = item.split('=')
+ if result[0] == '-help':
+ usage()
+ sys.exit(0)
+ else:
+ usage()
+ sys.exit(1)
+
+ if projectname.startswith('/'):
+ projectpair = os.path.split(projectname)
+ projectparent = projectpair[0]
+ projectname = projectpair[1]
+ else:
+ projectparent = os.getcwd()
+
+ if not os.path.isdir(projectparent):
+ print('Path to project ' + projectpath + ' does not exist or is not readable.')
+ sys.exit(1)
+
+ projectpath = os.path.join(projectparent, projectname)
+
+ # Check that files to be linked to exist in the PDK
+ if not os.path.isfile(pdkpath + '/libs.tech/magic/' + pdkname + '.magicrc'):
+ print(pdkname + '.magicrc not found; not installing.')
+ domagic = False
+ else:
+ domagic = True
+
+ if not os.path.isfile(pdkpath + '/libs.tech/netgen/' + pdkname + '_setup.tcl'):
+ print(pdkname + '_setup.tcl for netgen not found; not installing.')
+ donetgen = False
+ else:
+ donetgen = True
+
+ if not os.path.isfile(pdkpath + '/libs.tech/xschem/xschemrc'):
+ print('xschemrc for xschem not found; not installing.')
+ doxschem = False
+ else:
+ doxschem = True
+
+ if not os.path.isfile(pdkpath + '/libs.tech/ngspice/spinit'):
+ print('spinit for ngspice not found; not installing.')
+ dongspice = False
+ else:
+ dongspice = True
+
+ if domagic or donetgen or doxschem or dongspice:
+ print('Creating project ' + projectname)
+ os.makedirs(projectpath)
+ else:
+ print('No setup files were found . . . bailing.')
+ sys.exit(1)
+
+ if domagic:
+ magpath = os.path.join(projectpath, 'mag')
+ os.makedirs(magpath)
+ os.symlink(pdkpath + '/libs.tech/magic/' + pdkname + '.magicrc',
+ magpath + '/.magicrc')
+
+ if doxschem:
+ xschempath = os.path.join(projectpath, 'xschem')
+ os.makedirs(xschempath)
+ os.symlink(pdkpath + '/libs.tech/xschem/xschemrc',
+ xschempath + '/xschemrc')
+
+ if donetgen:
+ netgenpath = os.path.join(projectpath, 'netgen')
+ os.makedirs(netgenpath)
+ os.symlink(pdkpath + '/libs.tech/netgen/' + pdkname + '_setup.tcl',
+ netgenpath + '/setup.tcl')
+
+ if dongspice:
+ ngspicepath = os.path.join(projectpath, 'ngspice')
+ os.makedirs(ngspicepath)
+ os.symlink(pdkpath + '/libs.tech/ngspice/spinit',
+ ngspicepath + '/.spiceinit')
+
+ with open(projectpath + '/info.yaml', 'w') as ofile:
+ print('---', file=ofile)
+ print('project:', file=ofile)
+ print(' description: "(Add project description here)"', file=ofile)
+ print(' process: "' + pdkname + '"', file=ofile)
+ print(' project_name: "' + projectname + '"', file=ofile)
+
+ print('Done!')
+ sys.exit(0)