/******************************************************************* * * DESCRIPTION: Atomic Model CPU (use a distributin) * * AUTHOR: Amir Barylko & Jorge Beyoglonian * * EMAIL: mailto://amir@dc.uba.ar * mailto://jbeyoglo@dc.uba.ar * * DATE: 27/6/1998 * *******************************************************************/ /** include files **/ #include // fabs( ... ) #include "cpu.h" // base header #include "message.h" // InternalMessage .... #include "distri.h" // class Distribution #include "mainsimu.h" // class MainSimulator #include "strutil.h" // str2float( ... ) /******************************************************************* * Function Name: CPU * Description: constructor ********************************************************************/ CPU::CPU( const string &name ) : Atomic( name ) , in( addInputPort( "in" ) ) , out( addOutputPort( "out" ) ) { try { dist = Distribution::create( MainSimulator::Instance().getParameter( description(), "distribution" ) ); MASSERT( dist ); for ( register int i = 0 ; i < dist->varCount() ; i++ ) { string parameter( MainSimulator::Instance().getParameter( description(), dist->getVar(i) ) ) ; dist->setVar( i, str2float( parameter ) ) ; } } catch( InvalidDistribution &e ) { e.addText( "The model " + description() + " has distribution problems!" ) ; e.print(cerr); MTHROW( e ) ; } catch( MException &e ) { MTHROW( e ) ; } } /******************************************************************* * Function Name: externalFunction * Description: the CPU receives one job ********************************************************************/ Model &CPU::externalFunction( const ExternalMessage &msg ) { pid = static_cast< int >( msg.value() ) ; holdIn( active, Time( static_cast( fabs( distribution().get() ) ) ) ) ; return *this ; } /******************************************************************* * Function Name: internalFunction ********************************************************************/ Model &CPU::internalFunction( const InternalMessage & ) { passivate(); return *this; } /******************************************************************* * Function Name: outputFunction ********************************************************************/ Model &CPU::outputFunction( const InternalMessage &msg ) { sendOutput( msg.time(), out, pid ); return *this; } CPU::~CPU() { delete dist; }