#!/usr/bin/env python3
#
# Plot MOSFET I/V curve from devicename + '__vth.data' from running ngspice
# on 'mosfet_test.spice'

import os
import sys
import matplotlib.pyplot as plt


def make_mosfet_iv_plot(devicepath, devicename, version, corner):

    with open(devicepath + '/' + devicename + '__vth.data', 'r') as ifile:
        idata = ifile.read().split()

    # Reformat data

    nrows = int(len(idata) / 6)
    allIds = list(float(idata[p + 1]) for p in range(0, len(idata), 6))
    allVgs = list(float(idata[p + 3]) for p in range(0, len(idata), 6))
    allVds = list(float(idata[p + 5]) for p in range(0, len(idata), 6))

    # Generate X/Y plots

    plt.figure()
    for i in range(0, len(allIds), 181 * 10):
        Ids = allIds[i : i + 181]
        Vgs = allVgs[i : i + 181]
        Vds = allVds[i : i + 181]
        plt.plot(Vds, Ids)

    title = 'SkyWater SKY130 PDK ' + version + '\n' + devicename + '\nI/V characteristic (Ids vs. Vds) at corner ' + corner
    plt.title(title)
    plt.xlabel('Vds (Volts)')
    plt.ylabel('Ids (Amps)')
    plt.axis('on')
    plt.grid('on')
    plt.savefig(devicepath + '/' + devicename + '_ids_v_vds.svg')

    plt.figure()
    for i in range(0, 181, 18):
        Ids = allIds[i : len(allIds): 181]
        Vgs = allVgs[i : len(allVgs): 181]
        Vds = allVds[i : len(allVds): 181]
        plt.plot(Vgs, Ids)

    title = 'SkyWater SKY130 PDK ' + version + '\n' + devicename + '\nI/V characteristic (Ids vs. Vgs) at corner ' + corner
    plt.title(title)
    plt.xlabel('Vgs (Volts)')
    plt.ylabel('Ids (Amps)')
    plt.axis('on')
    plt.grid('on')
    plt.savefig(devicepath + '/' + devicename + '_ids_v_vgs.svg')


if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("No device name given to plot_mosfet_iv")
        sys.exit(1)

    devicename = sys.argv[1]
    make_mosfet_iv_plot(os.getcwd(), devicename, version, corner)
