#!/usr/bin/env python3
"""
cdl2spi.py : netlist processor
Copyright (c) 2016, 2020 efabless Corporation.
All rights reserved.

usage: cdl2spi.py <inCDLfile> [<outSPCfile>] [options...]
Writes to .spi to outSPCfile, or stdout if no output argument given. Sets exit
status if there were non-zero errors.  Most errors/warnings are annotated in-line
in the stdout each before the relevant line.
"""

import sys, getopt
import os
import re
import textwrap

# Convert linear scale to area scale suffix 
# (e.g., if linear scale is 1e-6 ('u') then area scales as 1e-12 ('p'))

def getAreaScale(dscale):
    ascale = ''
    if dscale == 'm':
        ascale = 'u'
    elif dscale == 'u':
        ascale = 'p'
    elif dscale == 'n':
        ascale = 'a'
    return ascale

# Check nm (instanceName) in the context of sub (subckt): is it used yet?
# If not used yet, mark it used, and return as-is.
# Else generate a unique suffixed version, and mark it used, return it.
# If 1M suffixes don't generate a unique name, throw exception.
#   hasInm : global hash, key of hash is (subckt, iname)

hasInm = {}
def uniqInm(sub, nm):
    subl=sub.lower()
    nml=nm.lower()
    if not (subl, nml) in hasInm:
        hasInm[ (subl, nml) ] = 1
        return nm
    for i in range(1000000):
        nm2 = nm + "_q" + str(i)
        nm2l = nm2.lower()
        if not (subl, nm2l) in hasInm:
            hasInm[ (subl, nm2l) ] = 1
            return nm2
    # not caught anywhere, and gives (intended) non-zero exit status
    raise AssertionError("uniqInm: range overflow for (%s,%s)" % (sub, nm))

# Map illegal characters in an nm (instanceName) in context of sub (subckt).
# For ngspice, '/' is illegal in instanceNames. Replace it with '|', BUT
# then make sure the new name is still unique: does not collide with a name
# used so far or another already derived unique name.

inmBadChars='/'
inmRplChars='|'
inmBadCharREX=re.compile( "["+ inmBadChars+"]" )

def mapInm(sub, nm):
    nm2 = inmBadCharREX.sub(inmRplChars, nm)
    return uniqInm(sub, nm2)

# Process subckt line (array of tokens). Return new array of tokens.
# There might be a ' /' in the line that needs to be deleted. It may be standalone ' / ', or
# butting against the next token. It may be before all pins, after all pins, or between pins.
# Do not touch / in a parameter assignment expression.
# Do not touch / embedded in a pinName.
# May touch / butting front of very first parameter assignment expression.
# .subckt NM / p1 p2 p3 x=y g=h
# .subckt NM /p1 p2 p3 x=y g=h
# .subckt NM p1 p2 / p3 x=y g=h
# .subckt NM p1 p2 /p3 x=y g=h
# .subckt NM p1 p2 p3 / x=y g=h
# .subckt NM p1 p2 p3 /x=y g=h
# .subckt NM p1 p2 p3 x=y g=(a/b)     (don't touch this /)
# .subckt NM p1 p2/3/4 p3 x=y g=(a/b) (don't touch these /)

def mapSubcktDef(tok):
    # find index of one-past first token (beyond ".subckt NM") containing an =, if any
    param0 = len(tok)
    for i in range(2, len(tok)):
        if '=' in tok[i]:
            param0 = i+1
            break
    # find first token before or including that 1st-param, starting with /:
    #   strip the slash.
    for i in range(2, param0):
        if tok[i][0] == '/':
            tok[i] = tok[i][1:]
            if tok[i] == "":
                del tok[i]
            break
    return tok

def test_mapSubcktInst1():
    print( " ".join(mapSubcktDef( ".subckt abc p1 p2 p3".split())))
    print( " ".join(mapSubcktDef( ".subckt abc / p1 p2 p3".split())))
    print( " ".join(mapSubcktDef( ".subckt abc /p1 p2 p3".split())))
    print( " ".join(mapSubcktDef( ".subckt abc p1 p2 /p3".split())))
    print( " ".join(mapSubcktDef( ".subckt abc p1 p2 / p3".split())))
    print( " ".join(mapSubcktDef( ".subckt abc p1 p2 p3 x=4 /y=5".split())))
    print( " ".join(mapSubcktDef( ".subckt abc p1 p2 p3 x=4/2 y=5".split())))
    print( " ".join(mapSubcktDef( ".subckt abc p1 p2 p3 / x=4/2 y=5".split())))
    print( " ".join(mapSubcktDef( ".subckt abc p1 p2 p3 x=4/2 /y=5".split())))
    print( " ".join(mapSubcktDef( ".subckt abc p1 p2 p3 /x=4/2 y=5".split())))
    print( " ".join(mapSubcktDef( ".subckt abc p1/2/3 p2 p3 /x=4/2 y=5".split())))

