libutap  0.93
Uppaal Timed Automata Parser
system.h
Go to the documentation of this file.
1 // -*- mode: C++; c-file-style: "stroustrup"; c-basic-offset: 4; indent-tabs-mode: nil; -*-
2 
3 /* libutap - Uppaal Timed Automata Parser.
4  Copyright (C) 2011-2018 Aalborg University.
5  Copyright (C) 2002-2006 Uppsala University and Aalborg University.
6 
7  This library is free software; you can redistribute it and/or
8  modify it under the terms of the GNU Lesser General Public License
9  as published by the Free Software Foundation; either version 2.1 of
10  the License, or (at your option) any later version.
11 
12  This library is distributed in the hope that it will be useful, but
13  WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  Lesser General Public License for more details.
16 
17  You should have received a copy of the GNU Lesser General Public
18  License along with this library; if not, write to the Free Software
19  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20  USA
21 */
22 
23 #ifndef UTAP_INTERMEDIATE_HH
24 #define UTAP_INTERMEDIATE_HH
25 
26 #include "utap/symbols.h"
27 #include "utap/expression.h"
28 #include "utap/position.h"
29 
30 #include <list>
31 #include <deque>
32 #include <vector>
33 #include <map>
34 #include <exception>
35 #include <algorithm>
36 
37 namespace UTAP
38 {
43  struct variable_t
44  {
47  std::string toString() const;
48  };
49 
56  struct state_t
57  {
62  int32_t locNr;
63  std::string toString() const;
64  };
65 
72  {
74  int32_t bpNr;
75  };
76 
77 
78 
85  struct edge_t
86  {
87  int nr;
88  bool control;
89  std::string actname;
98 #ifdef ENABLE_PROB
99  expression_t prob;
100 #endif
101  std::string toString() const;
102  std::list<int32_t> selectValues;
103  };
104 
105  class BlockStatement; // Forward declaration
106 
110  struct function_t
111  {
113  std::set<symbol_t> changes;
114  std::set<symbol_t> depends;
115  std::list<variable_t> variables;
117  function_t() : body(NULL) {}
118  ~function_t();
119  std::string toString() const; // used to write the XML file
120  };
121 
122  struct progress_t
123  {
126  };
127 
128  struct iodecl_t
129  {
130  std::string instanceName;
131  std::vector<expression_t> param;
132  std::list<expression_t> inputs, outputs, csp;
133  };
134 
139  struct ganttmap_t
140  {
143  };
144 
148  struct gantt_t
149  {
150  gantt_t(const char *s) : name(s) {}
151  gantt_t(const std::string& s) : name(s) {}
152 
153  std::string name;
155  std::list<ganttmap_t> mapping;
156  };
157 
162  struct template_t;
164  {
166  std::list<variable_t> variables;
167  std::list<function_t> functions;
168  std::list<progress_t> progress;
169  std::list<iodecl_t> iodecl;
170  std::list<gantt_t> ganttChart;
171 
173  bool addFunction(type_t type, const std::string&, function_t *&);
175  std::string toString(bool global = false) const;
176  std::string getConstants() const;
177  std::string getTypeDefinitions() const;
178  std::string getVariables(bool global) const;
179  std::string getFunctions() const;
180  };
181 
182  struct instanceLine_t; //to be defined later
183 
188  struct message_t
189  {
190  int nr = -1;
191  int location;
196  };
200  struct condition_t
201  {
202  int nr = -1;
203  int location;
204  std::vector<instanceLine_t*> anchors; //TODO
207  bool isHot;
208  };
209 
213  struct update_t
214  {
215  int nr = -1;
216  int location;
220  };
221 
222  struct simregion_t
223  {
224  int nr;
229  int getLoc() const;
230  bool isInPrechart() const;
231 
233  {
234  message = new message_t();
235  condition = new condition_t();
236  update = new update_t();
237  }
238 
240  {
241  delete message;
242  delete condition;
243  delete update;
244  }
245 
246  std::string toString() const;
247 
248  void setMessage(std::deque<message_t>& messages, int nr);
249  void setCondition(std::deque<condition_t>& conditions, int nr);
250  void setUpdate(std::deque<update_t>& updates, int nr);
251  };
252 
254  {
255  bool operator() (const simregion_t& x, const simregion_t& y) const
256  {
257  return (x.getLoc() < y.getLoc());
258  }
259  };
260 
261  struct cut_t
262  {
263  int nr;
264  std::vector<simregion_t> simregions; //unordered
265  cut_t(int number) {
266  simregions.clear();
267  nr = number;
268  };
269  void add(simregion_t s) {
270  simregions.push_back(s);
271  };
272  void erase(simregion_t s);
273  bool contains(simregion_t s);
274 
285  bool isInPrechart(const simregion_t& fSimregion) const;
286  bool isInPrechart() const;
287 
288  bool equals(const cut_t& y) const;
289 
290  std::string toString() const {
291  std::string s="CUT(";
292  for (unsigned int i = 0; i < simregions.size(); ++i)
293  s += simregions[i].toString() + " ";
294  s = s.substr(0, s.size()-1);
295  s += ")";
296  return s;
297  };
298  };
299 
329  struct instance_t
330  {
333  std::map<symbol_t, expression_t> mapping;
334  size_t arguments;
335  size_t unbound;
336  struct template_t *templ;
337  std::set<symbol_t> restricted;
339  std::string writeMapping() const ;
340  std::string writeParameters() const ;
341  std::string writeArguments() const ;
342  };
343 
346  struct instanceLine_t : public instance_t
347  {
348  int32_t instanceNr;
349  std::vector<simregion_t> getSimregions(const std::vector<simregion_t>& simregions);
350  void addParameters(instance_t &inst, frame_t params,
351  const std::vector<expression_t> &arguments);
352  };
353 
355  {
358  std::deque<state_t> states;
359  std::deque<branchpoint_t> branchpoints;
360  std::deque<edge_t> edges;
361  std::vector<expression_t> dynamicEvals;
362  bool isTA;
363 
365  dynamicEvals.push_back (t);
366  return dynamicEvals.size()-1;
367  }
368 
369  std::vector<expression_t>& getDynamicEval () {return dynamicEvals;}
370 
372  state_t &addLocation(const std::string&, expression_t inv, expression_t er);
373 
375  branchpoint_t &addBranchpoint(const std::string&);
376 
378  edge_t &addEdge(symbol_t src, symbol_t dst, bool type,
379  const std::string& actname);
380 
381  std::deque<instanceLine_t> instances;
382  std::deque<message_t> messages;
383  std::deque<update_t> updates;
384  std::deque<condition_t> conditions;
385  std::string type;
386  std::string mode;
388  bool dynamic;
389  int dynindex;
390  bool isDefined;
391 
393  instanceLine_t &addInstanceLine();
394 
396  message_t &addMessage(symbol_t src, symbol_t dst, int loc, bool pch);
397 
399  condition_t &addCondition(std::vector<symbol_t> anchors, int loc,
400  bool pch, bool isHot);
401 
403  update_t &addUpdate(symbol_t anchor, int loc, bool pch);
404 
405  bool isInvariant(); // type of the LSC
406 
407 
408  /* gets the simregions from the LSC scenario */
409  const std::vector<simregion_t> getSimregions();
410 
411  /* returns the condition on the given instance, at y location */
412  bool getCondition(instanceLine_t* instance, int y, condition_t*& simCondition);
413 
414  /* returns the update on the given instance at y location */
415  bool getUpdate(instanceLine_t* instance, int y, update_t*& simUpdate);
416 
417  /* returns the first update on one of the given instances, at y location */
418  bool getUpdate(const std::vector<instanceLine_t*>& instances, int y, update_t*& simUpdate);
419 
420  };
421 
427  {
428  typedef std::pair<char,expression_t> entry;
429  typedef std::list<entry> tail_t;
430 
432  tail_t tail;
433 
434  std::string toString() const;
435  };
436 
437  struct query_t {
438  std::string formula;
439  std::string comment;
440  std::string location;
441  };
442  typedef std::vector<query_t> queries_t;
443 
444 
445  class TimedAutomataSystem;
446 
448  {
449  public:
450  virtual ~SystemVisitor() {}
453  virtual void visitVariable(variable_t &) {}
454  virtual bool visitTemplateBefore(template_t &) { return true; }
455  virtual void visitTemplateAfter(template_t &) {}
456  virtual void visitState(state_t &) {}
457  virtual void visitEdge(edge_t &) {}
458  virtual void visitInstance(instance_t &) {}
459  virtual void visitProcess(instance_t &) {}
460  virtual void visitFunction(function_t &) {}
461  virtual void visitTypeDef(symbol_t) {}
462  virtual void visitIODecl(iodecl_t&) {}
463  virtual void visitProgressMeasure(progress_t &) {}
464  virtual void visitGanttChart(gantt_t&) {}
466  virtual void visitMessage(message_t &) {}
467  virtual void visitCondition(condition_t &) {}
468  virtual void visitUpdate(update_t &) {}
469  };
470 
472  {
473  public:
476  virtual ~TimedAutomataSystem();
477 
479  declarations_t &getGlobals();
480 
482  std::list<template_t> &getTemplates();
483  std::vector<template_t*> &getDynamicTemplates ();
484  template_t* getDynamicTemplate(const std::string& name);
485 
487  std::list<instance_t> &getProcesses();
488 
490  queries_t &getQueries();
491 
492  void addPosition(
493  uint32_t position, uint32_t offset, uint32_t line, const std::string& path);
494  const Positions::line_t &findPosition(uint32_t position) const;
495 
496  variable_t *addVariableToFunction(
497  function_t *, frame_t, type_t, const std::string&, expression_t initital);
498  variable_t *addVariable(
499  declarations_t *, type_t type, const std::string&, expression_t initial);
500  void addProgressMeasure(
501  declarations_t *, expression_t guard, expression_t measure);
502 
503  template_t &addTemplate(const std::string&, frame_t params,
504  const bool isTA = true,
505  const std::string& type = "",
506  const std::string& mode = "");
507  template_t &addDynamicTemplate(const std::string&, frame_t params);
508 
509  instance_t &addInstance(
510  const std::string& name, instance_t &instance, frame_t params,
511  const std::vector<expression_t> &arguments);
512 
513  instance_t &addLscInstance(
514  const std::string& name, instance_t &instance, frame_t params,
515  const std::vector<expression_t> &arguments);
516  void removeProcess(instance_t &instance); //LSC
517 
518  void copyVariablesFromTo(template_t* from, template_t* to) const;
519  void copyFunctionsFromTo(template_t* from, template_t* to) const;
520 
521  std::string obsTA; //name of the observer TA instance
522 
523  void addProcess(instance_t &instance);
524  void addGantt(declarations_t*, gantt_t&);
525  void accept(SystemVisitor &);
526 
527  void setBeforeUpdate(expression_t);
528  expression_t getBeforeUpdate();
529  void setAfterUpdate(expression_t);
530  expression_t getAfterUpdate();
531 
532  void addQuery(const query_t &query);
533  bool queriesEmpty();
534 
535  /* The default priority for channels is also used for 'tau
536  * transitions' (i.e. non-synchronizing transitions).
537  */
538  void beginChanPriority(expression_t chan);
539  void addChanPriority(char separator, expression_t chan);
540  const std::list<chan_priority_t>& getChanPriorities() const;
541  std::list<chan_priority_t>& getMutableChanPriorities();
542 
544  void setProcPriority(const char* name, int priority);
545 
547  int getProcPriority(const char* name) const;
548 
550  bool hasPriorityDeclaration() const;
551 
553  bool hasStrictInvariants() const;
554 
556  void recordStrictInvariant();
557 
559  bool hasStopWatch() const;
560 
562  void recordStopWatch();
563 
565  bool hasStrictLowerBoundOnControllableEdges() const;
566 
568  void recordStrictLowerBoundOnControllableEdges();
569 
570  void clockGuardRecvBroadcast() { hasGuardOnRecvBroadcast = true; }
571  bool hasClockGuardRecvBroadcast() const { return hasGuardOnRecvBroadcast; }
572  void setSyncUsed(sync_use_t s) { syncUsed = s; }
573  sync_use_t getSyncUsed() const { return syncUsed; }
574 
575  void setUrgentTransition() { hasUrgentTrans = true; }
576  bool hasUrgentTransition() const { return hasUrgentTrans; }
577  bool hasDynamicTemplates () const {return dynamicTemplates.size () != 0;}
578 
579  protected:
580 
588  std::list<chan_priority_t> chanPriorities;
589  std::map<std::string,int> procPriority;
590  sync_use_t syncUsed; // see typechecker
591 
592  // The list of templates.
593  std::list<template_t> templates;
594  //List of dynamic template
595  std::list<template_t> dynamicTemplates;
596  std::vector<template_t*> dynamicTemplatesVec;
597 
598  // The list of template instances.
599  std::list<instance_t> instances;
600 
601  std::list<instance_t> lscInstances;
602  bool modified;
603 
604  // List of processes.
605  std::list<instance_t> processes;
606 
607  // Global declarations
609 
612  queries_t queries;
613 
614  variable_t *addVariable(
615  std::list<variable_t> &variables, frame_t frame,
616  type_t type, const std::string&);
617 
618  std::string location;
619 
620  public:
621  void addError(position_t, const std::string& msg, const std::string& ctx="");
622  void addWarning(position_t, const std::string& msg, const std::string& ctx="");
623  bool hasErrors() const;
624  bool hasWarnings() const;
625  const std::vector<error_t> &getErrors() const;
626  const std::vector<error_t> &getWarnings() const;
627  void clearErrors();
628  void clearWarnings();
629  bool isModified() const;
630  void setModified(bool mod);
631  iodecl_t* addIODecl();
632  private:
633  std::vector<error_t> errors;
634  std::vector<error_t> warnings;
635  Positions positions;
636  };
637 }
638 
639 #endif
symbol_t uid
The symbol of the variables.
Definition: system.h:45
std::list< instance_t > instances
Definition: system.h:599
std::string name
The name.
Definition: system.h:153
std::vector< expression_t > dynamicEvals
Definition: system.h:361
int location
Definition: system.h:216
bool isInPrechart
Definition: system.h:195
Partial instance of a template.
Definition: system.h:329
std::string formula
Definition: system.h:438
bool hasUrgentTransition() const
Definition: system.h:576
struct template_t * templ
Definition: system.h:336
std::string toString() const
Definition: system.h:290
std::vector< expression_t > & getDynamicEval()
Definition: system.h:369
branchpoint_t * dstb
Pointer to destination branchpoint.
Definition: system.h:93
message_t * message
Definition: system.h:225
std::list< variable_t > variables
Variables.
Definition: system.h:166
static bool isInvariant(expression_t expr)
std::list< variable_t > variables
Local variables.
Definition: system.h:115
virtual ~SystemVisitor()
Definition: system.h:450
instanceLine_t * anchor
Pointer to anchor instance line.
Definition: system.h:217
bool isDefined
Definition: system.h:390
symbol_t uid
The symbol of the location.
Definition: system.h:58
std::string location
Definition: system.h:618
std::list< ganttmap_t > mapping
Definition: system.h:155
virtual void visitProgressMeasure(progress_t &)
Definition: system.h:463
expression_t label
The label.
Definition: system.h:205
std::deque< condition_t > conditions
Conditions.
Definition: system.h:384
std::set< symbol_t > restricted
Restricted variables.
Definition: system.h:337
bool hasStrictLowControlledGuards
Definition: system.h:585
std::string comment
Definition: system.h:439
bool hasPrechart
Definition: system.h:387
std::deque< state_t > states
Locations.
Definition: system.h:358
virtual void visitInstanceLine(instanceLine_t &)
Definition: system.h:465
void add(simregion_t s)
Definition: system.h:269
size_t unbound
Definition: system.h:335
std::set< symbol_t > changes
Variables changed by this function.
Definition: system.h:113
symbol_t uid
Definition: system.h:73
expression_t guard
Definition: system.h:124
bool control
Controllable (true/false)
Definition: system.h:88
virtual void visitSystemAfter(TimedAutomataSystem *)
Definition: system.h:452
std::list< template_t > dynamicTemplates
Definition: system.h:595
Information about a location.
Definition: system.h:56
expression_t label
The label.
Definition: system.h:194
expression_t guard
The guard.
Definition: system.h:95
int addDynamicEval(expression_t t)
Definition: system.h:364
std::list< template_t > templates
Definition: system.h:593
sync_use_t
Synchronization usage options: I/O (with ? or !) or CSP (plain)
Definition: common.h:270
std::vector< simregion_t > simregions
Definition: system.h:264
sync_use_t getSyncUsed() const
Definition: system.h:573
A reference to a symbol.
Definition: symbols.h:107
expression_t sync
The synchronisation.
Definition: system.h:97
void setSyncUsed(sync_use_t s)
Definition: system.h:572
std::list< expression_t > outputs
Definition: system.h:132
bool isInPrechart
Definition: system.h:219
std::list< function_t > functions
Functions.
Definition: system.h:167
int32_t locNr
Location number in template.
Definition: system.h:62
std::list< entry > tail_t
Definition: system.h:429
frame_t parameters
The parameters.
Definition: system.h:332
int32_t instanceNr
InstanceLine number in template.
Definition: system.h:348
cut_t(int number)
Definition: system.h:265
virtual void visitUpdate(update_t &)
Definition: system.h:468
std::vector< template_t * > dynamicTemplatesVec
Definition: system.h:596
state_t * src
Pointer to source location.
Definition: system.h:90
Information about an edge.
Definition: system.h:85
expression_t exponentialRate
Definition: system.h:60
expression_t beforeUpdate
Definition: system.h:610
int nr
Placement in input file.
Definition: system.h:87
A container for information about lines and positions in the input file.
Definition: position.h:61
static vector< string > variables
Definition: tracer.cpp:153
std::deque< message_t > messages
Messages.
Definition: system.h:382
std::vector< expression_t > param
Definition: system.h:131
Information about an update.
Definition: system.h:213
virtual void visitFunction(function_t &)
Definition: system.h:460
std::string actname
Definition: system.h:89
std::string location
Definition: system.h:440
branchpoint_t * srcb
Pointer to source branchpoint.
Definition: system.h:91
virtual void visitVariable(variable_t &)
Definition: system.h:453
expression_t assign
The assignment.
Definition: system.h:96
declarations_t global
Definition: system.h:608
state_t * dst
Pointer to destination location.
Definition: system.h:92
frame_t parameters
Definition: system.h:141
expression_t head
First expression in priority declaration.
Definition: system.h:431
virtual bool visitTemplateBefore(template_t &)
Definition: system.h:454
Gantt chart entry.
Definition: system.h:148
std::set< symbol_t > depends
Variables the function depends on.
Definition: system.h:114
Information about an instance line.
Definition: system.h:346
virtual void visitMessage(message_t &)
Definition: system.h:466
virtual void visitInstance(instance_t &)
Definition: system.h:458
int getLoc() const
May be empty.
Definition: system.cpp:723
virtual void visitSystemBefore(TimedAutomataSystem *)
Definition: system.h:451
expression_t label
The label.
Definition: system.h:218
std::deque< edge_t > edges
Edges.
Definition: system.h:360
expression_t invariant
The invariant.
Definition: system.h:59
std::list< gantt_t > ganttChart
Definition: system.h:170
std::string type
Definition: system.h:385
Base type for variables, clocks, etc.
Definition: system.h:43
size_t arguments
Definition: system.h:334
std::list< int32_t > selectValues
The select values, if any.
Definition: system.h:102
Channel priority information.
Definition: system.h:426
update_t * update
May be empty.
Definition: system.h:227
std::vector< instanceLine_t * > anchors
Pointer to anchor instance lines.
Definition: system.h:204
frame_t templateset
Template set decls.
Definition: system.h:357
std::string instanceName
Definition: system.h:130
virtual void visitGanttChart(gantt_t &)
Definition: system.h:464
Information about a branchpoint.
Definition: system.h:71
void clockGuardRecvBroadcast()
Definition: system.h:570
int nr
Definition: system.h:263
virtual void visitEdge(edge_t &)
Definition: system.h:457
A reference to a frame.
Definition: symbols.h:183
std::list< iodecl_t > iodecl
Definition: system.h:169
virtual void visitProcess(instance_t &)
Definition: system.h:459
expression_t expr
The initialiser.
Definition: system.h:46
A reference to a type.
Definition: type.h:93
std::map< symbol_t, expression_t > mapping
The arguments.
Definition: system.h:333
virtual void visitTemplateAfter(template_t &)
Definition: system.h:455
std::map< std::string, int > procPriority
Definition: system.h:589
symbol_t uid
The symbol of the function.
Definition: system.h:112
frame_t select
Frame for non-deterministic select.
Definition: system.h:94
Information about a message.
Definition: system.h:188
std::string toString() const
Definition: system.cpp:105
BlockStatement * body
Pointer to the block.
Definition: system.h:116
Gantt map bool expr -> int expr that can be expanded.
Definition: system.h:139
A reference to an expression.
Definition: expression.h:70
instanceLine_t * dst
Pointer to destination instance line.
Definition: system.h:193
Information about a function.
Definition: system.h:110
tail_t tail
Pairs: separator and channel expressions.
Definition: system.h:432
expression_t predicate
Definition: system.h:142
std::deque< update_t > updates
Updates.
Definition: system.h:383
expression_t afterUpdate
Definition: system.h:611
virtual void visitIODecl(iodecl_t &)
Definition: system.h:462
gantt_t(const std::string &s)
Definition: system.h:151
condition_t * condition
May be empty.
Definition: system.h:226
std::list< instance_t > processes
Definition: system.h:605
frame_t parameters
The select parameters.
Definition: system.h:154
std::list< progress_t > progress
Progress measures.
Definition: system.h:168
symbol_t init
The initial location.
Definition: system.h:356
gantt_t(const char *s)
Definition: system.h:150
instanceLine_t * src
Pointer to source instance line.
Definition: system.h:192
bool hasDynamicTemplates() const
Definition: system.h:577
std::pair< char, expression_t > entry
Definition: system.h:428
bool hasClockGuardRecvBroadcast() const
Definition: system.h:571
int32_t bpNr
Definition: system.h:74
Definition: lexer.cc:817
std::list< instance_t > lscInstances
Definition: system.h:601
std::deque< instanceLine_t > instances
Instance Lines.
Definition: system.h:381
std::string mode
Definition: system.h:386
virtual void visitState(state_t &)
Definition: system.h:456
std::deque< branchpoint_t > branchpoints
Branchpoints.
Definition: system.h:359
std::vector< query_t > queries_t
Definition: system.h:442
expression_t costRate
Rate expression.
Definition: system.h:61
Information about a condition.
Definition: system.h:200
expression_t measure
Definition: system.h:125
virtual void visitTypeDef(symbol_t)
Definition: system.h:461
bool isInPrechart
Definition: system.h:206
virtual void visitCondition(condition_t &)
Definition: system.h:467
std::list< chan_priority_t > chanPriorities
Definition: system.h:588
symbol_t uid
The name.
Definition: system.h:331