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

import sys
import matplotlib.pyplot as plt

def make_mosfet_iv_plot(devicename, version, corner):
    with open('results/' + devicename + '.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 + ' ' + devicename + ' I/V characteristic (Ids vs. Vds) at corner ' + corner
    plt.title(title)
    plt.xlabel('Vds (V)')
    plt.ylabel('Ids (A)')
    plt.axis('on')
    plt.grid('on')
    plt.savefig('results/' + 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 + ' ' + devicename + ' I/V characteristic (Ids vs. Vgs) at corner ' + corner
    plt.title(title)
    plt.xlabel('Vgs (V)')
    plt.ylabel('Ids (A)')
    plt.axis('on')
    plt.grid('on')
    plt.savefig('results/' + 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(devicename, version, corner)

