blob: 41c6967b91f8d0f0fc3e420cb159bcbb6dcf306e [file] [log] [blame]
#!/usr/bin/python
import sys
import subprocess
import os
import os.path
import re
from subprocess import Popen, PIPE, STDOUT
my_dir = ""
if len(sys.argv) < 9:
print ("Usage: spice.py <tech_file> <tech_size> <Vdd> <P/N> <temp> <activity [hz]> <component_type> <size> <nmos_size>")
sys.exit();
my_dir = os.path.dirname(os.path.realpath(__file__));
tech_file = sys.argv[1]
tech_file = os.path.abspath(tech_file)
tech_size = sys.argv[2]
Vdd = sys.argv[3]
pn = sys.argv[4]
temp = sys.argv[5]
activity = sys.argv[6]
type = sys.argv[7]
size = sys.argv[8]
do_nmos_size = False
if len(sys.argv) > 9:
do_nmos_size = True
nmos_size = sys.argv[9]
if (activity == "h"):
na = 0
elif (activity == "z"):
na = 1
else:
print("Invalid activity type\n");
sys.exit()
base_dir = os.path.join(my_dir)
temp_dir = os.path.join(base_dir, "temp")
if not os.path.exists(temp_dir):
os.mkdir(temp_dir)
file_name = type + "_" + str(size)
if na:
file_path = os.path.join(temp_dir, file_name + "_na.sp")
else:
file_path = os.path.join(temp_dir, file_name + ".sp")
f = open(file_path, 'w')
f.write ("Auto Spice\n")
f.write (".include \"" + tech_file + "\"\n")
f.write (".param tech = " + str(tech_size) + "e-9\n")
f.write(".param tempr = " + temp + "\n")
f.write(".param simt = 5n\n")
f.write(".param Vol=" + Vdd + "\n")
f.write(".param pnratio=" + pn + "\n")
if do_nmos_size:
f.write(".param nmos_size=" + nmos_size + "\n")
subckt_path = os.path.join(base_dir, "subckt")
f.write(".include " + subckt_path + "/nmos_pmos.sp\n")
f.write(".include " + subckt_path + "/mux2.sp\n")
f.write(".include " + subckt_path + "/mux2trans.sp\n")
f.write(".include " + subckt_path + "/mux3.sp\n")
f.write(".include " + subckt_path + "/mux4.sp\n")
f.write(".include " + subckt_path + "/mux5.sp\n")
f.write(".include " + subckt_path + "/inv.sp\n")
f.write(".include " + subckt_path + "/dff.sp\n")
f.write(".include " + subckt_path + "/level_restorer.sp\n")
if na:
read_file_path = os.path.join(base_dir, type, size + "_na.spz")
else:
read_file_path = os.path.join(base_dir, type, size + ".spz")
fr = open(read_file_path)
f.write(fr.read())
fr.close()
f.close()
cmd = "hspice " + file_path
# print cmd
p = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT, cwd=temp_dir)
stdout, stderr = p.communicate()
if re.search("error", stdout):
print "Error"
else:
m = re.search("^\s*power=\s*(\S*).*$", stdout, re.MULTILINE)
if (m):
print m.group(1)
# f = open("~/spice_modeling/" + sys.argv[1] + ".spx")
# hspice ~/spice_modeling/$1 2>&1 | grep -P "^\s+e=|\s+tech_size="