#!/usr/bin/env python3
"""spice_units.py: Converts tuple of (unit, value) into standard unit numeric value."""

import re

# set of metric prefixes and the value needed to multiply by to
# get the "standard" unit for SPICE.  Only standard units will
# be written into the SPICE file, for reasons of universal
# compatibility.

prefixtypes = {
	"T": 1E12,  "tera" : 1E12,
	"G": 1E9,   "giga" : 1E9,
	"M": 1E6,   "mega" : 1E6,   "MEG": 1E6, "meg": 1E6,
	"K": 1E3,   "kilo" : 1E3,   "k":1E3,
	"D": 1E1,   "deca" : 1E1,
	"d": 1E-1,  "deci" : 1E-1,
	"c": 1E-2,  "centi": 1E-2,  "%": 1E-2,
	"m": 1E-3,  "milli": 1E-3,
	"u": 1E-6,  "micro": 1E-6,  "\u00b5": 1E-6, "ppm": 1E-6,
	"n": 1E-9,  "nano" : 1E-9,  "ppb": 1E-9,
	"p": 1E-12, "pico" : 1E-12, "ppt": 1E-12,
	"f": 1E-15, "femto": 1E-15,
	"a": 1E-18, "atto" : 1E-15,
}

# set of known unit types, including some with suffixes, along with a
# keyword that can be used to limit the search if an expected type for
# the value is known.  Keys are used in regular expressions, and so
# may use any regular expression syntax.

unittypes = {
	"[Ff]": "capacitance",
	"[Ff]arad[s]*": "capacitance",
	"\u03a9": "resistance", 
	"[Oo]hm[s]*": "resistance",
	"[Vv]": "voltage",
	"[Vv]olt[s]*": "voltage",
	"[Aa]": "current",
	"[Aa]mp[s]*": "current",
	"[Aa]mpere[s]*": "current",
	"[Ss]": "time",
	"[Ss]econd[s]*": "time",
	"[Hh]": "inductance",
	"[Hh]enry[s]*": "inductance",
	"[Hh]enries": "inductance",
	"[Hh]z": "frequency",
	"[Hh]ertz": "frequency",
	"[Mm]": "distance",
	"[Mm]eter[s]*": "distance",
	"[\u00b0]*[Cc]": "temperature",
	"[\u00b0]*[Cc]elsius": "temperature",
	"[\u00b0]*[Kk]": "temperature",
	"[\u00b0]*[Kk]elvin": "temperature",
	"[Ww]": "power",
	"[Ww]att[s]*": "power",
	"[Vv]-rms": "noise",
	"[Vv]olt[s]*-rms": "noise",
	"'[bohd]": "digital",
	"": "none"
}

# Define how to convert SI units to spice values
#
# NOTE: spice_unit_unconvert can act on a tuple of (units, value) where
# value is either a single value or a list of values.  spice_unit_convert
# only acts on a tuple with a single value.  This is because the only large
# vectors are produced by ngspice, and these values need unconverting back
# into the units specified by the datasheet.  Values being converted to
# ngspice units are from the datasheet and are only computed a few at a
# time, so handling vectors is not particularly efficient.

