DiaDes  0.1
DIAgnosis of Discrete-Event System
ComponentType.hh
Go to the documentation of this file.
1 #ifndef COMPONENTTYPE_H_
2 #define COMPONENTTYPE_H_
3 
4 #include<string>
5 #include<map>
6 #include<vector>
7 #include<stdexcept>
9 #include<iostream>
10 
11 #include <diades/sdmdl/Formula.hh>
12 #include <diades/sdmdl/Variable.hh>
13 #include <diades/sdmdl/Event.hh>
14 #include <diades/sdmdl/Port.hh>
15 #include <diades/sdmdl/Rule.hh>
16 
17 using namespace std;
18 
19 namespace Diades
20 {
21  namespace Sdmdl
22  {
23 
27  class ComponentTypeInvalid : public runtime_error, public domain_error {
28  public:
32  ComponentTypeInvalid(const string& whatArg) : runtime_error(whatArg), domain_error(whatArg){
33  cerr << "EXCEPTION ComponentTypeInvalid -> " << whatArg << endl;
34  }
35  };
36 
37 
38 
40  {
41 
42  public:
43  typedef VariableVector::const_iterator VariableIterator;
44  typedef vector<Port *>::const_iterator PortIterator;
45  typedef vector<Event *>::const_iterator EventIterator;
46  typedef map<string,Formula::ConstReference>::const_iterator InvariantIterator;
47  typedef vector<Rule *>::const_iterator RuleIterator;
48 
49  private:
50  string labl;
51 
52 
53  map<string, vector<Port *>::size_type > _mapInport;
54  vector<Port *> _inports;
55 
56  map<string, vector<Port *>::size_type> _mapOutport;
57  vector<Port *> _outports;
58 
59  map<string, VariableVector::size_type > _mapVar;
61 
62  map<string,vector<Event *>::size_type> _mapOutEvt;
63  vector<Event *> _outputEvents;
64 
65  map<string,vector<Event *>::size_type> _mapInEvt;
66  vector<Event *> _inputEvents;
67 
68  map<string,vector<Rule *>::size_type> _mapRule;
69  vector<Rule *> _rules;
70 
71  map<string,Formula::ConstReference> _invariant;
72 
73  vector<Formula::ConstReference> _globalInvariant;
74  vector<Formula::ConstReference> _stateInvariant;
76 
77 
78  public:
79  ComponentType();
80  virtual ~ComponentType();
81 
82 
83  // labels
84  void setLabel(const string & label) { labl = label; }
85  const string & label() const { return labl; }
86 
87  // creators
88  Port & createInputPort(const string & portLabel);
89  Port & createOutputPort(const string & portLabel);
90  Port & createInputPort(const string & portLabel, bool observable);
91  Port & createOutputPort(const string & portLabel, bool observable);
92  FormulaFactory & factory() { return *_factory; }
93  void generateFactory();
94 
95 
96  void insertVariable(Variable & variable);
97  Event & createSpontaneousEvent(const string & label);
98  Event & createInputEvent(const string & portLabel, const string & label);
99  Event & createOutputEvent(const string & portLabel, const string & label);
100  void insertInvariant(const string & label, const Formula & f);
101  void insertInvariant(const Formula & f);
102  void generateGlobalInvariant();
103  Rule & createRule();
104  const Formula & globalInvariant() const { return _globalInvariant[0]; }
105  const Formula & stateInvariant();
106 
107 
108  const VariableVector & variables() const { return _variables; }
109  // modifiers
110  const Event & spontaneousEvent(const string & msg) const;
111  bool containsSpontaneousEventOfLabel(const string & label) const
112  { return containsInputEventOfLabel("SpontaneousPort" , label);
113  }
114 
115  const Event & inputEvent(const string & portLabel, const string & msg) const
116  {
117  require(ComponentTypeInvalid, containsInputEventOfLabel(portLabel,msg),
118  "inputEvent: the input event is not present");
119  return *_inputEvents[_mapInEvt.find(portLabel+"."+msg)->second];
120  }
121 
122 
123  bool containsInputEventOfLabel(const string & portLabel, const string & msg) const
124  { return _mapInEvt.find(portLabel + "." + msg) != _mapInEvt.end(); }
125 
126  EventIterator beginOfInputEvents() const { return _inputEvents.begin(); }
127  EventIterator endOfInputEvents() const { return _inputEvents.end(); }
128 
129  const Event & outputEvent(const string & portLabel, const string & msg) const
130  {
131  require(ComponentTypeInvalid, containsOutputEventOfLabel(portLabel,msg),
132  "outputEvent: the output event is not present");
133  return *_outputEvents[_mapOutEvt.find(portLabel+"."+msg)->second];
134  }
135  bool containsOutputEventOfLabel(const string & portLabel, const string & msg) const
136  { return _mapOutEvt.find(portLabel + "." + msg) != _mapOutEvt.end(); }
137 
138  EventIterator beginOfOutputEvents() const { return _outputEvents.begin(); }
139  EventIterator endOfOutputEvents() const { return _outputEvents.end(); }
140 
141 
142  const Port & inputPort(const string & portLabel) const
143  {
144  require(ComponentTypeInvalid, containsInputPortOfLabel(portLabel), "inputPort, no such a port is present");
145  return *_inports[_mapInport.find(portLabel)->second];
146  }
147 
148  bool containsInputPortOfLabel(const string & portLabel) const
149  { return _mapInport.find(portLabel) != _mapInport.end(); }
150 
151  PortIterator beginOfInputPorts() const { return _inports.begin(); }
152  PortIterator endOfInputPorts() const { return _inports.end(); }
153 
154  const Port & outputPort(const string & portLabel) const
155  {
156  require(ComponentTypeInvalid, containsOutputPortOfLabel(portLabel), "outputPort, no such a port is present");
157  return *_outports[_mapOutport.find(portLabel)->second];
158  }
159  bool containsOutputPortOfLabel(const string & portLabel) const
160  { return _mapOutport.find(portLabel) != _mapOutport.end(); }
161 
162 
163  PortIterator beginOfOutputPorts() const { return _outports.begin(); }
164  PortIterator endOfOutputPorts() const { return _outports.end(); }
165 
166 
167 
168  bool containsVariableOfLabel(const string & label) const
169  { return _mapVar.find(label) != _mapVar.end(); }
170 
171  Variable variable(const string & label) const
172  {
173  require(ComponentTypeInvalid, containsVariableOfLabel(label), "variable, no such a variable is present");
174  return _variables[_mapVar.find(label)->second];
175  }
176 
177 
178 
179  VariableIterator beginOfVariables() const { return _variables.begin(); }
180  VariableIterator endOfVariables() const { return _variables.end(); }
181 
182  InvariantIterator beginOfInvariant() const { return _invariant.begin(); }
183  InvariantIterator endOfInvariant() const { return _invariant.end(); }
184 
185  RuleIterator beginOfRules() const { return _rules.begin(); }
186  RuleIterator endOfRules() const { return _rules.end(); }
187 
188  const Port & spontaneousPort() const { return inputPort("SpontaneousPort"); }
189 
190  friend ostream & operator << (ostream & os, const ComponentType & component);
191  };
192 
193  };
194 };
195 
196 #endif /*COMPONENTTYPE_H_*/
InvariantIterator endOfInvariant() const
map< string, vector< Event * >::size_type > _mapInEvt
VariableIterator endOfVariables() const
vector< Event * > _outputEvents
EventIterator endOfInputEvents() const
const Port & inputPort(const string &portLabel) const
bool containsInputEventOfLabel(const string &portLabel, const string &msg) const
vector< Port * >::const_iterator PortIterator
EventIterator endOfOutputEvents() const
map< string, Formula::ConstReference >::const_iterator InvariantIterator
map< string, Formula::ConstReference > _invariant
const VariableVector & variables() const
bool containsSpontaneousEventOfLabel(const string &label) const
vector< Formula::ConstReference > _globalInvariant
STL namespace.
PortIterator endOfOutputPorts() const
Formula class using BDD.
bool containsOutputEventOfLabel(const string &portLabel, const string &msg) const
const Port & spontaneousPort() const
map< string, vector< Port * >::size_type > _mapOutport
map< string, vector< Rule * >::size_type > _mapRule
PortIterator beginOfOutputPorts() const
bool containsVariableOfLabel(const string &label) const
const Event & inputEvent(const string &portLabel, const string &msg) const
RuleIterator endOfRules() const
RuleIterator beginOfRules() const
Variable::VariableVector VariableVector
Definition: Variable.hh:403
vector< Event * >::const_iterator EventIterator
VariableIterator beginOfVariables() const
#define require(Exception, expr, message)
Definition: Assertion.hh:90
PortIterator beginOfInputPorts() const
ComponentTypeInvalid(const string &whatArg)
Namespace of the Diades project.
map< string, vector< Event * >::size_type > _mapOutEvt
EventIterator beginOfOutputEvents() const
vector< Formula::ConstReference > _stateInvariant
const Port & outputPort(const string &portLabel) const
std::ostream & operator<<(std::ostream &os, const Identifier &identifier)
Definition: Identifier.hh:501
vector< Rule * >::const_iterator RuleIterator
PortIterator endOfInputPorts() const
map< string, vector< Port * >::size_type > _mapInport
FormulaFactory & factory()
bool containsInputPortOfLabel(const string &portLabel) const
map< string, VariableVector::size_type > _mapVar
const Event & outputEvent(const string &portLabel, const string &msg) const
vector< Event * > _inputEvents
bool containsOutputPortOfLabel(const string &portLabel) const
const string & label() const
InvariantIterator beginOfInvariant() const
const Formula & globalInvariant() const
VariableVector::const_iterator VariableIterator
void setLabel(const string &label)
Variable variable(const string &label) const
EventIterator beginOfInputEvents() const