📄 dctrcurv.c
字号:
goto nextstep; } } /* else not possible */ while (i > 0) { /* init(i); */ i--; if(cv->TRCVvType[i]==vcode) { /* voltage source */ ((VSRCinstance *)(cv->TRCVvElt[i]))->VSRCdcValue = cv->TRCVvStart[i]; } else if(cv->TRCVvType[i]==icode) { /* current source */ ((ISRCinstance *)(cv->TRCVvElt[i]))->ISRCdcValue = cv->TRCVvStart[i]; } else if(cv->TRCVvType[i]==TEMP_CODE) { ckt->CKTtemp = cv->TRCVvStart[i] + CONSTCtoK; CKTtemp(ckt); } else if(cv->TRCVvType[i]==rcode) { ((RESinstance *)(cv->TRCVvElt[i]))->RESresist = cv->TRCVvStart[i]; ((RESinstance *)(cv->TRCVvElt[i]))->RESconduct = 1/(((RESinstance *)(cv->TRCVvElt[i]))->RESresist); /* Note: changing the resistance does nothing */ /* changing the conductance 1/r instead */ DEVices[rcode]->DEVload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); /* * RESload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); */ } /* else not possible */ } /* Rotate state vectors. */ temp = ckt->CKTstates[ckt->CKTmaxOrder+1]; for(j=ckt->CKTmaxOrder;j>=0;j--) { ckt->CKTstates[j+1] = ckt->CKTstates[j]; } ckt->CKTstate0 = temp; /* do operation */#ifdef XSPICE/* gtri - begin - wbk - Do EVTop if event instances exist */ if(ckt->evt->counts.num_insts == 0) { /* If no event-driven instances, do what SPICE normally does */#endif converged = NIiter(ckt,ckt->CKTdcTrcvMaxIter); if(converged != 0) { converged = CKTop(ckt, (ckt->CKTmode&MODEUIC)|MODEDCTRANCURVE | MODEINITJCT, (ckt->CKTmode&MODEUIC)|MODEDCTRANCURVE | MODEINITFLOAT, ckt->CKTdcMaxIter); if(converged != 0) { return(converged); } }#ifdef XSPICE } else { /* else do new algorithm */ /* first get the current step in the analysis */ if(cv->TRCVvType[0] == vcode) { g_mif_info.circuit.evt_step = ((VSRCinstance *)(cv->TRCVvElt[i])) ->VSRCdcValue ; } else if(cv->TRCVvType[0] == icode) { g_mif_info.circuit.evt_step = ((ISRCinstance *)(cv->TRCVvElt[i])) ->ISRCdcValue ; } else if(cv->TRCVvType[0] == rcode) { g_mif_info.circuit.evt_step = ((RESinstance*)(cv->TRCVvElt[i]->GENmodPtr)) ->RESresist; } else if(cv->TRCVvType[0] == TEMP_CODE) { g_mif_info.circuit.evt_step = ckt->CKTtemp - CONSTCtoK; } /* if first time through, call EVTop immediately and save event results */ if(firstTime) { converged = EVTop(ckt, (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITJCT, (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITFLOAT, ckt->CKTdcMaxIter, MIF_TRUE); EVTdump(ckt, IPC_ANAL_DCOP, g_mif_info.circuit.evt_step); EVTop_save(ckt, MIF_FALSE, g_mif_info.circuit.evt_step); if(converged != 0) return(converged); } /* else, call NIiter first with mode = MODEINITPRED */ /* to attempt quick analog solution. Then call all hybrids and call */ /* EVTop only if event outputs have changed, or if non-converged */ else { converged = NIiter(ckt,ckt->CKTdcTrcvMaxIter); EVTcall_hybrids(ckt); if((converged != 0) || (ckt->evt->queue.output.num_changed != 0)) { converged = EVTop(ckt, (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITJCT, (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITFLOAT, ckt->CKTdcMaxIter, MIF_FALSE); EVTdump(ckt, IPC_ANAL_DCTRCURVE, g_mif_info.circuit.evt_step); EVTop_save(ckt, MIF_FALSE, g_mif_info.circuit.evt_step); if(converged != 0) return(converged); } } }/* gtri - end - wbk - Do EVTop if event instances exist */#endif ckt->CKTmode = (ckt->CKTmode&MODEUIC) | MODEDCTRANCURVE | MODEINITPRED ; if(cv->TRCVvType[0] == vcode) { ckt->CKTtime = ((VSRCinstance *)(cv->TRCVvElt[i])) ->VSRCdcValue ; } else if(cv->TRCVvType[0] == icode) { ckt->CKTtime = ((ISRCinstance *)(cv->TRCVvElt[i])) ->ISRCdcValue ; } else if(cv->TRCVvType[0] == rcode) { ckt->CKTtime = ((RESinstance *)(cv->TRCVvElt[i])) ->RESresist; } /* PN Temp sweep */ else { ckt->CKTtime = ckt->CKTtemp - CONSTCtoK ; }#ifdef XSPICE/* gtri - add - wbk - 12/19/90 - Add IPC stuff */ /* If first time through, call CKTdump to output Operating Point info */ /* for Mspice compatibility */ if(g_ipc.enabled && firstTime) { ipc_send_dcop_prefix(); CKTdump(ckt,(double) 0,plot); ipc_send_dcop_suffix(); }/* gtri - end - wbk */#endif#ifdef WANT_SENSE2/* if(!ckt->CKTsenInfo) printf("sensitivity structure does not exist\n"); */ if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode&DCSEN) ){ int senmode;#ifdef SENSDEBUG if(cv->TRCVvType[i]==vcode) { /* voltage source */ printf("Voltage Source Value : %.5e V\n", ((VSRCinstance*) (cv->TRCVvElt[i]))->VSRCdcValue); } if(cv->TRCVvType[i]==icode) { /* current source */ printf("Current Source Value : %.5e A\n", ((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcValue); } if(cv->TRCVvType[i]==rcode) { /* resistance */ printf("Current Resistance Value : %.5e Ohm\n", ((RESinstance*)(cv->TRCVvElt[i]->GENmodPtr))->RESresist); } if(cv->TRCVvType[i]==TEMP_CODE) { /* Temperature */ printf("Current Circuit Temperature : %.5e C\n", ckt-CKTtemp - CONSTCtoK); } #endif /* SENSDEBUG */ senmode = ckt->CKTsenInfo->SENmode; save = ckt->CKTmode; ckt->CKTsenInfo->SENmode = DCSEN; if(error = CKTsenDCtran(ckt)) return (error); ckt->CKTmode = save; ckt->CKTsenInfo->SENmode = senmode; }#endif#ifdef XSPICE/* gtri - modify - wbk - 12/19/90 - Send IPC delimiters */ if(g_ipc.enabled) ipc_send_data_prefix(ckt->CKTtime);#endif CKTdump(ckt,ckt->CKTtime,plot);#ifdef XSPICE if(g_ipc.enabled) ipc_send_data_suffix();/* gtri - end - wbk */#endif if(firstTime) { firstTime=0; bcopy((char *)ckt->CKTstate0,(char *)ckt->CKTstate1, ckt->CKTnumStates*sizeof(double)); }nextstep:; if(cv->TRCVvType[i]==vcode) { /* voltage source */ ((VSRCinstance*)(cv->TRCVvElt[i]))->VSRCdcValue += cv->TRCVvStep[i]; } else if(cv->TRCVvType[i]==icode) { /* current source */ ((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcValue += cv->TRCVvStep[i]; } else if(cv->TRCVvType[i]==rcode) { /* resistance */ ((RESinstance*)(cv->TRCVvElt[i]))->RESresist += cv->TRCVvStep[i]; /* This code should update resistance and conductance */ ((RESinstance*)(cv->TRCVvElt[i]))->RESconduct = 1/(((RESinstance*)(cv->TRCVvElt[i]))->RESresist); DEVices[rcode]->DEVload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); /* * RESload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); */ } /* PN Temp Sweep - serban */ else if (cv->TRCVvType[i]==TEMP_CODE) { ckt->CKTtemp += cv->TRCVvStep[i]; CKTtemp(ckt); } /* else not possible */ if( (*(SPfrontEnd->IFpauseTest))() ) { /* user asked us to pause, so save state */ cv->TRCVnestState = i; return(E_PAUSE); } } /* all done, lets put everything back */ for(i=0;i<=cv->TRCVnestLevel;i++) { if(cv->TRCVvType[i] == vcode) { /* voltage source */ ((VSRCinstance*)(cv->TRCVvElt[i]))->VSRCdcValue = cv->TRCVvSave[i]; ((VSRCinstance*)(cv->TRCVvElt[i]))->VSRCdcGiven = cv->TRCVgSave[i]; } else if(cv->TRCVvType[i] == icode) /*current source */ { ((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcValue = cv->TRCVvSave[i]; ((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcGiven = cv->TRCVgSave[i]; } else if(cv->TRCVvType[i] == rcode) /* Resistance */ { ((RESinstance*)(cv->TRCVvElt[i]))->RESresist = cv->TRCVvSave[i]; /* We restore both resistance and conductance */ ((RESinstance*)(cv->TRCVvElt[i]))->RESconduct = 1/(((RESinstance*)(cv->TRCVvElt[i]))->RESresist); ((RESinstance*)(cv->TRCVvElt[i]))->RESresGiven = cv->TRCVgSave[i]; DEVices[rcode]->DEVload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); /* * RESload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); */ } else if(cv->TRCVvType[i] == TEMP_CODE) { ckt->CKTtemp = cv->TRCVvSave[i]; CKTtemp(ckt); } /* else not possible */ } (*(SPfrontEnd->OUTendPlot))(plot); return(OK);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -