CBMC
Loading...
Searching...
No Matches
statement_list_parse_tree_io.cpp
Go to the documentation of this file.
1/*******************************************************************\
2
3Module: Statement List Language Parse Tree Output
4
5Author: Matthias Weiss, matthias.weiss@diffblue.com
6
7\*******************************************************************/
8
11
13
14#include <util/arith_tools.h>
16#include <util/ieee_float.h>
17#include <util/std_code.h>
18
20
22#define NO_VALUE "(none)"
23
27static void output_constant(std::ostream &os, const constant_exprt &constant)
28{
30 if(!to_integer(constant, ivalue))
31 os << ivalue;
32 else if(can_cast_type<floatbv_typet>(constant.type()))
33 {
35 real.from_expr(constant);
36 os << real.to_float();
37 }
38 else
39 os << constant.get_value();
40}
41
46 std::ostream &os,
47 const code_frontend_assignt &assignment)
48{
49 os << assignment.lhs().get(ID_identifier) << " := ";
50 const constant_exprt *const constant =
52 if(constant)
53 output_constant(os, *constant);
54 else
55 os << assignment.rhs().get(ID_identifier);
56}
57
59 std::ostream &out,
60 const statement_list_parse_treet &parse_tree)
61{
62 for(const auto &function_block : parse_tree.function_blocks)
63 {
64 out << "============== Function Block ==============\n";
66 out << '\n';
67 }
68
69 for(const auto &function : parse_tree.functions)
70 {
71 out << "================= Function =================\n";
72 output_function(out, function);
73 out << '\n';
74 }
75
76 if(!parse_tree.tags.empty())
77 {
78 out << "================= Tag List =================\n";
79 for(const auto &tag : parse_tree.tags)
80 {
81 out << tag.pretty();
82 out << '\n';
83 }
84 }
85}
86
96
98 std::ostream &os,
100{
101 output_tia_module_properties(function, os);
102 output_return_value(function, os);
103 output_common_var_declarations(os, function);
104 output_network_list(os, function.networks);
105}
106
109 std::ostream &os)
110{
111 os << "Name: " << module.name << '\n';
112 os << "Version: " << module.version << "\n\n";
113}
114
117 std::ostream &os)
118{
119 os << "Return type: ";
120 if(function.return_type.is_nil())
121 os << "Void";
122 else
123 os << function.return_type.id();
124 os << "\n\n";
125}
126
128 std::ostream &os,
130{
131 if(!module.var_input.empty())
132 {
133 os << "--------- Input Variables ----------\n\n";
134 output_var_declaration_list(os, module.var_input);
135 }
136
137 if(!module.var_inout.empty())
138 {
139 os << "--------- In/Out Variables ---------\n\n";
140 output_var_declaration_list(os, module.var_inout);
141 }
142
143 if(!module.var_output.empty())
144 {
145 os << "--------- Output Variables ---------\n\n";
146 output_var_declaration_list(os, module.var_output);
147 }
148
149 if(!module.var_constant.empty())
150 {
151 os << "-------- Constant Variables --------\n\n";
152 output_var_declaration_list(os, module.var_constant);
153 }
154
155 if(!module.var_temp.empty())
156 {
157 os << "---------- Temp Variables ----------\n\n";
159 }
160}
161
163 std::ostream &os,
165{
166 if(!block.var_static.empty())
167 {
168 os << "--------- Static Variables ---------\n\n";
170 }
171}
172
174 std::ostream &os,
176{
177 for(const auto &declaration : declarations)
178 {
179 output_var_declaration(os, declaration);
180 os << "\n\n";
181 }
182}
183
185 std::ostream &os,
187{
188 os << declaration.variable.pretty() << '\n';
189 os << " * default_value: ";
190 if(declaration.default_value)
191 {
192 const constant_exprt &constant =
193 to_constant_expr(declaration.default_value.value());
194 output_constant(os, constant);
195 }
196 else
197 os << NO_VALUE;
198}
199
201 std::ostream &os,
203{
204 os << "-------------- Networks --------------\n\n";
205 for(const auto &network : networks)
206 {
208 os << '\n';
209 }
210}
211
213 std::ostream &os,
215{
216 os << "Title: " << network.title.value_or(NO_VALUE) << '\n';
217 os << "Instructions: ";
218 if(network.instructions.empty())
219 os << NO_VALUE;
220 os << '\n';
221 for(const auto &instruction : network.instructions)
222 {
223 output_instruction(os, instruction);
224 os << '\n';
225 }
226}
227
229 std::ostream &os,
231{
232 for(const codet &token : instruction.tokens)
233 {
234 os << token.get_statement();
235 for(const auto &expr : token.operands())
236 {
237 const symbol_exprt *const symbol =
239 if(symbol)
240 {
241 os << '\t' << symbol->get_identifier();
242 continue;
243 }
244 const constant_exprt *const constant =
246 if(constant)
247 {
248 os << '\t';
249 output_constant(os, *constant);
250 continue;
251 }
252 if(const auto assign = expr_try_dynamic_cast<code_frontend_assignt>(expr))
253 {
254 os << "\n\t";
255 output_parameter_assignment(os, *assign);
256 continue;
257 }
258 os << '\t' << expr.id();
259 }
260 }
261}
bool to_integer(const constant_exprt &expr, mp_integer &int_value)
Convert a constant expression expr to an arbitrary-precision integer.
Pre-defined bitvector types.
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:562
A codet representing an assignment in the program.
Definition std_code.h:24
Data structure for representing an arbitrary statement in a program.
A constant literal expression.
Definition std_expr.h:3117
const irep_idt & get_value() const
Definition std_expr.h:3125
typet & type()
Return the type of the expression.
Definition expr.h:84
An IEEE 754 floating-point value, including specificiation.
Definition ieee_float.h:117
std::string pretty(unsigned indent=0, unsigned max_indent=0) const
Definition irep.cpp:482
const irep_idt & get(const irep_idt &name) const
Definition irep.cpp:44
Intermediate representation of a parsed Statement List file before converting it into a goto program.
std::list< var_declarationt > var_declarationst
functionst functions
List of functions this parse tree includes.
function_blockst function_blocks
List of function blocks this parse tree includes.
std::vector< symbol_exprt > tags
List of tags that were included in the source.
Expression to hold a symbol (variable)
Definition std_expr.h:131
const irep_idt & get_identifier() const
Definition std_expr.h:160
BigInt mp_integer
Definition smt_terms.h:17
#define NO_VALUE
String to indicate that there is no value.
void output_var_declaration(std::ostream &os, const statement_list_parse_treet::var_declarationt &declaration)
Prints the given Statement List variable declaration in a human-readable form to the given output str...
void output_return_value(const statement_list_parse_treet::functiont &function, std::ostream &os)
Prints the return value of a function to the given output stream.
static void output_parameter_assignment(std::ostream &os, const code_frontend_assignt &assignment)
Prints the assignment of a module parameter to the given output stream.
void output_instruction(std::ostream &os, const statement_list_parse_treet::instructiont &instruction)
Prints the given Statement List instruction in a human-readable form to the given output stream.
void output_var_declaration_list(std::ostream &os, const statement_list_parse_treet::var_declarationst &declarations)
Prints all variable declarations of the given list to the given output stream.
void output_parse_tree(std::ostream &out, const statement_list_parse_treet &parse_tree)
Prints the given Statement List parse tree in a human-readable form to the given output stream.
static void output_constant(std::ostream &os, const constant_exprt &constant)
Prints a constant to the given output stream.
void output_tia_module_properties(const statement_list_parse_treet::tia_modulet &module, std::ostream &os)
Prints the basic information about a TIA module to the given output stream.
void output_function(std::ostream &os, const statement_list_parse_treet::functiont &function)
Prints the given Statement List function in a human-readable form to the given output stream.
void output_common_var_declarations(std::ostream &os, const statement_list_parse_treet::tia_modulet &module)
Prints all variable declarations functions and function blocks have in common to the given output str...
void output_network_list(std::ostream &os, const statement_list_parse_treet::networkst &networks)
Prints the given network list in a human-readable form to the given output stream.
void output_network(std::ostream &os, const statement_list_parse_treet::networkt &network)
Prints the given Statement List network in a human-readable form to the given output stream.
void output_function_block(std::ostream &os, const statement_list_parse_treet::function_blockt &function_block)
Prints the given Statement List function block in a human-readable form to the given output stream.
void output_static_var_declarations(std::ostream &os, const statement_list_parse_treet::function_blockt &block)
Prints the static variable declarations of a function block to the given output stream.
Statement List Language Parse Tree Output.
floatbv_typet get_real_type()
Creates a new type that resembles the 'Real' type of the Siemens PLC languages.
Statement List Type Helper.
const constant_exprt & to_constant_expr(const exprt &expr)
Cast an exprt to a constant_exprt.
Definition std_expr.h:3172
Structure for a simple function block in Statement List.
var_declarationst var_static
FB-exclusive static variable declarations.
Structure for a simple function in Statement List.
const typet return_type
FC-exclusive return type.
Represents a regular Statement List instruction which consists out of one or more codet tokens.
std::vector< codet > tokens
Data structure for all tokens of the instruction.
Representation of a network in Siemens TIA.
Base element of all modules in the Totally Integrated Automation (TIA) portal by Siemens.
networkst networks
List of all networks of this module.
Struct for a single variable declaration in Statement List.
std::optional< exprt > default_value
Optional default value of the variable.
symbol_exprt variable
Representation of the variable, including identifier and type.