# Process subckt instance line (array of tokens). Return new array of tokens.
# (This function does not map possible illegal-chars in instanceName).
# There might be a ' /' in the line that needs to be deleted. It may be standalone ' / ', or
# butting against the next token. It can only be after pins, before or butting subcktName.
#
# Do not touch / in, butting, or after 1st parameter assignment expression.
# Do not touch / embedded in a netName.
# Do not touch / embedded in instanceName (they are handled separately elsewhere).
# xa/b/c p1 p2 p3 / NM x=y g=h
# xa/b/c p1 p2 p3 /NM x=y g=h
# xabc p1 p2/3/4 p3 /NM x=(a/b) g=h
# xabc p1 p2/3/4 p3 / NM x=(a/b) g=h
# xabc p1 p2/3/4 p3 NM x=(a/b) / g=h    (don't touch; perhaps needs to be an error trapped somewhere)
# xabc p1 p2/3/4 p3 NM / x=(a/b) g=h    (don't touch; perhaps needs to be an error trapped somewhere)
# xa/b/c p1 p2/3/4 p3 NM x=(a/b) g=h    (don't touch these /)

def mapSubcktInst(tok):
    # find index of first token (beyond "x<iname>") containing an =, if any
    param0 = tlen = len(tok)
    for i in range(1, tlen):
        if '=' in tok[i]:
            param0 = i
            break
    # Determine modelName index. Either just prior to 1st-param (if any) else last token.
    modndx = tlen - 1
    if param0 < tlen:
        modndx = param0 - 1;
    # If modndx now points to a standalone /, that can't be (would yield missing/empty modelName).
    # Actual modelName must be before it. We need to check, possibly strip / on/before actual modelName.
    # (Even though standlone / after model are most likely an independent error: we don't touch 'em).
    while modndx > 1 and tok[modndx] == "/":
        modndx-=1
    # Check for standalone / before modelName. Else for modelName starting with /.
    slashndx = modndx - 1
    if slashndx > 0 and tok[slashndx] == "/":
        del tok[slashndx]
    else:
        if modndx > 0 and tok[modndx].startswith("/"):
            tok[modndx] = tok[modndx][1:]
    return tok

def test_mapSubcktInst2():
    print( " ".join(mapSubcktInst( "xa/b/c p1 p2 p3 / NM x=y g=h".split())))
    print( " ".join(mapSubcktInst( "xa/b/c p1 p2 p3 /NM x=y g=h".split())))
    print( " ".join(mapSubcktInst( "xabc p1 p2/3/4 p3 /NM x=(a/b) g=h".split())))
    print( " ".join(mapSubcktInst( "xabc p1 p2/3/4 p3 / NM x=(a/b) g=h".split())))
    print( " ".join(mapSubcktInst( "xabc p1 p2/3/4 p3 NM x=(a/b) / g=h".split())))
    print( " ".join(mapSubcktInst( "xabc p1 p2/3/4 p3 NM / x=(a/b) g=h".split())))
    print( " ".join(mapSubcktInst( "xabc p1 p2/3/4 p3 /NM / x=(a/b) g=h".split())))
    print( " ".join(mapSubcktInst( "xabc p1 p2/3/4 p3 / NM / x=(a/b) g=h".split())))
    print( " ".join(mapSubcktInst( "xa/b/c p1 p2/3/4 p3 NM x=(a/b) g=h".split())))
    print( " ".join(mapSubcktInst( "xa/b/c NM x=(a/b) g=h".split())))
    print( " ".join(mapSubcktInst( "xa/b/c / NM x=(a/b) g=h".split())))
    print( " ".join(mapSubcktInst( "xa/b/c /NM x=(a/b) g=h".split())))
    print( " ".join(mapSubcktInst( "xa/b/c /NM".split())))

# Primitives with M=<n> need to add additional par1=<n>.
# Process token list, return new token list.
# note: line at this point may be like: m... p1 p2 p3 p4 NMOS M=1 $blah W=... L=...
# meaning M=1 is not necessarily in a block of all parameter-assignments at EOL.
# But by processing the line from end backwards, we pick up LAST M= if there are
# multiple (which condition really should  get flagged as an error).
# And M= is more likely towards end of the line than front of line (thus faster).
# If "M=" with no value, do nothing (should also be a flagged error).

def mapMfactor(tok, options={}):
    # find index of M=* if any, starting from end.
    # "addinm" is an additional parameter that takes the same argument as M
    addinm = options['addinm'] if 'addinm' in options else []
    mndx = 0
    val = ""
    for i in range(len(tok)-1, 0, -1):
        if tok[i].lower().startswith("m="):
            mndx = i
            break
    if mndx > 0:
        val = tok[i][2:]
    if val != "":
        for p in addinm:
            tok += [ addinm + val]
    return tok

def test_mapMfactor():
    print( " ".join(mapMfactor( "m1 p1 p2 p3 p4 NM M=joe".split())))
    print( " ".join(mapMfactor( "m1 p1 p2 p3 p4 NM M= $SUB=agnd".split())))
    print( " ".join(mapMfactor( "m1 p1 p2 p3 p4 NM M=2 $SUB=agnd WM=4".split())))
    print( " ".join(mapMfactor( "m1 p1 p2 p3 p4 NM".split())))

# From $nm=... strip the $. Preserve order on the line. No attempt to
# detect any resultant collisions. "W=5 $W=10" becomes "W=5 W=10".
# Don't touch $SUB=... or $[...] or $.model=... or $blah (no assigment).

def mapCDLparam(tok):
    for i in range(1, len(tok)):
        if not tok[i].startswith("$"):
            continue
        eqi = tok[i].find("=")
        if eqi > 1:
            pnm = tok[i][1:eqi]
            pnml = pnm.lower()
            if pnml in ("sub",".model"):
                continue
            tok[i] = tok[i][1:]
    return tok

