blob: 3c4cb4a19b46395f051429978e16f7ac99e515d6 [file] [log] [blame]
#!/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)