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;
349 bool bsuccess =
true;
374 bool bsuccess =
true;
389 bool bsuccess =
true;
403 std::vector< std::pair<double, double> >
const & newPairsIn )
405 int i, last, newStart;
406 double transitionTime;
407 bool bsuccess =
true;
408 std::vector< std::pair<double,double> >::iterator itVec, itVec_end;
409 std::vector< std::pair<double, double> > newPairs;
410 std::vector< std::pair<double,double> >::const_iterator const_itVec;
411 std::map<double, double> tv;
412 std::map<double, double>::iterator tv_i, tv_end;
414 #ifdef Xyce_DEBUG_DEVICE
417 Xyce::dout() <<
"In device " <<
getName() << std::endl;
419 ", at beginning of Instance::updateTVVEC():\n"
421 <<
" TVVEC loc = " <<
loc_ <<
"\n"
422 <<
" TVVEC contents:\n" ;
423 itVec =
TVVEC.begin();
424 itVec_end =
TVVEC.end();
425 for( ; itVec != itVec_end; ++itVec )
427 Xyce::dout() <<
" " << (*itVec).first
428 <<
"s, " << (*itVec).second
431 Xyce::dout() << newPairsIn.size() <<
" New pairs:" << std::endl;
432 for ( const_itVec = newPairsIn.begin() ; const_itVec != newPairsIn.end() ; ++const_itVec )
433 Xyce::dout() << (*const_itVec).first <<
" " << (*const_itVec).second << std::endl;
439 itVec =
TVVEC.begin();
440 itVec_end =
TVVEC.end();
441 for( ; itVec != itVec_end; ++itVec )
442 tv[(*itVec).first] = (*itVec).second;
444 if (!newPairsIn.empty())
449 if (newPairsIn.size() > 0)
450 TVVEC.push_back(std::pair<double,double>(0,(*(newPairsIn.end()-1)).second));
451 if (newPairsIn.size() > 1 && (*(newPairsIn.end()-1)).first >
TVVEC[0].first)
452 TVVEC.push_back(*(newPairsIn.end()-1));
457 std::vector< std::pair<double, double> >::const_iterator n_i, n_end;
458 std::vector< std::pair<double, double> >::iterator t_i, t_end;
459 n_i = newPairsIn.begin();
460 n_end = newPairsIn.end();
461 for ( ; n_i != n_end ; ++n_i)
463 if ((*n_i).first < 0)
465 double d = -(*n_i).first;
466 tv_i = lower_bound(tv.begin(), tv.end(), std::pair<const double, double>(d,0));
467 tv.erase(tv_i,tv.end());
470 n_i = newPairsIn.begin();
471 for ( ; n_i != n_end ; ++n_i)
476 if (transitionTime > 0) {
477 tv_i = lower_bound(tv.begin(), tv.end(), std::pair<const double, double>((*n_i).first,0));
478 if (tv_i != tv.begin())
481 if ((*n_i).second < (*tv_i).second)
484 tv[(*n_i).first] = (*tv_i).second;
486 tv[(*n_i).first + transitionTime] = (*n_i).second;
492 if (tv_i != tv.begin())
494 tv.erase(tv.begin(), tv_i);
495 double lastTimeEntry = -1;
499 for ( ; tv_i != tv_end ; ++tv_i)
501 if ((*tv_i).first - lastTimeEntry > 1e-15)
503 TVVEC.push_back(std::pair<double, double>((*tv_i).first,(*tv_i).second));
504 lastTimeEntry = (*tv_i).first;
509 #ifdef Xyce_DEBUG_DEVICE
512 Xyce::dout() <<
"Instance::updateTVVEC():\n"
514 <<
" TVVEC loc = " <<
loc_ <<
"\n"
515 <<
" TVVEC contents:\n" ;
516 std::vector< std::pair<double, double> >::iterator tv_i =
TVVEC.begin();
517 for( ; tv_i !=
TVVEC.end(); ++tv_i )
519 Xyce::dout() <<
" " << (*tv_i).first
520 <<
"s, " << (*tv_i).second
539 bool bsuccess =
true;
541 #ifdef Xyce_DEBUG_DEVICE
544 Xyce::dout() << std::endl;
545 Xyce::dout() <<
" DACInstance::updateVoltage\n";
546 Xyce::dout() << Xyce::section_divider << std::endl;
547 Xyce::dout() <<
" Time = " << time << std::endl;
551 #ifdef Xyce_DEBUG_DEVICE
554 Xyce::dout() <<
" TVVEC[numTVpairs_-1].first = "
558 Xyce::dout() <<
TVVEC[i].first <<
" :: " <<
TVVEC[i].second << std::endl;
562 if( numTVpairs_ > 0 && time >=
TVVEC[0].first )
564 if( time <
TVVEC[numTVpairs_-1].first )
566 for(
int i = 0; i < numTVpairs_ - 1; ++i )
568 if( time >=
TVVEC[i].first && time <=
TVVEC[i+1].first)
570 double time1 =
TVVEC[i].first;
571 double voltage1 =
TVVEC[i].second;
573 double time2 =
TVVEC[i+1].first;
574 double voltage2 =
TVVEC[i+1].second;
576 voltage_ = voltage1 + (voltage2 - voltage1) * (time - time1) / (time2 - time1);
587 #ifdef Xyce_DEBUG_DEVICE
590 Xyce::dout() <<
" voltage_ = " <<
voltage_ << std::endl;
591 Xyce::dout() << Xyce::section_divider << std::endl;
612 bool bsuccess =
true;
639 bool bsuccess =
true;
666 bool bsuccess =
true;
668 #ifdef Xyce_DEBUG_DEVICE
671 Xyce::dout() <<
"In ::getInstanceBreakPoints " << std::endl;
672 Xyce::dout() <<
" I want breakpoints. Current time is " << currentTime << std::endl;
685 breakPointTimes.push_back(Util::BreakPoint(
TVVEC[i].first, Util::SIMPLE_BREAKPOINT));
689 #ifdef Xyce_DEBUG_DEVICE
692 Xyce::dout() <<
"DAC ----------------------------------------" << std::endl;
693 Xyce::dout() <<
"DAC getInstanceBreakPoints " << std::endl;
694 Xyce::dout() <<
"DAC Debug output. name = " <<
getName() << std::endl;
695 Xyce::dout() <<
"DAC setting breakpoints at currentTime = " << currentTime << std::endl;
696 Xyce::dout() <<
"DAC breakpoints: " << std::endl;
698 std::vector< Util::BreakPoint >::iterator beg = breakPointTimes.begin();
699 std::vector< Util::BreakPoint >::iterator end = breakPointTimes.end();
700 std::vector< Util::BreakPoint >::iterator itBP = beg;
701 for (;itBP!=end;++itBP)
703 Util::BreakPoint & bp = *itBP;
704 Xyce::dout() <<
"DAC breakpoint: " << bp.value() << std::endl;
707 Xyce::dout() <<
"DAC ----------------------------------------" << std::endl;
735 myState->
data.resize(vsize*2);
736 for (i=0;i<vsize;++i)
757 int dsize=state.
data.size();
762 msg =
"Instance::setInternalState: ID ("+state.
ID+
")";
763 msg +=
"from restart does not match my name ("+
getName()+
")!\n";
764 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL, msg);
771 sprintf(msg2,
"Instance::setInternalState: "
772 "Data size from restart (%d) not a multiple of 2!",
775 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL, msg);
781 for (i=0;i<vsize;++i)
801 varTypeVec.resize(1);
829 std::vector<Instance*>::iterator iter;
833 for (iter=first; iter!=last; ++iter)
835 (*iter)->processParams();
853 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
859 includeTransitionBP_(true)
888 std::vector<Instance*>::iterator iter;
892 for (iter=first; iter!=last; ++iter)
908 std::vector<Instance*>::const_iterator iter;
914 os <<
" name\t\tmodelName\tParameters" << std::endl;
916 for (i = 0, iter = first; iter != last; ++iter, ++i)
918 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
920 os <<
"\t\tfile = " << (*iter)->file;
945 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
975 #ifdef Xyce_DEBUG_DEVICE
976 Xyce::dout() <<
"DAC ----------------------------------------" << std::endl;
977 Xyce::dout() <<
"DAC Debug output. name = " << di.
getName() << std::endl;
978 Xyce::dout() <<
"DAC v_pos = " << di.
v_pos <<std::endl;
979 Xyce::dout() <<
"DAC v_neg = " << di.
v_neg <<std::endl;
980 Xyce::dout() <<
"DAC i_bra = " << di.
i_bra <<std::endl;
981 Xyce::dout() <<
"DAC vDrop = " << di.
vDrop <<std::endl;
982 Xyce::dout() <<
"DAC voltage_ = " << di.
voltage_ <<std::endl;
983 Xyce::dout() <<
"DAC ----------------------------------------" << std::endl;
1062 bool bSuccess =
true;
1067 dacNames.push_back(di.
getName());
1081 .registerDevice(
"dac", 1)
1082 .registerModelType(
"dac", 1);