def test_CDLparam():
    print( " ".join(mapCDLparam( "m1 p1 p2 p3 p4 NM M=joe".split())))
    print( " ".join(mapCDLparam( "m1 p1 p2 p3 p4 NM M= $SUB=agnd $.model=NM3 $LDD".split())))
    print( " ".join(mapCDLparam( "m1 p1 p2 p3 p4 NM M= $SUB=agnd $[NM3]".split())))
    print( " ".join(mapCDLparam( "m1 p1 p2 p3 p4 NM M=joe $X=y".split())))
    print( " ".join(mapCDLparam( "m1 p1 p2 p3 p4 NM M= $SUB=agnd $.model=NM3 $Z=4 $Z=5".split())))
    print( " ".join(mapCDLparam( "m1 p1 p2 p3 p4 NM M= W=1 $W=2 W=3 $SUB=agnd $[NM3]".split())))

# Extract $SUB=<tname>. and $[mnm] (or $.model=<mnm>) from tokens.
# Return array of three items: [ <tname>, <mnm>, tok ] where tok is remainder.
# Absent $SUB= or model directives give "".
# Since we delete tokens, process tokens in reverse order.

def mapCDLtermModel(tok):
    cdlTerm=""
    cdlModel=""
    for i in range(len(tok)-1, 0, -1):
        if not tok[i].startswith("$"):
	    if '=' in tok[i]:
                continue
            elif cdlModel == '':
                cdlModel = tok[i]
                del tok[i]
                break
        tokl = tok[i].lower()
        if tokl.startswith("$sub="):
            if cdlTerm == "":
                cdlTerm = tok[i][5:]
            del tok[i]
            continue
        if tokl.startswith("$.model="):
            if cdlModel == "":
                cdlModel = tok[i][8:]
            del tok[i]
            continue
        if tokl.startswith("$[") and tokl.endswith("]"):
            if cdlModel == "":
                cdlModel = tok[i][2:-1]
            del tok[i]
            continue
    return [ cdlTerm, cdlModel, tok ]

def test_CDLtermModel():
    print( mapCDLtermModel( "m1 p1 p2 p3 p4 NM M=joe".split()))
    print( mapCDLtermModel( "m1 p1 p2 p3 p4 NM $SUB=agnd".split()))
    print( mapCDLtermModel( "m1 p1 p2 p3 p4 NM $SUB= $[PMOS] M=joe".split()))
    print( mapCDLtermModel( "m1 p1 p2 p3 p4 NM $sUb=vssa $.MoDeL=PM4 M=joe".split()))

# Determine if a single word looks like a plain numeric spice value.
# It means a real-number with optional scale suffix, and optional unit suffix.
# Only unit-suffix we support is m (meters) (because CDL-std describes it).
# Only scale factors supported are: t,g,meg,k,mil,m,u,n,p,f
# This does not arithmetically compute anything.
# Just returns True or False.
# 220p 10nm -40g 2milm .34e+3 3.1e-4 .34e+3pm 3.1e-4meg
# (Arguable we should strip a unit-suffix)?
# def isPlainNumeric(word):

# Segregate any remaining $* items from input tokens.
# Return [ assignments, directives, remaining ] where each are lists.
# Those that look like assigments $nm=... are separated from $blah.

def mapDiscard(tok):
    tlen = len(tok)
    assign=[]
    directive=[]
    for i in range(len(tok)-1, 0, -1):
        if not tok[i].startswith("$"):
            continue
        if "=" in tok[i]:
            assign += [ tok[i] ]
            del tok[i]
            continue
        directive += [ tok[i] ]
        del tok[i]
    return [ assign, directive, tok ]

def test_mapDiscard():
    print( mapDiscard( "m1 p1 p2 p3 p4 NM $X=4 $LDD M=joe $SUB=agnd ".split()))
    print( mapDiscard( "m1 p1 p2 p3 p4 NM $X $LDD M=joe $SUB=agnd ".split()))
    print( mapDiscard( "m1 p1 p2 p3 p4 NM M=joe SUB=agnd ".split()))

# From a token-slice, partition into assignments and non-assignments.
# Return [ assigns, nonAssigns] where each are lists.

def mapPartAssign(tok):
    tlen = len(tok)
    assign=[]
    nona=[]
    for i in range(len(tok)):
        if "=" in tok[i]:
            assign += [ tok[i] ]
            continue
        nona += [ tok[i] ]
    return [ assign, nona ]

def test_mapPartAssign():
    print( mapPartAssign( "NM X=4 220nm -1.2e-5g LDD M=joe".split()))
    print( mapPartAssign( "X=4 M=joe".split()))
    print( mapPartAssign( "NM 220nm -1.2e-5g LDD".split()))
    print( mapPartAssign( "".split()))

# Find an assignment to nm in the token list (nm=val).
# Return [val, tok]. If edit is True, the nm=val is removed from return tok.
# If multiple nm=... the last one is used. If del is True, all nm=... are removed.

def mapLookup(tok, nm, edit):
    tlen = len(tok)
    val=""
    nmeq = nm.lower() + "="
    nmeqlen = len(nmeq)
    for i in range(len(tok)-1, 0, -1):
        if not tok[i].lower().startswith(nmeq):
            continue
        if val == "":
            val = tok[i][nmeqlen:]
        if edit:
            del tok[i]
    return [ val, tok ]

