48 #include <Xyce_config.h>
68 #include <N_ERH_ErrorMgr.h>
70 #include <N_LAS_Vector.h>
71 #include <N_LAS_Matrix.h>
73 #include <N_UTL_BreakPoint.h>
97 .setDescription(
"Rise Time");
101 .setDescription(
"Fall Time");
105 .setDescription(
"Resistance");
109 .setDescription(
"Inductance");
113 .setDescription(
"Capacitance");
118 .setDescription(
"Flag for transitional breakpoints");
154 :
DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
167 ABraEquPosNodeOffset(-1),
168 ABraEquNegNodeOffset(-1),
169 APosEquBraVarOffset(-1),
170 ANegEquBraVarOffset(-1)
226 const std::vector<int> & extLIDVecRef)
231 #ifdef Xyce_DEBUG_DEVICE
234 Xyce::dout() << std::endl << section_divider << std::endl;
235 Xyce::dout() <<
" DACInstance::registerLIDs" << std::endl;
236 Xyce::dout() <<
" name = " <<
getName() << std::endl;
250 #ifdef Xyce_DEBUG_DEVICE
252 Xyce::dout() <<
" li_Pos = " <<
li_Pos << std::endl;
257 #ifdef Xyce_DEBUG_DEVICE
259 Xyce::dout() <<
" li_Neg = " <<
li_Neg << std::endl;
264 #ifdef Xyce_DEBUG_DEVICE
266 Xyce::dout() <<
" li_Bra = " <<
li_Bra << std::endl;
269 #ifdef Xyce_DEBUG_DEVICE
271 Xyce::dout() << section_divider << std::endl;
346 bool bsuccess =
true;
371 bool bsuccess =
true;
386 bool bsuccess =
true;
400 std::vector< std::pair<double, double> >
const & newPairsIn )
402 int i, last, newStart;
403 double transitionTime;
404 bool bsuccess =
true;
405 std::vector< std::pair<double,double> >::iterator itVec, itVec_end;
406 std::vector< std::pair<double, double> > newPairs;
407 std::vector< std::pair<double,double> >::const_iterator const_itVec;
408 std::map<double, double> tv;
409 std::map<double, double>::iterator tv_i, tv_end;
411 #ifdef Xyce_DEBUG_DEVICE
414 Xyce::dout() <<
"In device " <<
getName() << std::endl;
416 ", at beginning of Instance::updateTVVEC():\n"
418 <<
" TVVEC loc = " <<
loc_ <<
"\n"
419 <<
" TVVEC contents:\n" ;
420 itVec =
TVVEC.begin();
421 itVec_end =
TVVEC.end();
422 for( ; itVec != itVec_end; ++itVec )
424 Xyce::dout() <<
" " << (*itVec).first
425 <<
"s, " << (*itVec).second
428 Xyce::dout() << newPairsIn.size() <<
" New pairs:" << std::endl;
429 for ( const_itVec = newPairsIn.begin() ; const_itVec != newPairsIn.end() ; ++const_itVec )
430 Xyce::dout() << (*const_itVec).first <<
" " << (*const_itVec).second << std::endl;
436 itVec =
TVVEC.begin();
437 itVec_end =
TVVEC.end();
438 for( ; itVec != itVec_end; ++itVec )
439 tv[(*itVec).first] = (*itVec).second;
441 if (!newPairsIn.empty())
446 if (newPairsIn.size() > 0)
447 TVVEC.push_back(std::pair<double,double>(0,(*(newPairsIn.end()-1)).second));
448 if (newPairsIn.size() > 1 && (*(newPairsIn.end()-1)).first >
TVVEC[0].first)
449 TVVEC.push_back(*(newPairsIn.end()-1));
454 std::vector< std::pair<double, double> >::const_iterator n_i, n_end;
455 std::vector< std::pair<double, double> >::iterator t_i, t_end;
456 n_i = newPairsIn.begin();
457 n_end = newPairsIn.end();
458 for ( ; n_i != n_end ; ++n_i)
460 if ((*n_i).first < 0)
462 double d = -(*n_i).first;
463 tv_i = lower_bound(tv.begin(), tv.end(), std::pair<const double, double>(d,0));
464 tv.erase(tv_i,tv.end());
467 n_i = newPairsIn.begin();
468 for ( ; n_i != n_end ; ++n_i)
473 if (transitionTime > 0) {
474 tv_i = lower_bound(tv.begin(), tv.end(), std::pair<const double, double>((*n_i).first,0));
475 if (tv_i != tv.begin())
478 if ((*n_i).second < (*tv_i).second)
481 tv[(*n_i).first] = (*tv_i).second;
483 tv[(*n_i).first + transitionTime] = (*n_i).second;
489 if (tv_i != tv.begin())
491 tv.erase(tv.begin(), tv_i);
492 double lastTimeEntry = -1;
496 for ( ; tv_i != tv_end ; ++tv_i)
498 if ((*tv_i).first - lastTimeEntry > 1e-15)
500 TVVEC.push_back(std::pair<double, double>((*tv_i).first,(*tv_i).second));
501 lastTimeEntry = (*tv_i).first;
506 #ifdef Xyce_DEBUG_DEVICE
509 Xyce::dout() <<
"Instance::updateTVVEC():\n"
511 <<
" TVVEC loc = " <<
loc_ <<
"\n"
512 <<
" TVVEC contents:\n" ;
513 std::vector< std::pair<double, double> >::iterator tv_i =
TVVEC.begin();
514 for( ; tv_i !=
TVVEC.end(); ++tv_i )
516 Xyce::dout() <<
" " << (*tv_i).first
517 <<
"s, " << (*tv_i).second
536 bool bsuccess =
true;
538 #ifdef Xyce_DEBUG_DEVICE
541 Xyce::dout() << std::endl;
542 Xyce::dout() <<
" DACInstance::updateVoltage\n";
543 Xyce::dout() << Xyce::section_divider << std::endl;
544 Xyce::dout() <<
" Time = " << time << std::endl;
548 #ifdef Xyce_DEBUG_DEVICE
551 Xyce::dout() <<
" TVVEC[numTVpairs_-1].first = "
555 Xyce::dout() <<
TVVEC[i].first <<
" :: " <<
TVVEC[i].second << std::endl;
559 if( numTVpairs_ > 0 && time >=
TVVEC[0].first )
561 if( time <
TVVEC[numTVpairs_-1].first )
563 for(
int i = 0; i < numTVpairs_ - 1; ++i )
565 if( time >=
TVVEC[i].first && time <=
TVVEC[i+1].first)
567 double time1 =
TVVEC[i].first;
568 double voltage1 =
TVVEC[i].second;
570 double time2 =
TVVEC[i+1].first;
571 double voltage2 =
TVVEC[i+1].second;
573 voltage_ = voltage1 + (voltage2 - voltage1) * (time - time1) / (time2 - time1);
584 #ifdef Xyce_DEBUG_DEVICE
587 Xyce::dout() <<
" voltage_ = " <<
voltage_ << std::endl;
588 Xyce::dout() << Xyce::section_divider << std::endl;
609 bool bsuccess =
true;
636 bool bsuccess =
true;
663 bool bsuccess =
true;
665 #ifdef Xyce_DEBUG_DEVICE
668 Xyce::dout() <<
"In ::getInstanceBreakPoints " << std::endl;
669 Xyce::dout() <<
" I want breakpoints. Current time is " << currentTime << std::endl;
682 breakPointTimes.push_back(Util::BreakPoint(
TVVEC[i].first, Util::SIMPLE_BREAKPOINT));
686 #ifdef Xyce_DEBUG_DEVICE
689 Xyce::dout() <<
"DAC ----------------------------------------" << std::endl;
690 Xyce::dout() <<
"DAC getInstanceBreakPoints " << std::endl;
691 Xyce::dout() <<
"DAC Debug output. name = " <<
getName() << std::endl;
692 Xyce::dout() <<
"DAC setting breakpoints at currentTime = " << currentTime << std::endl;
693 Xyce::dout() <<
"DAC breakpoints: " << std::endl;
695 std::vector< Util::BreakPoint >::iterator beg = breakPointTimes.begin();
696 std::vector< Util::BreakPoint >::iterator end = breakPointTimes.end();
697 std::vector< Util::BreakPoint >::iterator itBP = beg;
698 for (;itBP!=end;++itBP)
700 Util::BreakPoint & bp = *itBP;
701 Xyce::dout() <<
"DAC breakpoint: " << bp.value() << std::endl;
704 Xyce::dout() <<
"DAC ----------------------------------------" << std::endl;
732 myState->
data.resize(vsize*2);
733 for (i=0;i<vsize;++i)
754 int dsize=state.
data.size();
756 if (
getName().getEncodedName() != state.
ID)
758 Report::DevelFatal().in(
"DAC::Instance::setInternal") <<
"ID(" << state.
ID <<
") from restart does not match my name (" <<
getName() <<
")";
764 UserError(*
this) <<
"Data size from restart (" << dsize <<
" not a multiple of 2!";
771 for (i=0;i<vsize;++i)
791 varTypeVec.resize(1);
819 std::vector<Instance*>::iterator iter;
823 for (iter=first; iter!=last; ++iter)
825 (*iter)->processParams();
843 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
849 includeTransitionBP_(true)
878 std::vector<Instance*>::iterator iter;
882 for (iter=first; iter!=last; ++iter)
898 std::vector<Instance*>::const_iterator iter;
904 os <<
" name\t\tmodelName\tParameters" << std::endl;
906 for (i = 0, iter = first; iter != last; ++iter, ++i)
908 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
910 os <<
"\t\tfile = " << (*iter)->file;
935 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
965 #ifdef Xyce_DEBUG_DEVICE
966 Xyce::dout() <<
"DAC ----------------------------------------" << std::endl;
967 Xyce::dout() <<
"DAC Debug output. name = " << di.
getName() << std::endl;
968 Xyce::dout() <<
"DAC v_pos = " << di.
v_pos <<std::endl;
969 Xyce::dout() <<
"DAC v_neg = " << di.
v_neg <<std::endl;
970 Xyce::dout() <<
"DAC i_bra = " << di.
i_bra <<std::endl;
971 Xyce::dout() <<
"DAC vDrop = " << di.
vDrop <<std::endl;
972 Xyce::dout() <<
"DAC voltage_ = " << di.
voltage_ <<std::endl;
973 Xyce::dout() <<
"DAC ----------------------------------------" << std::endl;
1001 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ)
1051 .registerDevice(
"dac", 1)
1052 .registerModelType(
"dac", 1);