def spice_unit_convert(valuet, restrict=[]):
    """Convert SI units into spice values"""
    # valuet is a tuple of (unit, value), where "value" is numeric
    # and "unit" is a string.  "restrict" may be used to require that
    # the value be of a specific class like "time" or "resistance". 

    # Recursive handling of '/' and multiplicatioon dot in expressions
    if '/' in valuet[0]:
        parts = valuet[0].split('/', 1)
        result = float(spice_unit_convert([parts[0], valuet[1]], restrict))
        result /= float(spice_unit_convert([parts[1], "1.0"], restrict))
        return str(result)

    if '\u22c5' in valuet[0]:	# multiplication dot
        parts = valuet[0].split('\u22c5')
        result = float(spice_unit_convert([parts[0], valuet[1]], restrict))
        result *= float(spice_unit_convert([parts[1], "1.0"], restrict))
        return str(result)

    if '\u00b2' in valuet[0]:	# squared
        part = valuet[0].split('\u00b2')[0]
        result = float(spice_unit_unconvert([part, valuet[1]], restrict))
        result *= float(spice_unit_unconvert([part, "1.0"], restrict))
        return str(result)

    if valuet[0] == "":		# null case, no units
        return valuet[1]

    for unitrec in unittypes:	# case of no prefix
        if re.match('^' + unitrec + '$', valuet[0]):
            if restrict:
                if unittypes[unitrec] == restrict.lower():
                    return valuet[1]
            else:
                return valuet[1]

    for prerec in prefixtypes:
        for unitrec in unittypes:
            if re.match('^' + prerec + unitrec + '$', valuet[0]):
                if restrict:
                    if unittypes[unitrec] == restrict.lower():
                        newvalue = float(valuet[1]) * prefixtypes[prerec]
                        return str(newvalue)
                else:
                    newvalue = float(valuet[1]) * prefixtypes[prerec]
                    return str(newvalue)

    # Check for "%", which can apply to anything.
    if valuet[0][0] == '%':
        newvalue = float(valuet[1]) * 0.01
        return str(newvalue)
    
    if restrict:
        raise ValueError('units ' + valuet[0] + ' cannot be parsed as ' + restrict.lower())
    else:
        # raise ValueError('units ' + valuet[0] + ' cannot be parsed')
        # (Assume value is not in SI units and will be passed back as-is)
        return valuet[1]

# Define how to convert spice values back into SI units

def spice_unit_unconvert(valuet, restrict=[]):
    """Convert spice values back into SI units"""
    # valuet is a tuple of (unit, value), where "value" is numeric
    # and "unit" is a string.  "restrict" may be used to require that
    # the value be of a specific class like "time" or "resistance". 

    # Recursive handling of '/' and multiplicatioon dot in expressions
    if '/' in valuet[0]:
        parts = valuet[0].split('/', 1)
        result = spice_unit_unconvert([parts[0], valuet[1]], restrict)
        if isinstance(result, list):
            result = list(item / spice_unit_unconvert([parts[1], 1.0],
			restrict) for item in result)
        else:
            result /= spice_unit_unconvert([parts[1], 1.0], restrict)
        return result

    if '\u22c5' in valuet[0]:	# multiplication dot
        parts = valuet[0].split('\u22c5')
        result = spice_unit_unconvert([parts[0], valuet[1]], restrict)
        if isinstance(result, list):
            result = list(item * spice_unit_unconvert([parts[1], 1.0],
			restrict) for item in result)
        else:
            result *= spice_unit_unconvert([parts[1], 1.0], restrict)
        return result

    if '\u00b2' in valuet[0]:	# squared
        part = valuet[0].split('\u00b2')[0]
        result = spice_unit_unconvert([part, valuet[1]], restrict)
        if isinstance(result, list):
            result = list(item * spice_unit_unconvert([part, 1.0],
			restrict) for item in result)
        else:
            result *= spice_unit_unconvert([part, 1.0], restrict)
        return result

    if valuet[0] == "":		# null case, no units
        return valuet[1]

    for unitrec in unittypes:	# case of no prefix
        if re.match('^' + unitrec + '$', valuet[0]):
            if restrict:
                if unittypes[unitrec] == restrict.lower():
                    return valuet[1]
            else:
                return valuet[1]

    for prerec in prefixtypes:
        for unitrec in unittypes:
            if re.match('^' + prerec + unitrec + '$', valuet[0]):
                if restrict:
                    if unittypes[unitrec] == restrict.lower():
                        if isinstance(valuet[1], list):
                            return list(item / prefixtypes[prerec] for item in valuet[1])
                        else:
                            return valuet[1] / prefixtypes[prerec]
                else:
                    if isinstance(valuet[1], list):
                        return list(item / prefixtypes[prerec] for item in valuet[1])
                    else:
                        return valuet[1] / prefixtypes[prerec]

    # Check for "%", which can apply to anything.
    if valuet[0][0] == '%':
        if isinstance(valuet[1], list):
            return list(item * 100 for item in valuet[1])
        else:
            return valuet[1] * 100
    
    if restrict:
        raise ValueError('units ' + valuet[0] + ' cannot be parsed as ' + restrict.lower())
    else:
        # raise ValueError('units ' + valuet[0] + ' cannot be parsed')
        # (Assume value is not in SI units and will be passed back as-is)
        return valuet[1]