def test_mapLookup():
    print( mapLookup( "cnm t1 t2 area=220p PERimeter=100u M=joe par1=1".split(), "periMETER", True))
    print( mapLookup( "m1 p1 p2 p3 p4 NM $X=4 $LDD M=joe $SUB=agnd ".split(), "x", True))
    print( mapLookup( "m1 p1 p2 p3 p4 NM X=4 $LDD M=joe $SUB=agnd ".split(), "x", True))
    print( mapLookup( "m1 p1 p2 p3 p4 NM x=4 $LDD M=joe $SUB=agnd ".split(), "x", True))
    print( mapLookup( "m1 p1 p2 p3 p4 NM x=4 X=5 xy=6 $LDD M=joe $SUB=agnd ".split(), "x", True))
    print( mapLookup( "m1 p1 p2 p3 p4 NM x=4 X=5 xy=6 $LDD M=joe $SUB=agnd ".split(), "x", False))

# Format a diode. cdlTerm and cdlModel are passed in but ignored/unused.
# Processes tok and returns a final token list to be output.
# If after "dnm t1 t2 modelName ", there are plain numerics (index 4,5), take them as area and peri,
# (override other area= peri= parameters), format them as area=... peri=...
# (Caller already error checked the 1st minimum FOUR fields are there).

def mapDiode(cdlTerm, cdlModel, tok, options={}):
    ignore = options['ignore'] if 'ignore' in options else []
    # strip remaining $* directives
    [ ign, ign, tok ] = mapDiscard(tok)
    # Find explicit area= peri=, remove from tok.
    [area,  tok] = mapLookup(tok, "area",  True)
    [peri, tok] = mapLookup(tok, "peri", True)
    for p in ignore:
        [ign, tok] = mapLookup(tok, p, True)
    # For just token-slice after modelName, partition into assignments and non-assigns.
    [assign, nona] = mapPartAssign(tok[4:])
    tok = tok[0:4]
    # TODO: If we have more than two non-assignments it should be an error?
    # Override area/peri with 1st/2nd non-assigment values.
    if len(nona) > 0:
        area = nona.pop(0)
    if len(nona) > 0:
        peri = nona.pop(0)
    if area != "":
        tok += [ "area=" + area ]
    if peri != "":
        tok += [ "peri=" + peri ]
    tok += nona
    tok += assign
    return tok

def test_mapDiode():
    print( mapDiode( "", "", "dnm t1 t2 DN 220p 100u M=joe par1=1".split()))
    print( mapDiode( "", "", "dnm t1 t2 DN peri=100u area=220p M=joe par1=1".split()))
    print( mapDiode( "", "", "dnm t1 t2 DN  M=joe par1=1".split()))

# Format a mosfet. cdlTerm and cdlModel are passed in but ignored/unused.
# Processes tok and returns a final token list to be output.
# If after "mnm t1 t2 t3 t4 modelName ", there are plain numerics (index 6,7), take them as W and L,
# (override other W= L= parameters), format them as W=... L=...
# (Caller already error checked the 1st minimum SIX fields are there).

def mapMos(cdlTerm, cdlModel, tok, options={}):
    ignore = options['ignore'] if 'ignore' in options else []
    # strip remaining $* directives
    [ ign, ign, tok ] = mapDiscard(tok)
    # Find explicit W= L=, remove from tok.
    [w, tok] = mapLookup(tok, "w",  True)
    [l, tok] = mapLookup(tok, "l", True)
    for p in ignore:
        [ign, tok] = mapLookup(tok, p, True)
    # For scaling, find AS, PS, AD, PD, SA, SB, SC, and SD
    [sarea, tok] = mapLookup(tok, "as",  True)
    [darea, tok] = mapLookup(tok, "ad",  True)
    [sperim, tok] = mapLookup(tok, "ps",  True)
    [dperim, tok] = mapLookup(tok, "pd",  True)
    [sa, tok] = mapLookup(tok, "sa",  True)
    [sb, tok] = mapLookup(tok, "sb",  True)
    [sd, tok] = mapLookup(tok, "sd",  True)

    dscale = options['dscale'] if 'dscale' in options else ''
    ascale = getAreaScale(dscale)

    # For just token-slice after modelName, partition into assignments and non-assigns.
    [assign, nona] = mapPartAssign(tok[6:])
    tok = tok[0:6]
    # TODO: If we have more than two non-assignments it should be an error?
    # Override W/L with 1st/2nd non-assigment values.
    if len(nona) > 0:
        w = nona.pop(0)
    if len(nona) > 0:
        l = nona.pop(0)
    if w != "":
        tok += ["W=" + w + dscale]
    if l != "":
        tok += ["L=" + l + dscale]
    if darea != "":
        tok += ["AD=" + darea + ascale]
    if sarea != "":
        tok += ["AS=" + sarea + ascale]
    if dperim != "":
        tok += ["PD=" + dperim + dscale]
    if sperim != "":
        tok += ["PS=" + sperim + dscale]
    if sa != "":
        tok += ["SA=" + sa + dscale]
    if sb != "":
        tok += ["SB=" + sb + dscale]
    if sd != "":
        tok += ["SD=" + sd + dscale]
    tok += nona
    tok += assign
    return tok

def test_mapMos():
    print( mapMos( "", "", "mnm t1 t2 t3 t4 NM 220p 100u M=joe par1=1".split()))
    print( mapMos( "", "", "mnm t1 t2 t3 t4 NM L=100u W=220p M=joe par1=1".split()))
    print( mapMos( "", "", "mnm t1 t2 t3 t4 PM M=joe par1=1".split()))

