1

发布时间 2023-03-28 14:47:02作者: Witheredead
filename = "ICSkillSharing.ocn"
design_dir = "/home/IC/Documents/analog_ic/simulation/inv/spectre/schematic/netlist/netlist" ;dir of netlist file
modelfile_dir = "/home/IC/Documents/pdks/smic18mmrf/models/spectre/ms018_v1p9_spe.lib" ;dir of process models
for(corner_sim 1 3 ;;loop for corner, corner_mos、corner_bjt、corner_res、corner_cap are different corners
    if(corner_sim == 1 then corner_dir = "tt" corner_mos = list(modelfile_dir "tt") corner_res = list(modelfile_dir "res_tt") corner_cap = list(modelfile_dir "mim_tt") corner_bjt = list(modelfile_dir "bjt_tt"))
    if(corner_sim == 2 then corner_dir = "ss" corner_mos = list(modelfile_dir "ss") corner_res = list(modelfile_dir "res_tt") corner_cap = list(modelfile_dir "mim_tt") corner_bjt = list(modelfile_dir "bjt_tt"))
    if(corner_sim == 3 then corner_dir = "ff" corner_mos = list(modelfile_dir "ff") corner_res = list(modelfile_dir "res_tt") corner_cap = list(modelfile_dir "mim_tt") corner_bjt = list(modelfile_dir "bjt_tt"))
    ;if(corner_sim == 4 then corner_dir = "sf" corner_mos = list(modelfile_dir "sf") corner_res = list(modelfile_dir "res_tt") corner_cap = list(modelfile_dir "mim_tt") corner_bjt = list(modelfile_dir "bjt_tt"))
    ;if(corner_sim == 5 then corner_dir = "fs" corner_mos = list(modelfile_dir "fs") corner_res = list(modelfile_dir "res_tt") corner_cap = list(modelfile_dir "mim_tt") corner_bjt = list(modelfile_dir "bjt_tt"))
        for(vdd_sim 1 3 ;;loop for power supply
            if( vdd_sim == 1 then vdd = 3.0 vdd_dir = "3p0")
            if( vdd_sim == 2 then vdd = 3.3 vdd_dir = "3p3")
            if( vdd_sim == 3 then vdd = 2.7 vdd_dir = "2p7")

                for(temp_sim 1 3 ;;loop for temp
                    if(temp_sim == 1 then temp = 27 temp_dir = "27")
                    if(temp_sim == 2 then temp = -40 temp_dir = "m40")
                    if(temp_sim == 3 then temp = 125 temp_dir = "125")

                    results_dir = strcat(substring(design_dir 1 62) substring(filename 1 14) "/" corner_dir "_v" vdd_dir "_t" temp_dir) ;save results dir
                    simulator( 'spectre ) ;setup siulator
                    design( design_dir ) ;netlist file
                    resultsDir( results_dir ) ;save results dir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;     add simulation script blow    ;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                    modelFile( corner_mos corner_bjt corner_res corner_cap ) ;setup process models
                    analysis('dc ?saveOppoint t  ?param "va"  ?start "0"
                        ?stop "3"  ) ;add dc simulation
                    ;analysis('ac ?start "1"  ?stop "1G"  ) ;add ac simulation
                    ;analysis('stb ?start "1" ?stop "10G" ?probe "/IPRB0" ) ;add stb simulation
                    analysis('tran ?stop "10u" ?errpreset "conservative" ) ;add tran simulation
                    desVar( "avdd" vdd ) ;setup avdd
                    desVar( "va" 1.5 ) ;setup va
                    envOption(
                        'analysisOrder  list("dc" "tran")
                    ) ;setup simulation order
                    option( ?categ 'turboOpts
                        'apsplus  t
                        'errorLevel  "Moderate"
                        'uniMode  "APS"
                    ) ;use aps
                    saveOption( 'subcktprobelvl "5" ) ;save results option, for 5th subckt blow
                    saveOption( 'currents "all" ) ;save all current
                    temp( temp ) ;setup temp
                    run() ;start the simulation

                    selectResult( 'tran ) ;select result for tran simulation
                    VTEST = average(VT("/Y"))
                    plot(getData("/A") getData("/Y") ?expr list(strcat("A_" corner_dir "_v" vdd_dir "_t" temp_dir) strcat("Y_" corner_dir "_v" vdd_dir "_t" temp_dir)) ) ;plot A & Y
                    selectResult( 'dc ) ;select result for dc simulation
                    plot(getData("/A") getData("/Y") ?expr list(strcat("A:" corner_dir "_v" vdd_dir "_t" temp_dir) strcat("Y:" corner_dir "_v" vdd_dir "_t" temp_dir)) ) ;plot A & Y
                    ;selectResult( 'ac ) ;select result for ac simulation
                    ;plot(getData("/A") getData("/Y") ?expr list(strcat("A:" corner_dir "_v" vdd_dir "_t" temp_dir) strcat("Y:" corner_dir "_v" vdd_dir "_t" temp_dir)) ) ;plot A & Y
                    ;YN = clip((- VT("/Y")) 1e-06 9e-06) ;use calculator
                    ;plot( YN ?expr list( strcat("YN:" corner_dir "_v" vdd_dir "_t" temp_dir) ) ) ;plot result

                    ;results_outfile = outfile(strcat(substring(design_dir 1 62) substring(filename 1 14) ".txt") "a") ;save VTEST to a file
                    ;fprintf(results_outfile "The PVT are:\t\t %s_v%s_t%s\n" corner_dir vdd_dir temp_dir) ;save PVT info
                    ;fprintf(results_outfile "The results are:\t VTEST = %f\n" VTEST) ;save result to file
                    ;close(results_outfile) ;close file opened before

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;    add simulation script above    ;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                ) ;;end loop for temp
        ) ;;end loop for power supply
) ;;end loop for corner