#!/usr/bin/python

import sys
import getopt
import os

def pwl(num, label, width, rise, delay, vdd, transitions):
    print "V" + str(num) + " (" + label + " 0) vsource type=pwl wave=\\["
    t1 = 0
    v1 = 0
    t2 = 0
    v2 = 0
    for j in range(0, len(transitions)):
        t1 = j*width + 0.5*rise + delay
        if( j == 0 ):
            t1 = 0
        t2 = (j+1)*width - 0.5*rise + delay
        v1 = transitions[j]
        v2 = transitions[j]
        if( transitions[j] == 1 ):
            v1 = vdd
            v2 = vdd
        print "+ %gn %g %gn %g" %(round(t1, 3), round(v1, 3), round(t2, 3), round(v2, 3) )
    print "+ ]"
def usage():
    print "usage: pwlgen.py [OPTION]... [vector file] [pulse width] \n \
        [rise/fall time] [vdd voltage]"
    print
    print "  -h: print usage"
    print
    print "  vector file    : name of text file containing pin names and values"
    print "  pulse width    : width of the pulse between transitions in nanoseconds"
    print "  rise/fall time : the time of the transitions in nanoseconds"
    print "  delay          : the amount of time to delay all the signals"
    print "  vdd voltage    : the value of VDD corresponding to logic '1'"

def main(argc, argv):
    try:
        opts, argv = getopt.getopt( argv, "h", ["help"] )
    except getopt.GetoptError:
        usage()
        sys.exit(2)
    for opt, arg in opts:
        if opt in ("-h", "--help"):
            usage()
            sys.exit()
    
    if( argc != 5 ):
        print usage()
        sys.exit()
        
    filename = argv[0]
    width = float(argv[1])
    rise = float(argv[2])
    delay = float(argv[3])
    vdd = float(argv[4])
    
    if( not os.path.isfile( filename ) ):
        print "File does not exist: " + filename
        sys.exit(2)
    
    f = open( filename, "r" )
    pins = f.readline().strip().split()
    for pin in pins:
        vars()[pin] = []
        
    for line in f:
        if( line.strip() == "" ):
            continue
        line = list( line.strip() )
        if( len( line ) != len( pins ) ):
            continue
        for i in range(0,len(pins)):
            vars()[pins[i]].append( int(line[i]) )
    f.close()
    
    for i in range( 0, len(pins) ):
        pwl( i, pins[i], width, rise, delay, vdd, vars()[pins[i]] )
    
if __name__ == "__main__":
    main(len(sys.argv)-1, sys.argv[1:])