# Format a cap.
# Processes tok and returns a final token list to be output.
# Optional cdlTerm adds a 3rd terminal.
# If after "cnm t1 t2 ", there is plain numeric or C=numeric they are DISCARDED.
# area/peri/perimeter assignments are respected. Both peri/perimeter assign to perm=
# in the output. No perimeter= appears in the output.
# (Caller already error checked the 1st minimum 3 fields are there; plus cdlModel is non-null).

def mapCap(cdlTerm, cdlModel, tok, options={}):
    ignore = options['ignore'] if 'ignore' in options else []
    # strip remaining $* directives
    [ ign, ign, tok ] = mapDiscard(tok)
    # Find explicit area= peri= perimeter=, remove from tok. peri overwrites perimeter,
    # both assign to perim. Lookup/discard a C=.
    [area,  tok] = mapLookup(tok, "area",  True)
    [perim,  tok] = mapLookup(tok, "perimeter", True)
    [length,  tok] = mapLookup(tok, "l",  True)
    [width,  tok] = mapLookup(tok, "w",  True)
    [peri, tok] = mapLookup(tok, "peri", True)
    if peri == "":
        peri = perim
    [ign, tok] = mapLookup(tok, "c", True)
    for p in ignore:
        [ign, tok] = mapLookup(tok, p, True)
    # For just token-slice after modelName, partition into assignments and non-assigns.
    # We ignore the nonassignments. Need remaining assignments for M= par1=.
    [assign, nona] = mapPartAssign(tok[3:])
    dscale = options['dscale'] if 'dscale' in options else ''
    ascale = getAreaScale(dscale)
    tok = tok[0:3]
    if cdlTerm != "":
        tok += [ cdlTerm ]
    if cdlModel != "":
        tok += [ cdlModel ]
    if area != "":
        tok += [ "area=" + area + ascale]
    if peri != "":
        tok += [ "peri=" + peri + dscale]
    if length != "":
        tok += [ "L=" + length + dscale]
    if width != "":
        tok += [ "W=" + width + dscale]
    tok += assign
    return tok

def test_mapCap():
    print( mapCap( "", "CPP", "cnm t1 t2 area=220p peri=100u M=joe par1=1".split()))
    print( mapCap( "", "CPP", "cnm t1 t2 area=220p perimeter=100u M=joe par1=1".split()))
    print( mapCap( "", "CPP", "cnm t1 t2 area=220p peri=199u perimeter=100u M=joe par1=1".split()))
    print( mapCap( "", "CPP", "cnm t1 t2 M=joe par1=1".split()))
    print( mapCap( "", "CPP", "cnm t1 t2 C=444 area=220p peri=199u perimeter=100u M=joe par1=1".split()))
    print( mapCap( "", "CPP", "cnm t1 t2 444 M=joe par1=1".split()))
    print( mapCap( "agnd", "CPP2", "cnm t1 t2 $LDD 220p M=joe par1=1".split()))

# Format a res.
# Processes tok and returns a final token list to be output.
# Optional cdlTerm adds a 3rd terminal.
# If after "rnm t1 t2 ", there is plain numeric or R=numeric they are DISCARDED.
# W/L assignments are respected.
# (Caller already error checked the 1st minimum 3 fields are there; plus cdlModel is non-null).

def mapRes(cdlTerm, cdlModel, tok, options={}):
    dscale = options['dscale'] if 'dscale' in options else ''
    ignore = options['ignore'] if 'ignore' in options else []
    # strip remaining $* directives
    [ ign, ign, tok ] = mapDiscard(tok)
    # Find explicit w/l, remove from tok.
    # Lookup/discard a R=.
    [w,  tok] = mapLookup(tok, "w",  True)
    [l,  tok] = mapLookup(tok, "l", True)
    [r, tok] = mapLookup(tok, "r", True)
    for p in ignore:
        [ign, tok] = mapLookup(tok, p, True)
    # For just token-slice after modelName, partition into assignments and non-assigns.
    # We ignore the nonassignments. Need remaining assignments for M= par1=.
    [assign, nona] = mapPartAssign(tok[3:])
    if len(nona) > 0:
        r = nona.pop(0)
    tok = tok[0:3]
    if cdlTerm != "":
        tok += [ cdlTerm ]
    if cdlModel != "":
        tok += [ cdlModel ]
    if w != "":
        tok += [ "W=" + w + dscale]
    if l != "":
        tok += [ "L=" + l + dscale]
    # Convert name "short" to zero resistance
    if r == "short":
        tok += [ "0" ]
    tok += assign
    return tok

def test_mapRes():
    print( mapRes( "", "RPP1", "rnm t1 t2 w=2 L=1 M=joe par1=1".split()))
    print( mapRes( "", "RPP1", "rnm t1 t2 444 w=2 L=1 M=joe par1=1".split()))
    print( mapRes( "", "RPP1", "rnm t1 t2 R=444 w=2 L=1 M=joe par1=1".split()))
    print( mapRes( "", "R2", "rnm t1 t2 L=2 W=10 M=joe par1=1".split()))
    print( mapRes( "", "RM2", "rnm t1 t2 area=220p perim=199u perimeter=100u M=joe par1=1".split()))
    print( mapRes( "", "RM2", "rnm t1 t2 M=joe par1=1".split()))
    print( mapRes( "agnd", "RM3", "rnm t1 t2 $LDD 220p M=joe par1=1".split()))
    print( mapRes( "agnd", "RM3", "rnm t1 t2 $LDD 220p L=4 W=12 M=joe par1=1".split()))

