ESBMC
Efficient SMT-based Context-Bounded Model Checker
Loading...
Searching...
No Matches
ld_ir.h
Go to the documentation of this file.
1#pragma once
2
5#include <string>
6#include <vector>
7
8// -----------------------------------------------------------------------
9// LdIR — cyclic control-flow graph over SOS state-transition blocks.
10//
11// Structure:
12// INIT_BLOCK
13// └── SCAN_LOOP (while true)
14// ├── READ_INPUTS
15// ├── RUNG_1 ... RUNG_n
16// └── WRITE_OUTPUTS
17// -----------------------------------------------------------------------
18
19enum class LdIRNodeKind
20{
21 ContactEval, // evaluate a contact → produces power-flow value
22 CoilAssign, // assign coil output
23 TimerStep, // TON/TOF/TP fixed-tick step
24 CounterStep, // CTU/CTD per-scan step
25 ArithStep, // arithmetic FB step
26};
27
28// One IR instruction corresponding to a single SOS rule application.
30{
32 SosRule rule; // which SOS rule generated this node
33
34 // Fields used by ContactEval / CoilAssign
35 std::string variable;
39
40 // Fields used by TimerStep
41 std::string timer_instance; // FB instance name (for shadow edge variable)
42 std::string timer_IN;
43 std::string timer_ET;
44 std::string timer_PT;
45 std::string timer_Q;
47
48 // Fields used by CounterStep
49 std::string ctr_instance; // FB instance name (for shadow edge variable)
50 std::string ctr_CU;
51 std::string ctr_CD;
52 std::string ctr_R;
53 std::string ctr_LD;
54 std::string ctr_CV;
55 std::string ctr_PV;
56 std::string ctr_Q;
58
59 // Fields used by ArithStep
60 std::string arith_IN1;
61 std::string arith_IN2;
62 std::string arith_OUT;
64
66};
67
68// A rung block is a sequence of IR nodes evaluated in order within one scan.
70{
71 std::string id;
72 std::vector<LdIRNode> nodes;
74};
75
76// A user-defined FB instance to execute once per scan cycle, with its ST body.
78{
79 std::string type_name;
80 std::string instance_name;
81 std::vector<FBVarDecl> input_vars; // formal inputs (IN1, IN2, ...) + types
82 std::vector<FBVarDecl> local_vars; // FB locals (e.g. "i") + types
83 std::vector<FBVarDecl> output_vars; // every formal output + types
84 std::vector<FBInWire> in_wires; // input pin sources ("" => nondet)
85 std::vector<FBOutWire> out_wires; // FB pin -> program variable assignments
86 std::string st_body; // raw Structured Text
87};
88
89// Top-level IR: variable declarations + the ordered list of rungs.
90struct LdIR
91{
92 std::string source_file;
93 std::vector<VarDecl> variables; // copied from LdAst
94 std::vector<LdIRRung> rungs; // ordered scan body
95 std::vector<UserFBExec> user_fbs; // user-defined FB bodies to execute
96};
ContactEdge
Definition ld_ast.h:29
@ None
Definition ld_ast.h:30
FBKind
Definition ld_ast.h:66
@ TON
Definition ld_ast.h:67
@ ADD
Definition ld_ast.h:72
@ CTU
Definition ld_ast.h:70
ContactKind
Definition ld_ast.h:20
@ NormallyOpen
Definition ld_ast.h:21
CoilKind
Definition ld_ast.h:48
@ Output
Definition ld_ast.h:49
LdIRNodeKind
Definition ld_ir.h:20
@ ArithStep
Definition ld_ir.h:25
@ TimerStep
Definition ld_ir.h:23
@ CounterStep
Definition ld_ir.h:24
@ ContactEval
Definition ld_ir.h:21
@ CoilAssign
Definition ld_ir.h:22
SosRule
Definition sos_semantics.h:8
Definition ld_ir.h:30
FBKind timer_kind
Definition ld_ir.h:46
std::string ctr_CV
Definition ld_ir.h:54
std::string arith_OUT
Definition ld_ir.h:62
ContactKind contact_kind
Definition ld_ir.h:36
std::string arith_IN1
Definition ld_ir.h:60
ContactEdge contact_edge
Definition ld_ir.h:37
std::string ctr_Q
Definition ld_ir.h:56
std::string timer_PT
Definition ld_ir.h:44
std::string timer_Q
Definition ld_ir.h:45
CoilKind coil_kind
Definition ld_ir.h:38
FBKind arith_kind
Definition ld_ir.h:63
std::string ctr_PV
Definition ld_ir.h:55
std::string ctr_LD
Definition ld_ir.h:53
std::string ctr_CU
Definition ld_ir.h:50
std::string timer_ET
Definition ld_ir.h:43
std::string timer_IN
Definition ld_ir.h:42
std::string timer_instance
Definition ld_ir.h:41
LdIRNodeKind kind
Definition ld_ir.h:31
std::string ctr_instance
Definition ld_ir.h:49
LdLocation loc
Definition ld_ir.h:65
std::string arith_IN2
Definition ld_ir.h:61
SosRule rule
Definition ld_ir.h:32
std::string ctr_R
Definition ld_ir.h:52
std::string variable
Definition ld_ir.h:35
std::string ctr_CD
Definition ld_ir.h:51
FBKind ctr_kind
Definition ld_ir.h:57
Definition ld_ir.h:70
LdLocation loc
Definition ld_ir.h:73
std::vector< LdIRNode > nodes
Definition ld_ir.h:72
std::string id
Definition ld_ir.h:71
Definition ld_ir.h:91
std::vector< LdIRRung > rungs
Definition ld_ir.h:94
std::vector< UserFBExec > user_fbs
Definition ld_ir.h:95
std::vector< VarDecl > variables
Definition ld_ir.h:93
std::string source_file
Definition ld_ir.h:92
Definition ld_ast.h:9
Definition ld_ir.h:78
std::string st_body
Definition ld_ir.h:86
std::string instance_name
Definition ld_ir.h:80
std::vector< FBVarDecl > local_vars
Definition ld_ir.h:82
std::string type_name
Definition ld_ir.h:79
std::vector< FBOutWire > out_wires
Definition ld_ir.h:85
std::vector< FBInWire > in_wires
Definition ld_ir.h:84
std::vector< FBVarDecl > output_vars
Definition ld_ir.h:83
std::vector< FBVarDecl > input_vars
Definition ld_ir.h:81