46 #include <Xyce_config.h>
48 #include <N_UTL_Misc.h>
59 #include <N_ERH_ErrorMgr.h>
61 #include <N_LAS_Matrix.h>
62 #include <N_LAS_Vector.h>
64 #include <N_UTL_BreakPoint.h>
66 #include <N_UTL_Functors.h>
76 .setDescription(
"Characteristic Impedance");
80 .setDescription(
"Characteristic Impedance");
84 .setDescription(
"Time delay");
88 .setDescription(
"Frequency");
91 .setDescription(
"Length in wavelengths");
114 :
DeviceInstance(instance_block, configuration.getInstanceParameters(), factory_block),
133 APos1EquPos1NodeOffset(-1),
134 APos1EquInt1NodeOffset(-1),
135 AInt1EquPos1NodeOffset(-1),
136 AInt1EquInt1NodeOffset(-1),
137 AInt1EquIbr1NodeOffset(-1),
138 ANeg1EquIbr1NodeOffset(-1),
139 AIbr1EquInt1NodeOffset(-1),
140 AIbr1EquNeg1NodeOffset(-1),
141 APos2EquPos2NodeOffset(-1),
142 APos2EquInt2NodeOffset(-1),
143 AInt2EquPos2NodeOffset(-1),
144 AInt2EquInt2NodeOffset(-1),
145 AInt2EquIbr2NodeOffset(-1),
146 ANeg2EquIbr2NodeOffset(-1),
147 AIbr2EquInt2NodeOffset(-1),
148 AIbr2EquNeg2NodeOffset(-1),
149 AIbr1EquPos2NodeOffset(-1),
150 AIbr1EquNeg2NodeOffset(-1),
151 AIbr1EquIbr2NodeOffset(-1),
152 AIbr2EquPos1NodeOffset(-1),
153 AIbr2EquNeg1NodeOffset(-1),
154 AIbr2EquIbr1NodeOffset(-1),
155 first_BP_call_done(false),
159 newBreakPoint(false),
160 newBreakPointTime(0.0)
235 UserError0(*
this) <<
"Invalid (zero or negative) impedance given.";
241 UserError0(*
this) <<
"Neither time delay (TD) nor frequency (F) given.";
245 UserError0(*
this) <<
"Both time delay (TD) and frequency (F) given. Pick one.";
252 else if (!
given(
"TD"))
254 UserError0(*
this) <<
"Zero or negative frequency given.";
264 #ifdef Xyce_DEBUG_DEVICE
267 Xyce::dout() <<
" Z0 = " <<
Z0 << std::endl;
268 Xyce::dout() <<
" td = " <<
td << std::endl;
269 Xyce::dout() <<
" freq = " <<
freq << std::endl;
270 Xyce::dout() <<
" NL = " <<
NL << std::endl;
285 bool bsuccess =
true;
312 const std::vector<int> & extLIDVecRef )
317 #ifdef Xyce_DEBUG_DEVICE
320 Xyce::dout() << std::endl << section_divider << std::endl;
321 Xyce::dout() <<
"In Instance::registerLIDs\n\n";
322 Xyce::dout() <<
"name = " <<
getName() << std::endl;
323 Xyce::dout() <<
"number of internal variables: " <<
numIntVars << std::endl;
324 Xyce::dout() <<
"number of external variables: " <<
numExtVars << std::endl;
347 #ifdef Xyce_DEBUG_DEVICE
350 Xyce::dout() <<
" VARIABLE Indicies " << std::endl;
351 Xyce::dout() <<
"li_Pos1 = " <<
li_Pos1 << std::endl;
352 Xyce::dout() <<
"li_Neg1 = " <<
li_Neg1 << std::endl;
353 Xyce::dout() <<
"li_Int1 = " <<
li_Int1 << std::endl;
354 Xyce::dout() <<
"li_Ibr1 = " <<
li_Ibr1 << std::endl;
355 Xyce::dout() <<
"li_Pos2 = " <<
li_Pos2 << std::endl;
356 Xyce::dout() <<
"li_Neg2 = " <<
li_Neg2 << std::endl;
357 Xyce::dout() <<
"li_Int2 = " <<
li_Int2 << std::endl;
358 Xyce::dout() <<
"li_Ibr2 = " <<
li_Ibr2 << std::endl;
360 Xyce::dout() <<
"\nEnd of Instance::register LIDs\n";
361 Xyce::dout() << section_divider << std::endl;
412 AssertLIDs(stoLIDVecRef.size() == getNumStoreVars());
414 if( loadLeadCurrent )
416 li_store_dev_i1 = stoLIDVecRef[0];
417 li_store_dev_i2 = stoLIDVecRef[1];
432 if( loadLeadCurrent && storeNameMap.empty ())
512 bool bsuccess =
true;
525 #ifdef Xyce_DEBUG_DEVICE
528 Xyce::dout() << subsection_divider << std::endl;
529 Xyce::dout() <<
" Instance::loadDAEFVector" << std::endl;
530 Xyce::dout() <<
" name = " <<
getName() <<std::endl;
634 #ifdef Xyce_DEBUG_DEVICE
637 Xyce::dout() << subsection_divider << std::endl;
638 Xyce::dout() <<
" name = " <<
getName() << std::endl;
701 #ifdef Xyce_DEBUG_DEVICE
703 Xyce::dout() << subsection_divider << std::endl;
719 #ifdef Xyce_DEBUG_DEVICE
722 Xyce::dout() << std::endl << subsection_divider << std::endl;
723 Xyce::dout() <<
"In TRA::updatePrimaryState\n";
724 Xyce::dout() <<
" last_t is " <<
last_t << std::endl;
725 Xyce::dout() <<
" v1 is " <<
v1 << std::endl;
726 Xyce::dout() <<
" v2 is " <<
v2 << std::endl;
745 #ifdef Xyce_DEBUG_DEVICE
748 Xyce::dout() << std::endl << subsection_divider << std::endl;
749 Xyce::dout() <<
" In ::updateIntermediateVars\n\n";
764 #ifdef Xyce_DEBUG_DEVICE
767 Xyce::dout() <<
" Vpos1 = " <<
Vpos1 << std::endl;
768 Xyce::dout() <<
" Vneg1 = " <<
Vneg1 << std::endl;
769 Xyce::dout() <<
" Vint1 = " <<
Vint1 << std::endl;
770 Xyce::dout() <<
" Ibr1 = " <<
Ibr1 << std::endl;
771 Xyce::dout() <<
" Vpos2 = " <<
Vpos2 << std::endl;
772 Xyce::dout() <<
" Vneg2 = " <<
Vneg2 << std::endl;
773 Xyce::dout() <<
" Vint2 = " <<
Vint2 << std::endl;
774 Xyce::dout() <<
" Ibr2 = " <<
Ibr2 << std::endl;
785 #ifdef Xyce_DEBUG_DEVICE
787 Xyce::dout() <<
"DC Mode, V1 = " <<
v1 <<
", V2 = " <<
v2 << std::endl;
794 #ifdef Xyce_DEBUG_DEVICE
798 Xyce::dout() <<
" Time is " << currentTime << std::endl;
819 #ifdef Xyce_DEBUG_DEVICE
822 Xyce::dout() <<
"Transient, first time, T = ";
823 Xyce::dout() << currentTime;
824 Xyce::dout() <<
", V1 = " <<
v1;
825 Xyce::dout() <<
", V2 = " <<
v2 << std::endl;
831 double delayedTime = currentTime-
td;
836 #ifdef Xyce_DEBUG_DEVICE
839 Xyce::dout() <<
" Done with interpolation to delayedTime=";
840 Xyce::dout() << delayedTime;
841 Xyce::dout() <<
", have v1="<<
v1 <<
" and v2=" <<
v2 << std::endl;
842 Xyce::dout() <<
" INTERP " << delayedTime <<
" " <<
v1 <<
" " <<
v2 << std::endl;
843 Xyce::dout() <<
" Set last_t to " << currentTime << std::endl;
857 #ifdef Xyce_DEBUG_DEVICE
860 Xyce::dout() <<
"second or later iteration, t is " << currentTime;
861 Xyce::dout() <<
" have last_t = " <<
last_t <<
" v1="<<
v1 <<
" and v2=" <<
v2 << std::endl;
887 std::vector<History>::iterator first =
history.begin();
888 std::vector<History>::iterator it1;
889 std::vector<History>::iterator last =
history.end();
893 #ifdef Xyce_DEBUG_DEVICE
896 Xyce::dout() << Xyce::section_divider << std::endl;
897 Xyce::dout() <<
"Pruning for time t1="<<t1 << std::endl;
898 Xyce::dout() <<
" Oldest in list is t="<<first->t<<
" v1 = "<<first->v1 <<
899 " v2="<<first->v2 << std::endl;
900 Xyce::dout() <<
" latest in list is t="<<last->t<<
" v1 = "<<last->v1
901 <<
" v2="<<last->v2 << std::endl;
905 for (it1 = first, i = 0; it1->t < t1 && it1 != last; ++it1, ++i)
907 #ifdef Xyce_DEBUG_DEVICE
910 Xyce::dout() <<
"i = " << i <<
" t = " << it1->t;
911 Xyce::dout() <<
" v1 = " << it1->v1;
912 Xyce::dout() <<
" v2 = " << it1->v2 << std::endl;
917 #ifdef Xyce_DEBUG_DEVICE
920 Xyce::dout() <<
" i ="<<i << std::endl;
927 #ifdef Xyce_DEBUG_DEVICE
930 Xyce::dout() <<
"Need to prune. Keeping " << it1->t << std::endl;
936 #ifdef Xyce_DEBUG_DEVICE
939 Xyce::dout() <<
" Keeping " << it1->t << std::endl;
944 #ifdef Xyce_DEBUG_DEVICE
947 Xyce::dout() <<
" Keeping " << it1->t << std::endl;
954 #ifdef Xyce_DEBUG_DEVICE
957 Xyce::dout() << Xyce::section_divider << std::endl;
975 std::vector<History>::iterator first =
history.begin();
976 std::vector<History>::iterator it1;
977 std::vector<History>::iterator last =
history.end();
980 double v11,v21,v12,v22,v13,v23;
981 double dt12,dt13,dt23;
987 msg=
"Instance::InterpV1V2FromHistory called but history list is"
988 " empty. Might be due to trying to restart this netlist.\n"
989 "Restarts of netlists with transmission lines does not work yet.\n";
990 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL, msg);
997 if (t - first->t < -N_UTL_MachineDependentParams::MachinePrecision()
998 || t - last->t > N_UTL_MachineDependentParams::MachinePrecision() )
1000 UserError(*
this) <<
"Cannot interpolate to a time (" << t <<
") prior to oldest("
1001 << first->t <<
") or after newest(" << last->t <<
") in history";
1005 #ifdef Xyce_DEBUG_DEVICE
1008 Xyce::dout() <<
" interpolating for t = " << t << std::endl;
1014 if ( fabs(t-first->t)<N_UTL_MachineDependentParams::MachinePrecision())
1019 else if ( fabs(t-last->t)<N_UTL_MachineDependentParams::MachinePrecision())
1027 LessThan<History,double> lessFunct;
1043 #ifdef Xyce_DEBUG_DEVICE
1046 Xyce::dout() <<
"Using time t3="<<t3<<
" v1(t3)="<<v13<<
" v2(t3)="<<v23 << std::endl;
1047 Xyce::dout() <<
"Using time t2="<<t2<<
" v1(t2)="<<v12<<
" v2(t2)="<<v22 << std::endl;
1048 Xyce::dout() <<
"Using time t1="<<t1<<
" v1(t1)="<<v11<<
" v2(t1)="<<v21 << std::endl;
1097 *v1p = f1*v11+f2*v12+f3*v13;
1098 *v2p = f1*v21+f2*v22+f3*v23;
1120 bool bsuccess =
true;
1138 #ifdef Xyce_DEBUG_DEVICE
1141 Xyce::dout() <<
" In Instance::getBreakPoints "<<std::endl;
1142 Xyce::dout() <<
" First time step, I don't get to set breakpoints. Time is ";
1143 Xyce::dout() << currentTime << std::endl;
1172 double d11, d21, d12, d22;
1177 std::vector<History>::iterator last =
history.end();
1183 double oVp1,oVp2,oVn1,oVn2,oI1,oI2;
1185 double tmp_v1,tmp_v2, tmp_t;
1187 #ifdef Xyce_DEBUG_DEVICE
1191 Xyce::dout() <<
" In Instance::acceptStep "<<std::endl;
1192 Xyce::dout() <<
"I want breakpoints. Time is " << currentTime << std::endl;
1193 Xyce::dout() <<
" timeOld is " <<
timeOld << std::endl;
1214 oVp1 = (*theSolVectorPtr)[
li_Pos1];
1215 oVn1 = (*theSolVectorPtr)[
li_Neg1];
1216 oI1 = (*theSolVectorPtr)[
li_Ibr1];
1217 oVp2 = (*theSolVectorPtr)[
li_Pos2];
1218 oVn2 = (*theSolVectorPtr)[
li_Neg2];
1219 oI2 = (*theSolVectorPtr)[
li_Ibr2];
1223 ov1=(oVp2-oVn2)+
Z0*oI2;
1224 ov2=(oVp1-oVn1)+
Z0*oI1;
1226 #ifdef Xyce_DEBUG_DEVICE
1227 oVi1 = (*theSolVectorPtr)[
li_Int1];
1228 oVi2 = (*theSolVectorPtr)[
li_Int2];
1232 Xyce::dout() <<
" ----- New time step -----" << std::endl;
1233 Xyce::dout() <<
" Last solution : " << std::endl;
1234 Xyce::dout() <<
" vpos1 = " << oVp1 << std::endl;
1235 Xyce::dout() <<
" vneg1 = " << oVn1 << std::endl;
1236 Xyce::dout() <<
" vint1 = " << oVi1 << std::endl;
1237 Xyce::dout() <<
" ibr1 = " << oI1 << std::endl;
1238 Xyce::dout() <<
" vpos2 = " << oVp2 << std::endl;
1239 Xyce::dout() <<
" vneg2 = " << oVn2 << std::endl;
1240 Xyce::dout() <<
" vint2 = " << oVi2 << std::endl;
1241 Xyce::dout() <<
" ibr2 = " << oI2 << std::endl;
1242 Xyce::dout() <<
"in set breakpoints, saving for time=" << currentTime <<
", V1 = " << ov1 <<
", V2 = " << ov2 << std::endl;
1243 Xyce::dout() <<
" V1V2DBG " << currentTime <<
" " << ov1 <<
" " << ov2 << std::endl;
1252 tmp_v1 = last->v1; tmp_v2 = last->v2; tmp_t = last->t;
1254 #ifdef Xyce_DEBUG_DEVICE
1257 Xyce::dout() <<
"tmp_t=" << tmp_t <<
" last->t =" << last->t << std::endl;
1258 Xyce::dout() <<
"tmp_v1=" << tmp_v1 <<
" last->v1=" << last->v1 << std::endl;
1259 Xyce::dout() <<
"tmp_v2=" << tmp_v2 <<
" last->v2=" << last->v2 << std::endl;
1262 d11 = (tmp_v1-last->v1)/(tmp_t-last->t);
1263 d12 = (tmp_v2-last->v2)/(tmp_t-last->t);
1264 tmp_v1 = last->v1; tmp_v2 = last->v2; tmp_t = last->t;
1266 #ifdef Xyce_DEBUG_DEVICE
1269 Xyce::dout() <<
"tmp_t=" << tmp_t <<
" last->t =" << last->t << std::endl;
1270 Xyce::dout() <<
"tmp_v1=" << tmp_v1 <<
" last->v1=" << last->v1 << std::endl;
1271 Xyce::dout() <<
"tmp_v2=" << tmp_v2 <<
" last->v2=" << last->v2 << std::endl;
1274 d21 = (tmp_v1-last->v1)/(tmp_t-last->t);
1275 d22 = (tmp_v2-last->v2)/(tmp_t-last->t);
1276 #ifdef Xyce_DEBUG_DEVICE
1279 Xyce::dout() <<
"Derivs are " << d11 <<
" " << d21 << std::endl;
1280 Xyce::dout() <<
" and " << d12 <<
" " <<d22 << std::endl;
1281 Xyce::dout() <<
" fabs(d11-d21) = " << fabs(d11-d21) << std::endl;
1282 Xyce::dout() <<
" fabs(d12-d22) = " << fabs(d12-d22) << std::endl;
1283 Xyce::dout() <<
"D1D2DBG " << currentTime <<
" " << d11 <<
" " << d12 << std::endl;
1287 if ((fabs(d11-d21) >= .99*
Xycemax(fabs(d11),fabs(d21))+1) ||
1288 (fabs(d12-d22) >= .99*
Xycemax(fabs(d12),fabs(d22))+1))
1290 #ifdef Xyce_DEBUG_DEVICE
1293 Xyce::dout() <<
"Derivative is changing enough, I want to set a break point ";
1294 Xyce::dout() <<
td <<
" ahead of discontinuity, which is ";
1295 Xyce::dout() << tmp_t+
td<<std::endl;
1328 for (i=0;i<hsize;++i)
1336 #ifdef Xyce_DEBUG_DEVICE
1339 Xyce::dout() << Xyce::section_divider
1341 Xyce::dout() <<
" In Instance::getInternalState " << std::endl;
1342 Xyce::dout() <<
" name=" <<
getName() << std::endl;
1343 Xyce::dout() <<
" history size = " << hsize << std::endl;
1344 Xyce::dout() <<
" history data: " << std::endl;
1345 for (i = 0 ; i < hsize ; ++i)
1347 Xyce::dout() <<
" (" <<
history[i].t <<
", " <<
history[i].v1 <<
", "
1348 <<
history[i].v2 <<
")"<< std::endl;
1351 Xyce::dout() <<
" DeviceState ID = " << myState->
ID << std::endl;
1352 Xyce::dout() <<
" DeviceState data size " << myState->
data.size() << std::endl;
1353 Xyce::dout() <<
" Device State data: " << std::endl;
1354 for (i = 0 ; i < myState->
data.size() ; ++i)
1356 Xyce::dout() <<
" " << myState->
data[i] << std::endl;
1358 Xyce::dout() << Xyce::section_divider
1378 int dsize=state.
data.size();
1380 if (
getName().getEncodedName() != state.
ID)
1382 DevelFatal(*this).in(
"TRA::Instance::setInternal") <<
"ID(" << state.
ID <<
") from restart does not match my name (" <<
getName() <<
")";
1388 UserError(*
this) <<
"Data size from restart (" << dsize <<
") not a multiple of 3";
1395 for ( i=0; i<hsize; ++i)
1403 #ifdef Xyce_DEBUG_DEVICE
1406 Xyce::dout() << Xyce::section_divider
1408 Xyce::dout() <<
" In Instance::setInternalState " << std::endl;
1409 Xyce::dout() <<
" name=" <<
getName() << std::endl;
1410 Xyce::dout() <<
" history size = " << hsize << std::endl;
1411 Xyce::dout() <<
" history data: " << std::endl;
1412 for (i = 0 ; i < hsize ; ++i)
1414 Xyce::dout() <<
" (" <<
history[i].t <<
", " <<
history[i].v1 <<
", "
1415 <<
history[i].v2 <<
")"<< std::endl;
1418 Xyce::dout() <<
" DeviceState ID = " << state.
ID << std::endl;
1419 Xyce::dout() <<
" DeviceState data size " << state.
data.size() << std::endl;
1420 Xyce::dout() <<
" Device State data: " << std::endl;
1421 for (i = 0 ; i < state.
data.size() ; ++i)
1423 Xyce::dout() <<
" " << state.
data[i] << std::endl;
1425 Xyce::dout() << Xyce::section_divider
1459 std::vector<Instance*>::iterator iter;
1463 for (iter=first; iter!=last; ++iter)
1465 (*iter)->processParams();
1483 :
DeviceModel(MB, configuration.getModelParameters(), factory_block)
1498 std::vector<Instance*>::iterator iter;
1502 for (iter=first; iter!=last; ++iter)
1518 std::vector<Instance*>::const_iterator iter;
1524 os <<
" name model name Parameters" << std::endl;
1525 for (i=0, iter=first; iter!=last; ++iter, ++i)
1527 os <<
" " << i <<
": " << (*iter)->getName() <<
" ";
1531 os <<
"Z0 = " << (*iter)->Z0 << std::endl;
1532 os <<
"G0 = " << (*iter)->G0 << std::endl;
1533 os <<
"TD = " << (*iter)->td << std::endl;
1534 os <<
"FREQ = " << (*iter)->freq << std::endl;
1535 os <<
"NL = " << (*iter)->NL << std::endl;
1560 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
1615 : t(right.t),v1(right.v1),v2(right.v2)
1641 .registerDevice(
"t", 1);