# Format a bipolar. cdlTerm is optional. cdlModel is ignored.
# Processes tok and returns a final token list to be output.
# Optional cdlTerm adds an optional 4th terminal.
# If after "qnm t1 t2 t3 model", there are plain numeric (not x=y) they are DISCARDED.
# (Caller already error checked the 1st minimum 5 fields are there; plus cdlModel is null).

def mapBipolar(cdlTerm, cdlModel, tok, options={}):
    # strip remaining $* directives
    ignore = options['ignore'] if 'ignore' in options else []
    [ ign, ign, tok ] = mapDiscard(tok)
    for p in ignore:
        [ign, tok] = mapLookup(tok, p, True)
    # For just token-slice after modelName, partition into assignments and non-assigns.
    # We ignore the nonassignments. Need remaining assignments for M= par1=.
    [assign, nona] = mapPartAssign(tok[5:])
    # Start with "qnm t1 t2 t3". Insert optional 4th term. Then insert modelName.
    model = tok[4]
    tok = tok[0:4]
    if cdlTerm != "":
        tok += [ cdlTerm ]
    tok += [ model ]
    tok += assign
    return tok

def test_mapBipolar():
    print( mapBipolar( "", "any", "qnm t1 t2 t3 QP1 M=joe par1=1".split()))
    print( mapBipolar( "", "", "qnm t1 t2 t3 QP2 M=joe par1=1".split()))
    print( mapBipolar( "", "", "qnm t1 t2 t3 QP2 $EA=12 M=joe par1=1".split()))
    print( mapBipolar( "", "", "qnm t1 t2 t3 QP3 M=joe EA=14 par1=1".split()))
    print( mapBipolar( "agnd", "", "qnm t1 t2 t3 QP4 $LDD 220p M=joe par1=1".split()))
    print( mapBipolar( "agnd", "any", "qnm t1 t2 t3 QP4 $LDD 220p L=4 W=12 M=joe par1=1".split()))

#------------------------------------------------------------------------
# Main routine to do the conversion from CDL format to SPICE format
#------------------------------------------------------------------------

