/******************************************************************* * * DESCRIPTION: class Model(base class for Amtomic and Coupled) * * AUTHOR: Amir Barylko & Jorge Boyoglonian * Version 2: Daniel Rodriguez * * EMAIL: mailto://amir@dc.uba.ar * mailto://jbeyoglo@dc.uba.ar * mailto://drodrigu@dc.uba.ar * * DATE: 27/6/1998 * DATE: 27/2/1999 (v2) * *******************************************************************/ #ifndef __MODEL_H #define __MODEL_H /** include files **/ #include // Template string #include "port.h" // class Port #include "time.h" // class Time #include "portlist.h" #include "procadm.h" typedef int MachineId; typedef map > ModelPartition; /** foward declarations **/ class ModelAdmin ; class MessageAdmin ; class Coupled ; class Root ; class Simulator ; class Processor ; class Coordinator ; class SendPortNode ; /** definitions **/ #define MODEL_NAME "Model" class Model { public: virtual ~Model(); // Destructor virtual string className() const = 0; virtual Port &addInputPort( const string & ); virtual Port &addOutputPort( const string & ); virtual const PortList &inputPorts() const {return inputList;} virtual const PortList &outputPorts() const {return outputList;} Port & port( const string & ); const Time &nextChange() const { return processor().nextChange() ; } //Rami // {return SingleProcessorAdmin::Instance().processor( id() ).nextChange();} const Time &lastChange() const { return processor().lastChange() ; } //Rami // {return SingleProcessorAdmin::Instance().processor( id() ).lastChange();} const ModelId &id() const {return ident;} const string asString() const {return description() + "(" + id() + ")";} const Time absoluteNext() const {return lastChange() + nextChange();} virtual PortList &inputPorts() {return inputList;} virtual PortList &outputPorts() {return outputList;} const ModelId &parentId() const {return parent_id;} // Model &parentId( const ModelId &mid ) Model &parentId( const ProcId &pid) {parent_id = pid; return *this;} const Model &parent() const { return *parentModel; } // {return SingleProcessorAdmin::Instance().processor( parentId() ).model();} Model &parent( Model *p ) { parentModel = p; return *this;} // {parent_id = p.id(); return *this;} const string &description() const {return descript;} bool operator <( const Model &model ) const {return this->id() < model.id();} Model &addMachine(const MachineId &mid); Model &setMachineProcId(const MachineId &mid, const ProcId &pid); const ProcId &procInMachine( const MachineId &mid) const ; const MachineId &machineForProcId(const ProcId &pid) const ; const ProcId localProc() { return local_proc; } bool isLocalMaster() const; const ProcId &masterId() const; ModelPartition &modelPartition() { return model_partition ; } virtual Model& printModelPartition(); protected: friend class Processor ; friend class Simulator ; friend class Coordinator ; friend class SendPortNode ; friend class MainSimulator; friend class ProcessorAdmin; Model( const string &name = "Model" ) ; // Default constructor Model &nextChange( const Time & ); Model &lastChange( const Time & ); Model &id( const ModelId &mid ) {ident = mid; return *this;} Model &sendOutput( const Time &time, const Port &port, const Value &value ) {processor().sendOutput( time, port, value ); return *this;} // Processor &processor() // {return SingleProcessorAdmin::Instance().processor( id() );} Processor &processor() const; Model &processor( Processor * ); virtual Processor &createProcessor() = 0; private: friend class ModelAdmin ; friend class MessageAdmin ; friend class Coupled ; friend class Root ; ProcId local_proc; // Rami: distributed coupled models will more than one ProcId // only one of them will be local to the current machine ProcId parent_id; // Rami: parentId is refering to the ProcId of the parent ModelPartition model_partition; ModelId ident ; //Rami Model* parentModel; Processor* proc; // string descript ; PortList inputList ; PortList outputList ; }; // class Model #endif //__MODEL_H