36 using namespace Constants;
52 =
"Internal error: Feature not supported in this mode.";
57 std::string str =
"LOCATION (";
58 str += uid.getName() +
", " + invariant.toString() +
")";
64 std::string str =
"EDGE (" + src->toString() +
" " + dst->toString() +
")\n";
65 str +=
"\t" + guard.toString() +
", " + sync.toString() +
", " + assign.toString();
77 string type = uid.getType().get(0).toDeclarationString();
78 str += type +
" " + uid.getName();
80 for (uint32_t i = 1; i < uid.getType().size(); ++i)
82 if (!uid.getType().getLabel(i).empty())
84 str += uid.getType().get(i).toDeclarationString();
86 str += uid.getType().getLabel(i);
90 if (uid.getType().size()>1)
91 str = str.substr(0, str.size()-2);
94 std::list<variable_t>::const_iterator itr;
97 str +=
" " + itr->toString();
100 str += body->toString(
INDENT);
109 if (uid.getType().isArray())
111 type = uid.getType().toDeclarationString();
112 size_t i = type.find(
'[');
113 str += type.substr(0, (
int)i);
115 str += uid.getName();
116 str += type.substr((
int)i , type.size() - (int)i);
120 str += uid.getType().toDeclarationString() +
" " 125 str +=
" = " + expr.toString();
132 bool duplicate = frame.getIndexOf(name) != -1;
134 fun = &functions.back();
135 fun->
uid = frame.addSymbol(name, type, fun);
142 str += getConstants();
144 str += getTypeDefinitions();
146 str += getVariables(global);
148 str += getFunctions();
154 list<variable_t>::const_iterator v_itr =
variables.begin();
163 str +=
"// constants\n";
166 if (v_itr->uid.getType().getKind() ==
CONSTANT)
168 str += v_itr->toString();
182 for (uint32_t i = 0; i < frame.getSize(); ++i)
184 if (frame[i].getType().getKind() ==
TYPEDEF)
188 str +=
"// type definitions\n";
191 str += frame[i].getType().toDeclarationString() +
";\n";
199 list<variable_t>::const_iterator v_itr =
variables.begin();
209 str +=
"// variables\n";
212 if (v_itr->uid.getType().getKind() !=
CONSTANT)
214 str += v_itr->toString();
225 list<function_t>::const_iterator f_itr;
228 if (!functions.empty()){
229 str +=
"// functions\n";
230 for (f_itr = functions.begin(); f_itr != functions.end(); ++f_itr)
232 str += f_itr->toString();
241 std::string str =
"";
242 std::map<symbol_t, expression_t>::const_iterator itr;
243 for (itr = mapping.begin(); itr != mapping.end(); ++itr)
245 str += itr->first.getName() +
" = " + itr->second.toString() +
"\n";
252 std::string str =
"";
253 for (uint32_t i = 0; i < parameters.getSize(); ++i)
255 str += parameters[i].getType().toDeclarationString()
256 +
" " + parameters[i].getName() +
", ";
258 if (parameters.getSize() > 0)
260 str = str.substr(0, str.size() -2);
267 std::string str =
"";
268 std::map<symbol_t, expression_t>::const_iterator itr;
269 for (uint32_t i = 0; i < parameters.getSize(); ++i)
271 for (itr = mapping.begin(); itr != mapping.end(); ++ itr)
273 if ( itr->first == parameters[i])
275 str += itr->second.toString();
280 if (parameters.getSize() > 0)
282 str = str.substr(0, str.size() -2);
289 bool duplicate = frame.getIndexOf(name) != -1;
292 state_t &state = states.back();
294 state.
locNr = states.size() - 1;
300 throw TypeException(boost::format(
"$Duplicate_definition_of %1%") % name);
310 bool duplicate = frame.getIndexOf(name) != -1;
315 branchpoint.
bpNr = branchpoints.size() - 1;
319 throw TypeException(boost::format(
"$Duplicate_definition_of %1%") % name);
327 int32_t nr =
edges.empty() ? 0 :
edges.back().nr + 1;
332 edges.back().srcb = 0;
336 edges.back().src = 0;
342 edges.back().dstb = 0;
346 edges.back().dst = 0;
350 edges.back().control = control;
351 edges.back().actname = actname;
352 edges.back().nr = nr;
377 int32_t nr = messages.empty() ? 0 : messages.back().
nr + 1;
381 messages.back().location = loc;
382 messages.back().isInPrechart = pch;
383 messages.back().nr = nr;
384 return messages.back();
389 int32_t nr = updates.empty() ? 0 : updates.back().
nr + 1;
392 updates.back().location = loc;
393 updates.back().isInPrechart = pch;
394 updates.back().nr = nr;
395 return updates.back();
399 bool pch,
bool isHot)
401 int32_t nr = conditions.empty() ? 0 : conditions.back().
nr + 1;
404 for (
unsigned int i(0); i<anchors.size(); ++i){
405 conditions.back().anchors.push_back(static_cast<instanceLine_t*>(anchors[i].getData()));
407 conditions.back().location = loc;
408 conditions.back().isInPrechart = pch;
409 conditions.back().nr = nr;
410 conditions.back().isHot = isHot;
411 return conditions.back();
417 deque<message_t>::iterator itr;
420 for (itr = messages.begin(); itr != messages.end(); ++itr)
422 d.push_back(itr->nr);
429 deque<condition_t>::iterator itr;
432 for (itr = conditions.begin(); itr != conditions.end(); ++itr)
434 d.push_back(itr->nr);
441 deque<update_t>::iterator itr;
444 for (itr = updates.begin(); itr != updates.end(); ++itr)
446 d.push_back(itr->nr);
470 deque<int>::iterator m_itr;
471 deque<int>::iterator c_itr;
472 deque<int>::iterator u_itr;
474 vector<simregion_t> simregions;
484 for (m_itr = m_nr.begin(); m_itr!=m_nr.end(); ++m_itr)
496 if (getCondition(target, y, s.
condition))
498 for (c_itr = c_nr.begin(); c_itr != c_nr.end(); ++c_itr)
507 else if (getCondition(source, y, s.
condition))
509 for (c_itr = c_nr.begin(); c_itr != c_nr.end(); ++c_itr)
518 if (getUpdate(target, y, s.
update))
520 for (u_itr = u_nr.begin(); u_itr != u_nr.end(); ++u_itr)
529 else if (getUpdate(source, y, s.
update))
531 for (u_itr = u_nr.begin(); u_itr != u_nr.end(); ++u_itr)
541 simregions.push_back(s);
548 for (c_itr = c_nr.begin(); c_itr != c_nr.end(); ++c_itr)
556 for (u_itr = u_nr.begin(); u_itr != u_nr.end(); ++u_itr)
566 simregions.push_back(s);
573 for (u_itr = u_nr.begin(); u_itr != u_nr.end(); ++u_itr)
578 simregions.push_back(s);
596 deque<condition_t>::iterator i;
597 vector<instanceLine_t*>::iterator j;
599 for (i = conditions.begin(); i != conditions.end(); ++i)
604 vector<instanceLine_t*>& anchors = condition.
anchors;
605 for (j = anchors.begin(); j != anchors.end(); ++j)
610 simCondition = &condition;
625 deque<update_t>::iterator i;
626 for (i = updates.begin(); i != updates.end(); ++i)
647 vector<instanceLine_t*>::const_iterator j;
650 for (j = instances.begin(); j != instances.end(); ++j)
652 if (getUpdate(*j, y, simUpdate))
659 const vector<expression_t> &arguments1)
665 arguments = arguments1.size();
668 for (
size_t i = 0; i < arguments1.size(); i++)
679 vector<simregion_t> i_simregions;
680 vector<simregion_t>::const_iterator itr;
681 vector<simregion_t>::iterator itr1;
682 vector<instanceLine_t*>::const_iterator it;
685 for (itr = simregions.begin(); itr != simregions.end(); ++itr) {
689 i_simregions.push_back(*itr);
695 i_simregions.push_back(*itr);
703 if (instance->
instanceNr == this->instanceNr) {
704 i_simregions.push_back(*itr);
725 if (this->message->nr != -1)
727 return this->message->location;
729 if (this->condition->nr != -1)
731 return this->condition->location;
733 if (this->update->nr != -1)
735 return this->update->location;
742 if (this->message && this->message->nr != -1)
744 return this->message->isInPrechart;
746 if (this->condition && this->condition->nr != -1)
748 return this->condition->isInPrechart;
750 if (this->update && this->update->nr != -1)
752 return this->update->isInPrechart;
758 std::deque<message_t>::iterator i;
759 for (i = messages.begin(); i != messages.end(); ++i) {
761 this->message = &(*i);
768 std::deque<condition_t>::iterator i;
769 for (i = conditions.begin(); i != conditions.end(); ++i) {
771 this->condition = &(*i);
778 std::deque<update_t>::iterator i;
779 for (i = updates.begin(); i != updates.end(); ++i) {
781 this->update = &(*i);
789 if (message->nr != -1) {
790 s += (
"m:" + message->label.toString() +
" ");
792 if (condition->nr != -1) {
793 std::string b = (condition->isHot) ?
" HOT " :
"";
794 s += (
"c:" + b + (condition->label.toString()) +
" ");
796 if (update->nr != -1) {
797 s += (
"u:" + update->label.toString() +
" ");
799 s = s.substr(0, s.size()-1);
806 std::vector<simregion_t>::iterator sim;
807 for (sim = simregions.begin(); sim != simregions.end(); ++sim) {
808 if (sim->nr == s.
nr) {
809 simregions.erase(sim);
815 std::vector<simregion_t>::iterator sim;
816 for (sim = simregions.begin(); sim != simregions.end(); ++sim) {
817 if (sim->nr == s.
nr) {
835 std::vector<simregion_t>::const_iterator sim;
836 std::vector<simregion_t>::const_iterator fsim;
837 for (sim = simregions.begin(); sim != simregions.end(); ++sim)
839 if (! sim->isInPrechart())
853 std::vector<simregion_t>::const_iterator sim;
854 for (sim = simregions.begin(); sim != simregions.end(); ++sim)
856 if (! sim->isInPrechart())
865 std::vector<simregion_t>::const_iterator s;
866 std::vector<simregion_t>::iterator sim;
867 int xsize = simregions.size();
871 std::vector<simregion_t> ycopy = std::vector<simregion_t>(y.
simregions);
872 for (s = simregions.begin(); s != simregions.end(); ++s)
874 for (sim = ycopy.begin(); sim != ycopy.end(); ++sim)
876 if (sim->nr == s->nr)
883 return (ycopy.empty()) ?
true :
false;
896 return (strcasecmp(this->mode.c_str(),
"invariant") == 0);
901 std::ostringstream stream;
902 stream <<
"chan priority ";
903 string head_s = head.toString();
904 if (head_s.size() == 0) head_s =
"default";
907 std::list<entry>::const_iterator itr;
908 for (itr = tail.begin(); itr != tail.end(); ++itr)
910 if (itr->first ==
'<') stream <<
" ";
911 stream << itr->first <<
" ";
912 stream << itr->second.toString();
972 const bool isTA,
const string& typeLSC,
const string& mode)
982 templ.
templ = &templ;
987 templ.dynamic =
false;
989 templ.type = typeLSC;
1003 templ.
templ = &templ;
1008 templ.dynamic =
true;
1010 templ.isDefined =
false;
1018 std::list<template_t>::iterator it;
1028 std::list<template_t>::iterator it;
1030 if (it->uid.getName() == name)
1039 const vector<expression_t> &arguments)
1053 for (
size_t i = 0; i < arguments.size(); i++)
1063 const vector<expression_t> &arguments)
1077 for (
size_t i = 0; i < arguments.size(); i++)
1088 std::list<instance_t>::iterator itr;
1091 if (itr->uid == instance.
uid) {
1138 var->
expr = initial;
1147 var =
addVariable(function->variables, frame, type, name);
1148 var->
expr = initial;
1156 bool duplicate = frame.
getIndexOf(name) != -1;
1168 throw TypeException(boost::format(
"$Duplicate_definition_of %1%") % name);
1176 std::list<UTAP::variable_t>::iterator v_itr;
1200 for (
size_t i = 0; i < frame.
getSize(); i++)
1202 type_t type = frame[i].getType();
1210 void *data = frame[i].getData();
1226 visitor.
visitState(*static_cast<state_t*>(data));
1244 auto visit_template = [&visitor](
template_t& t) {
1247 visit(visitor, t.frame);
1248 for (
auto& edge: t.edges)
1250 for (
auto& message: t.messages)
1252 for (
auto& update: t.updates)
1254 for (
auto& condition: t.conditions)
1269 type_t type = frame.getType();
1270 void *data = frame.getData();
1324 priorities.
head = chan;
1330 assert(separator ==
',' || separator ==
'<');
1393 uint32_t position, uint32_t offset, uint32_t line,
const std::string& path)
1395 positions.
add(position, offset, line, path);
1400 return positions.find(position);
1404 const std::string& context)
1406 errors.emplace_back(positions.find(position.
start),
1407 positions.find(position.
end),
1408 position, msg, context);
1412 const std::string& context)
1414 warnings.emplace_back(positions.find(position.
start),
1415 positions.find(position.
end),
1416 position, msg, context);
1433 return !errors.empty();
1438 return !warnings.empty();
const std::vector< simregion_t > getSimregions()
returns the simregions of an LSC scenario.
symbol_t uid
The symbol of the variables.
std::list< instance_t > instances
void recordStrictInvariant()
Record that the system has some strict invariant.
Partial instance of a template.
std::string toString() const
void recordStopWatch()
Record that the system stops a clock.
struct template_t * templ
bool hasGuardOnRecvBroadcast
void addProgressMeasure(declarations_t *, expression_t guard, expression_t measure)
std::list< variable_t > variables
Variables.
instanceLine_t * anchor
Pointer to anchor instance line.
symbol_t uid
The symbol of the location.
edge_t & addEdge(symbol_t src, symbol_t dst, bool type, const std::string &actname)
Add edge to template.
virtual void visitProgressMeasure(progress_t &)
instance_t & addInstance(const std::string &name, instance_t &instance, frame_t params, const std::vector< expression_t > &arguments)
void addPosition(uint32_t position, uint32_t offset, uint32_t line, const std::string &path)
void erase(simregion_t s)
void addQuery(const query_t &query)
bool hasPriorityDeclaration() const
Returns true if system has some priority declaration.
bool hasStrictLowControlledGuards
bool isInPrechart() const
virtual void visitInstanceLine(instanceLine_t &)
uint32_t getSize() const
Returns the number of symbols in this frame.
std::string toString() const
bool hasStrictInvariants() const
Returns true if system has some strict invariant.
static const char *const invalid_type
bool contains(simregion_t s)
bool getUpdate(instanceLine_t *instance, int y, update_t *&simUpdate)
gets the update on the given instance at y location, returns false if there isn't any ...
std::vector< simregion_t > getSimregions(const std::vector< simregion_t > &simregions)
return the simregions anchored to this instance, ordered by location number
virtual void visitSystemAfter(TimedAutomataSystem *)
instance_t & addLscInstance(const std::string &name, instance_t &instance, frame_t params, const std::vector< expression_t > &arguments)
void addGantt(declarations_t *, gantt_t &)
std::list< template_t > dynamicTemplates
condition_t & addCondition(std::vector< symbol_t > anchors, int loc, bool pch, bool isHot)
Add condition to template.
int nr
Placement in input file.
Information about a location.
std::string getFunctions() const
void setBeforeUpdate(expression_t)
std::string writeParameters() const
std::list< template_t > templates
sync_use_t
Synchronization usage options: I/O (with ? or !) or CSP (plain)
std::vector< simregion_t > simregions
static type_t createInstance(frame_t, position_t=position_t())
Creates a new instance type.
std::string getName() const
Returns the name (identifier) of this symbol.
expression_t getAfterUpdate()
static deque< int > conditions_nr(deque< condition_t > conditions)
void addError(position_t, const std::string &msg, const std::string &ctx="")
std::string getTypeDefinitions() const
int32_t locNr
Location number in template.
void addWarning(position_t, const std::string &msg, const std::string &ctx="")
std::list< entry > tail_t
bool equals(const cut_t &y) const
int nr
Placement in input file.
static vector< edge_t > edges
frame_t parameters
The parameters.
int32_t instanceNr
InstanceLine number in template.
static type_t createPrimitive(Constants::kind_t, position_t=position_t())
Create a primitive type.
virtual void visitUpdate(update_t &)
bool getCondition(instanceLine_t *instance, int y, condition_t *&simCondition)
gets the condition on the given instance, at y location, returns false if there isn't any ...
std::vector< template_t * > dynamicTemplatesVec
Information about an edge.
expression_t exponentialRate
expression_t beforeUpdate
static type_t createLscInstance(frame_t, position_t=position_t())
Creates a new lsc instance type.
std::string getVariables(bool global) const
static vector< string > variables
virtual ~TimedAutomataSystem()
update_t & addUpdate(symbol_t anchor, int loc, bool pch)
Add update to template.
Information about an update.
std::string toString() const
const std::vector< error_t > & getErrors() const
virtual void visitFunction(function_t &)
static const char *const unsupported
virtual void visitVariable(variable_t &)
expression_t head
First expression in priority declaration.
void copyFunctionsFromTo(template_t *from, template_t *to) const
instanceLine_t & addInstanceLine()
Add another instance line to template.
std::list< instance_t > & getProcesses()
Returns the processes of the system.
message_t & addMessage(symbol_t src, symbol_t dst, int loc, bool pch)
Add message to template.
virtual bool visitTemplateBefore(template_t &)
void remove(symbol_t s)
removes the given symbol
Information about an instance line.
void setMessage(std::deque< message_t > &messages, int nr)
void beginChanPriority(expression_t chan)
virtual void visitMessage(message_t &)
virtual void visitInstance(instance_t &)
int getLoc() const
May be empty.
virtual void visitSystemBefore(TimedAutomataSystem *)
void addChanPriority(char separator, expression_t chan)
static frame_t createFrame()
Creates and returns a new root-frame.
void setProcPriority(const char *name, int priority)
Sets process priority for process name.
expression_t invariant
The invariant.
template_t * getDynamicTemplate(const std::string &name)
std::list< gantt_t > ganttChart
void recordStrictLowerBoundOnControllableEdges()
Record that the system has guards on controllable edges with strict lower bounds. ...
queries_t & getQueries()
Returns the queries enclosed in the model.
Base type for variables, clocks, etc.
type_t stripArray() const
Removes any leading prefixes, RANGE, REF, LABEL and ARRAY types and returns the result.
void setModified(bool mod)
const std::vector< error_t > & getWarnings() const
void setUpdate(std::deque< update_t > &updates, int nr)
std::string writeMapping() const
Channel priority information.
update_t * update
May be empty.
bool addFunction(type_t type, const std::string &, function_t *&)
Add function declaration.
std::vector< instanceLine_t * > anchors
Pointer to anchor instance lines.
bool isInPrechart() const
void setAfterUpdate(expression_t)
bool isInvariant()
return true if the LSC is of invariant mode
Exception indicating a type error.
virtual void visitGanttChart(gantt_t &)
static type_t createProcessSet(type_t instance, position_t=position_t())
Creates a new processset type.
Information about a branchpoint.
virtual void visitEdge(edge_t &)
std::list< iodecl_t > iodecl
virtual void visitProcess(instance_t &)
expression_t expr
The initialiser.
std::map< symbol_t, expression_t > mapping
The arguments.
type_t getType() const
Returns the type of this symbol.
static deque< int > messages_nr(deque< message_t > messages)
state_t & addLocation(const std::string &, expression_t inv, expression_t er)
Add another location to template.
virtual void visitTemplateAfter(template_t &)
std::map< std::string, int > procPriority
void add(uint32_t position, uint32_t offset, uint32_t line, const std::string &path)
Add information about a line to the container.
symbol_t uid
The symbol of the function.
Information about a message.
void addProcess(instance_t &instance)
std::string toString() const
bool hasStopWatch() const
Returns true if the system stops any clock.
void accept(SystemVisitor &)
A reference to an expression.
variable_t * addVariable(declarations_t *, type_t type, const std::string &, expression_t initial)
instanceLine_t * dst
Pointer to destination instance line.
Information about a function.
variable_t * addVariableToFunction(function_t *, frame_t, type_t, const std::string &, expression_t initital)
void addParameters(instance_t &inst, frame_t params, const std::vector< expression_t > &arguments)
std::vector< template_t * > & getDynamicTemplates()
virtual void visitIODecl(iodecl_t &)
condition_t * condition
May be empty.
void copyVariablesFromTo(template_t *from, template_t *to) const
template_t & addTemplate(const std::string &, frame_t params, const bool isTA=true, const std::string &type="", const std::string &mode="")
Creates and returns a new template.
void setCondition(std::deque< condition_t > &conditions, int nr)
void * getData()
Returns the user data of this symbol.
std::list< instance_t > processes
std::list< progress_t > progress
Progress measures.
std::string toString(bool global=false) const
The following methods are used to write the declarations in an XML file.
instanceLine_t * src
Pointer to source instance line.
branchpoint_t & addBranchpoint(const std::string &)
Add another branchpoint to template.
static deque< int > updates_nr(deque< update_t > updates)
expression_t getBeforeUpdate()
std::pair< char, expression_t > entry
static void visit(SystemVisitor &visitor, frame_t frame)
bool is(Constants::kind_t kind) const
Returns true if the type has kind kind or if type is a prefix, RANGE or REF type and the getChild()...
symbol_t addSymbol(const std::string &name, type_t, void *user=NULL)
Adds a symbol of the given name and type to the frame.
std::string writeArguments() const
int getProcPriority(const char *name) const
Returns process priority for process name.
std::list< template_t > & getTemplates()
Returns the templates of the system.
bool isLocation() const
Shortcut for is(LOCATION).
std::list< instance_t > lscInstances
template_t & addDynamicTemplate(const std::string &, frame_t params)
const std::list< chan_priority_t > & getChanPriorities() const
virtual void visitState(state_t &)
declarations_t & getGlobals()
Returns the global declarations of the system.
std::string getConstants() const
void removeProcess(instance_t &instance)
int nr
Placement in input file.
std::vector< query_t > queries_t
int32_t getIndexOf(const std::string &name) const
Returns the index of the symbol with the given name.
Information about a condition.
static type_t createProcess(frame_t, position_t=position_t())
Creates a new process type.
Constants::kind_t getKind() const
Returns the kind of type object.
bool hasStrictLowerBoundOnControllableEdges() const
Returns true if the system has guards on controllable edges with strict lower bounds.
const Positions::line_t & findPosition(uint32_t position) const
std::string toString() const
std::list< chan_priority_t > & getMutableChanPriorities()
virtual void visitTypeDef(symbol_t)
std::string toString() const
virtual void visitCondition(condition_t &)
void add(symbol_t)
Add all symbols from the given frame.
std::list< chan_priority_t > chanPriorities