def cdl2spice(fnmIn, fnmOut, options):

    err = 0
    warn = 0

    # Open and read input file

    try:
        with open(fnmIn, 'r') as inFile:
            cdltext = inFile.read()
            # Unwrap continuation lines
            lines = cdltext.replace('\n+', ' ').splitlines()
    except:
        print('cdl2spi.py: failed to open ' + fnmIn + ' for reading.', file=sys.stderr)
        return 1

    # Loop over original CDL:
    #   record existing instanceNames (in subckt-context), for efficient membership
    #   tests later.  Track the subckt-context, instanceNames only need to be unique
    #   within current subckt.

    sub = ""
    for i in lines:
        if i == "":
            continue
        tok = i.split()
        tlen = len(tok)
        if tlen == 0:
            continue
        t0 = tok[0].lower()
        if t0 == '.subckt' and tlen > 1:
            sub = tok[1].lower()
            continue
        if t0 == '.ends':
            sub = ""
            continue
        c0 = tok[0][0].lower()
        if c0 in '.*':
            continue
        # this will ignore primitive-devices (jfet) we don't support.
        # TODO: flag them somewhere else as an ERROR.
        if not c0 in primch2:
            continue
        # a primitive-device or subckt-instance we care about and support
        # For subckt-instances record the instanceName MINUS lead x.
        nm = tok[0]
        if c0 == 'x':
            nm = nm[1:]
        hasInm[ (sub, nm) ] = 1


    # loop over original CDL: do conversions.
    # Track the subckt-context while we go; instanceNames only need to be unique
    # within current subckt.

    sub = ""
    tmp = []
    for i in lines:
        tok = i.split()
        tlen = len(tok)
        # AS-IS: empty line or all (preserved) whitespace
        if tlen == 0:
            tmp += [ i ]
            continue

        # get 1st-token original, as lowercase, and 1st-char of 1st-token lowercase.
        T0 = tok[0]
        t0 = T0.lower()
        c0 = t0[0]

        # AS-IS: comment
        if c0 == '*':
            tmp += [i]
            continue

        # AS-IS: .ends; update subckt-context to outside-of-a-subckt
        if t0 == '.ends':
            sub = ""
            tmp += [i]
            continue

        # change .param to a comment, output it
        if t0 == '.param':
            tmp += ["*"+i]
            continue

        # track .subckt context; process / in .subckt line, and output it.
        if t0 == '.subckt':
            if tlen < 2:
                err+=1
                msg = "*cdl2spi.py: ERROR: Missing subckt name:"
                tmp += [ msg, i ]
                continue
            T1 = tok[1]
            sub = T1.lower()
            tok = mapSubcktDef(tok)
            tmp += [ " ".join(tok) ]
            continue

        # subckt instance line. Process /, map instanceName (exclude x), and output it.
        if c0 == 'x':
            nm = T0[1:]
            if nm == "":
                err+=1
                msg = "*cdl2spi.py: ERROR: Missing subckt instance name:"
                tmp += [ msg, i ]
                continue
            inm = mapInm(sub, nm)
            tok[0] = T0[0] + inm
            tok = mapSubcktInst(tok)
            tmp += [ " ".join(tok) ]
            continue

        # all primitives: need instanceName mapped, including 1st char in name.
        # all primitives: need M=n copied to an added par1=n
        # all primitives: Except for $SUB=... $[...] strip $ from $nm=... parameters.
        # all primitives: Isolate $SUB and $[...] for further processing (in
        # primitive-specific sections).

        cdlTerm=""
        cdlModel=""
        if c0 in primch:
            nm = T0[1:]
            if nm == "":
                err+=1
                msg = "*cdl2spi.py: ERROR: Missing primitive instance name:"
                tmp += [ msg, i ]
                continue
            nm = T0
            nm = mapInm(sub, nm)
            tok[0] = nm
            tok = mapMfactor(tok, options)
            tok = mapCDLparam(tok)
            [cdlTerm, cdlModel, tok] = mapCDLtermModel(tok)

        # diode formats:
        #   dname t1 t2 model <numericA> <numericP> m=...
        # l:dname t1 t2 model {<numericA>} {<numericP>} {m=...} {$SUB=...}
        # out format:
        #   Xdname t1 t2 model area=<numericA> peri=<numericP> m=... par1=...
        # We flag $SUB=... : because so far (for XFAB) we CHOOSE not to support three
        # terminal diodes.
        # CDL-std does not define $[...] as available for diodes, so we silently ignore
        # it.
        # Always 2 terminals and a modelName. 
        # We already have peri=... and area=... and have ambiguity with plain numerics.
        # TODO: generate a warning in case of ambiguity, but prefer plain numerics
        # (with nm= added).

        if c0 == "d":
            tlen = len(tok)
            if tlen < 4:
                err+=1
                msg = "*cdl2spi.py: ERROR: Diode does not have minimum two terminals and model:"
                tmp += [ msg, i ]
                continue
            if cdlTerm != "":
                err+=1
                msg = "*cdl2spi.py: ERROR: Diode does not support $SUB=...:"
                tmp += [ msg, i ]
                continue
            tok = mapDiode(cdlTerm, cdlModel, tok, options)
            # add X to tok0.
            if options['subckt']:
                tok[0] = "X" + tok[0]
            tmp += [ " ".join(tok) ]
            continue

        # mosfet formats:
        #   mname t1 t2 t3 t4 model W=... L=... m=...
        # l:mname t1 t2 t3 t4 model {W=... L=...} {m=...} {$NONSWAP} {$LDD[type]}
        # l:mname t1 t2 t3 t4 model <width> <length> {m=...} {$NONSWAP} {$LDD[type]}
        # output format:
        #   Xmname t1 t2 t3 t4 model W=... L=... m=... par1=...
        # Fixed 4 terminals and a modelName.
        # May already have W= L= and ambiguity with plain numerics.
        # TODO: generate a warning in case of ambiguity, but prefer plain numerics
        # (with nm= added).
        if c0 == "m":
            tlen = len(tok)
            if tlen < 6:
                err+=1
                msg = "*cdl2spi.py: ERROR: Mosfet does not have minimum four terminals and model:"
                tmp += [ msg, i ]
                continue
            if cdlTerm != "":
                err+=1
                msg = "*cdl2spi.py: ERROR: Mosfet does not support $SUB=...:"
                tmp += [ msg, i ]
                continue
            tok = mapMos(cdlTerm, cdlModel, tok, options)
            # add X to tok0.
            if options['subckt']:
                tok[0] = "X" + tok[0]
            tmp += [ " ".join(tok) ]
            continue

        # cap formats:
        #  cname t1 t2   <numeric0> $[model] $SUB=t3 m=...
        #  cname t1 t2   <numeric0> $[model] m=...
        #? cname t1 t2 C=<numeric0> $[model] $SUB=t3 m=...
        #? cname t1 t2   <numeric0> $[model] $SUB=t3 area=<numericA> perimeter=<numericP> m=...
        #? cname t1 t2   <numeric0> $[model] $SUB=t3 area=<numericA> peri=<numericP> m=...
        #l:cname t1 t2  {<numeric0>} {$[model]} {$SUB=t3} {m=...}
        # out formats:
        #  Xcname t1 t2    model area=<numericA> peri=<numericP> m=... par1=...
        #  Xcname t1 t2 t3 model area=<numericA> peri=<numericP> m=... par1=...
        # We require inm, two terminals. Require $[model]. Optional 3rd-term $SUB=...
        # If both peri and perimeter, peri overrides.
        # Both area/peri are optional. The optional [C=]numeric0 is discarded always.

        if c0 == "c":
            tlen = len(tok)
            if tlen < 3:
                err+=1
                msg = "*cdl2spi.py: ERROR: Cap does not have minimum two terminals:"
                tmp += [ msg, i ]
                continue
            if cdlModel == "":
                err+=1
                msg = "*cdl2spi.py: ERROR: Cap missing required $[<model>] directive:"
                tmp += [ msg, i ]
                continue
            tok = mapCap(cdlTerm, cdlModel, tok, options)
            # add X to tok0.
            if options['subckt']:
                tok[0] = "X" + tok[0]
            tmp += [ " ".join(tok) ]
            continue

        # res formats:
        #   rname n1 n2   <numeric> $SUB=t3 $[model] $w=... $l=... m=...
        # c:rname n1 n2 R=<numeric> $[model] w=... l=... m=... $SUB=t3 
        # l:rname n1 n2   {<numeric>} {$SUB=t3} {$[model]} {$w=...} {$l=...} {m=...}
        #  (all after n1,n2 optional)
        #    We require $[model]. And add 3rd term IFF $SUB=.
        # out format:
        #   Xrname n1 n2 t3 model w=... l=... m=... par1=...
        if c0 == "r":
            tlen = len(tok)
            if tlen < 3:
                err+=1
                msg = "*cdl2spi.py: ERROR: Res does not have minimum two terminals:"
                tmp += [ msg, i ]
                continue
            if cdlModel == "":
                err+=1
                msg = "*cdl2spi.py: ERROR: Res missing required $[<model>] directive:"
                tmp += [ msg, i ]
                continue
            tok = mapRes(cdlTerm, cdlModel, tok, options)
            # add X to tok0.
            if options['subckt']:
                tok[0] = "X" + tok[0]
            tmp += [ " ".join(tok) ]
            continue

        # bipolar formats:
        #   qname n1 n2 n3 model <numeric> M=... $EA=...
        #   qname n1 n2 n3 model $EA=... <numeric> M=... 
        #   qname n1 n2 n3 model {$EA=...} {$W=...} {$L=...} {$SUB=...} {M=...}
        # No: l:qname n1 n2 n3 {nsub} model {$EA=...} {$W=...} {$L=...} {$SUB=...} {M=...}
        #   CDL-std adds {nsub} way to add substrate before model: We don't support it.
        #   Add 3rd term IFF $SUB=. We propagate optional W/L (or derived from $W/$L).
        #   EA is emitterSize; not supported by XFAB: deleted.
        #   We require 3-terminals and model. It is an error to specify $[model].
        #
        # out format:
        #   Xqname n1 n2 n3 model M=... par1=...
        if c0 == "q":
            tlen = len(tok)
            if tlen < 5:
                err+=1
                msg = "*cdl2spi.py: ERROR: Bipolar does not have minimum three terminals and a model:"
                tmp += [ msg, i ]
                continue
            if cdlModel != "":
                err+=1
                msg = "*cdl2spi.py: ERROR: Bipolar does not support $[<model>] directive:"
                tmp += [ msg, i ]
                continue
            tok = mapBipolar(cdlTerm, cdlModel, tok, options)
            # add X to tok0.
            if options['subckt']:
                tok[0] = "X" + tok[0]
            tmp += [ " ".join(tok) ]
            continue

        # Anything else. What to do, preserve AS-IS with warning, or 
        # flag them as ERRORs?
        tmp += [ "*cdl2spi.py: ERROR: unrecognized line:", i ]
        err+=1
        # tmp += [ "*cdl2spi.py: WARNING: unrecognized line:", " ".join(tok) ]
        # tmp += [ "*cdl2spi.py: WARNING: unrecognized line:", i ]
        # warn+=1

    # Re-wrap continuation lines at 80 characters
    lines = []
    for line in tmp:
        lines.append('\n+ '.join(textwrap.wrap(line, 80)))

    # Write output

    if fnmOut == sys.stdout:
        for i in lines:
            print(i)
    else:
        try:
            with open(fnmOut, 'w') as outFile:
                for i in lines:
                    print(i, file=outFile)
        except:
            print('cdl2spi.py: failed to open ' + fnmOut + ' for writing.', file=sys.stderr)
            return 1

    # exit status: indicates if there were errors.
    print( "*cdl2spi.py: %d errors, %d warnings" % (err, warn))
    return err

if __name__ == '__main__':

    options = {}

    # Set option defaults
    options['debug'] = False
    options['subckt'] = False
    options['dscale'] = ''
    options['addinm'] = []
    options['ignore'] = []

    arguments = []
    for item in sys.argv[1:]:
        if item.find('-', 0) == 0:
            thisopt = item.split('=')
            optname = thisopt[0][1:]
            optval = '='.join(thisopt[1:])
            if not optname in options:
                print('Unknown option -' + optname + '; ignoring.')
            else:
                lastoptval = options[optname]
                if len(thisopt) == 1:
                    options[optname] = True
                elif lastoptval == '':
                    options[optname] = optval
                else:
                    options[optname].append(optval)
        else:
            arguments.append(item)

    # Supported primitive devices (FET, diode, resistor, capacitor, bipolar)
    primch  = 'mdrcq'
    primch2 = 'mdrcqx'

    if len(arguments) > 0:
        fnmIn = arguments[0]

    if len(arguments) > 1:
        fnmOut = arguments[1]
    else:
        fnmOut = sys.stdout

    if options['debug']:
        test_mapSubcktInst1()
        test_mapSubcktInst2()
        test_mapMfactor()
        test_CDLparam()
        test_CDLtermModel()
        test_mapDiscard()
        test_mapPartAssign()
        test_mapLookup()
        test_mapDiode()
        test_mapMos()
        test_mapCap()
        test_mapRes()
        test_mapBipolar()

    elif len(arguments) > 2 or len(arguments) < 1 :
        print('Usage: cdl2spi.py <cdlFileName> [<spiFileName>]')
        print('   Options:' )
        print('       -debug              run debug tests')
        print('       -dscale=<suffix>    rescale lengths with <suffix>')
        print('       -addinm=<param>     add multiplier parameter <param>')
        print('       -ignore=<param>     ignore parameter <param>')
        print('       -subckt             convert primitive devices to subcircuits')
        sys.exit(1)

    else:
        if options['debug'] == True:
            print('Diagnostic:  options = ' + str(options))
        result = cdl2spice(fnmIn, fnmOut, options)
        sys.exit(result)

