108 const std::map<bit_lattice, std::map<bit_lattice, std::map<bit_lattice, std::deque<bit_lattice>>>>
405 const std::map<bit_lattice, std::map<bit_lattice, std::map<bit_lattice, std::deque<bit_lattice>>>>
822 "-->Pointer resizing starting from " +
TM->CGetTreeNode(output_id)->ToString());
825 unsigned long long address_bitsize;
828 auto* hm = GetPointer<HLS_manager>(
AppM);
833 unsigned long long int max_addr =
836 for(address_bitsize = 1; max_addr > (1ull << address_bitsize); ++address_bitsize)
841 if(address_bitsize < 4)
846 auto vd = GetPointer<const var_decl>(
TM->CGetTreeNode(var));
847 if(hm->Rmem->get_base_address(var,
function_id) == 0 && vd)
849 auto align = vd->algn;
870 address_bitsize = hm->get_address_bitsize();
876 address_bitsize =
AppM->get_address_bitsize();
885 return address_bitsize;
890 const auto vd = GetPointer<const var_decl>(
GET_CONST_NODE(ae->op));
895 auto align = vd->algn;
914 return found ?
index : 0;
918 const DesignFlowManagerConstRef dfm)
932 switch(relationship_type)
937 relationships.insert(std::make_pair(CALL_GRAPH_BUILTIN_CALL,
SAME_FUNCTION));
938 relationships.insert(std::make_pair(COMPUTE_IMPLICIT_CALLS,
SAME_FUNCTION));
939 relationships.insert(std::make_pair(DETERMINE_MEMORY_ACCESSES,
SAME_FUNCTION));
941 relationships.insert(std::make_pair(EXTRACT_GIMPLE_COND_OP,
SAME_FUNCTION));
942 relationships.insert(std::make_pair(FIX_STRUCTS_PASSED_BY_VALUE,
SAME_FUNCTION));
943 relationships.insert(std::make_pair(FUNCTION_CALL_TYPE_CLEANUP,
SAME_FUNCTION));
944 relationships.insert(std::make_pair(IR_LOWERING,
SAME_FUNCTION));
945 relationships.insert(std::make_pair(PARM2SSA,
SAME_FUNCTION));
948 relationships.insert(std::make_pair(SOFT_FLOAT_CG_EXT,
SAME_FUNCTION));
950 relationships.insert(std::make_pair(UN_COMPARISON_LOWERING,
SAME_FUNCTION));
951 relationships.insert(std::make_pair(USE_COUNTING,
SAME_FUNCTION));
965 return relationships;
975 const auto bambu_frontend_flow_signature =
980 THROW_ASSERT(tn->get_kind() == function_decl_K,
"Node is not a function");
981 const auto fd = GetPointerS<const function_decl>(tn);
983 const auto sl = GetPointerS<const statement_list>(
GET_CONST_NODE(fd->body));
990 for(
const auto&
block :
sl->list_of_bloc)
992 inverse_vertex_map.insert(
997 for(
const auto& curr_bb_pair :
sl->list_of_bloc)
999 const auto curr_bbi = curr_bb_pair.first;
1000 const auto curr_bb = curr_bb_pair.second;
1001 for(
const auto& lop : curr_bb->list_of_pred)
1003 THROW_ASSERT(static_cast<bool>(inverse_vertex_map.count(lop)),
1004 "BB" +
STR(lop) +
" (successor of BB" +
STR(curr_bbi) +
") does not exist");
1005 bb_graphs_collection->AddEdge(inverse_vertex_map.at(lop), inverse_vertex_map.at(curr_bbi),
CFG_SELECTOR);
1008 for(
const auto& los : curr_bb->list_of_succ)
1012 bb_graphs_collection->AddEdge(inverse_vertex_map.at(curr_bbi), inverse_vertex_map.at(los),
CFG_SELECTOR);
1016 if(curr_bb->list_of_succ.empty())
1018 bb_graphs_collection->AddEdge(inverse_vertex_map.at(curr_bbi), inverse_vertex_map.at(
bloc::EXIT_BLOCK_ID),
1030 for(
const auto& it : bb_dominators.get_dominator_map())
1034 bb_graphs_collection->AddEdge(it.second, it.first,
D_SELECTOR);
1037 dt->
GetBBGraphInfo()->bb_index_map = std::move(inverse_vertex_map);
1039 std::list<vertex> v_topological;
1043 std::transform(v_topological.begin(), v_topological.end(), std::back_inserter(
bb_topological),
1103 for(
const auto& m :
map)
1106 "var_uid: " +
STR(m.first) +
":" + BH->PrintVariable(m.first) +
1116 for(
const auto& b :
best)
1118 const auto tn_id = b.first;
1119 const auto tn =
TM->GetTreeNode(tn_id);
1120 const auto kind = tn->get_kind();
1121 if(
kind == ssa_name_K)
1123 auto ssa = GetPointerS<ssa_name>(tn);
1126 if(!
AppM->ApplyNewTransformation())
1131 "Variable: " + ssa->ToString() +
" bitstring: " + ssa->bit_values +
" -> " +
1140 else if(
kind == function_decl_K)
1142 auto fd = GetPointerS<function_decl>(tn);
1145 if(!
AppM->ApplyNewTransformation())
1157 else if(
kind == integer_cst_K ||
kind == real_cst_K)
1163 THROW_ERROR(
"unexpected condition: variable of kind " + tn->get_kind_text());
1178 const auto CGMan =
AppM->CGetCallGraphManager();
1179 const auto cg = CGMan->CGetCallGraph();
1182 const auto rbf = CGMan->GetReachedBodyFunctions();
1184 boost::tie(oe_it, oe_end) = boost::out_edges(v, *cg);
1185 for(; oe_it != oe_end; oe_it++)
1187 const auto call_edge_info = cg->CGetFunctionEdgeInfo(*oe_it);
1188 for(
const auto& i : call_edge_info->direct_call_points)
1190 const auto called_id = CGMan->get_function(
boost::target(*oe_it, *cg));
1194 THROW_ASSERT(
AppM->CGetFunctionBehavior(called_id)->CGetBehavioralHelper()->get_function_name() ==
MEMCPY,
1196 " calls function " +
1197 AppM->CGetFunctionBehavior(called_id)->CGetBehavioralHelper()->get_function_name() +
1198 " with an artificial call: this should not happen");
1201 if(rbf.find(called_id) != rbf.end())
1209 const auto fd = GetPointerS<const function_decl>(tn);
1214 for(
const auto& parm_decl_node : fd->list_of_args)
1222 const auto parmssa =
TM->CGetTreeNode(parmssa_id);
1223 const auto p = GetPointerS<const ssa_name>(parmssa);
1224 const auto b = p->CGetUseStmts().empty() ?
1228 best[parmssa_id] = b;
1246 "Function returning " + (fret_type_node ?
STR(fret_type_node) :
"void") +
" not considered");
1251 if(fd->bit_values.empty())
1287 for(
const auto& stmt :
B->CGetStmtList())
1290 if(stmt_node->get_kind() == gimple_assign_K)
1292 const auto ga = GetPointerS<const gimple_assign>(stmt_node);
1296 if(lhs->get_kind() == ssa_name_K)
1300 "Analyzing " + stmt_node->get_kind_text() +
"(" +
STR(stmt_node->index) +
1301 "): " +
STR(stmt_node));
1309 "---variable " +
STR(GetPointerS<const ssa_name>(lhs)) +
" of type " +
1322 if(ga_op1_kind == array_ref_K || ga_op1_kind == mem_ref_K || ga_op1_kind == target_mem_ref_K ||
1323 ga_op1_kind == target_mem_ref461_K || ga_op1_kind == var_decl_K)
1325 const auto hm = GetPointer<const HLS_manager>(
AppM);
1327 const auto var_node =
TM->GetTreeNode(base_index);
1328 auto vd = GetPointer<var_decl>(var_node);
1330 AppM->get_written_objects().find(base_index) ==
AppM->get_written_objects().end() && hm &&
1331 hm->Rmem && hm->Rmem->get_enable_hls_bit_value() &&
1332 function_behavior->is_variable_mem(base_index) && hm->Rmem->is_sds_var(base_index) && vd &&
1335 std::deque<bit_lattice> current_inf;
1360 best[lhs_nid] = current_inf;
1368 AppM->get_written_objects().find(base_index) !=
AppM->get_written_objects().end() && hm &&
1369 hm->Rmem && hm->Rmem->get_enable_hls_bit_value() &&
1370 function_behavior->is_variable_mem(base_index) && hm->Rmem->is_private_memory(base_index) &&
1371 hm->Rmem->is_sds_var(base_index))
1375 if(!private_variables.count(base_index))
1377 std::deque<bit_lattice> current_inf;
1406 "---Computed the init bitstring for " +
1409 for(
const auto& cur_var : hm->Rmem->get_source_values(base_index))
1411 const auto cur_node =
TM->CGetTreeNode(cur_var);
1416 "---source node: " +
STR(cur_node) +
" source is signed: " +
1417 STR(source_is_signed) +
" loaded is signed: " +
STR(lhs_signed));
1418 std::deque<bit_lattice> cur_bitstring;
1419 if(cur_node->get_kind() == ssa_name_K)
1421 const auto ssa = GetPointerS<const ssa_name>(cur_node);
1425 "---Not handled by bitvalue");
1431 "---Is handled by bitvalue");
1435 else if(cur_node->get_kind() == integer_cst_K)
1446 if(cur_bitstring.size() != 0)
1450 if(cur_bitstring.size() < source_type_size && source_is_signed != lhs_signed)
1464 "---bitstring empty --> using U");
1469 current_inf =
inf(current_inf, cur_bitstring, lhs);
1475 current_inf.pop_front();
1477 if(current_inf.empty())
1487 "---Bit Value: variable " +
1489 " trimmed to bitsize: " +
STR(vd->bit_values.size()) +
1490 " with bit-value pattern: " + vd->bit_values);
1491 private_variables[base_index] = current_inf;
1493 const auto var_inf = private_variables.at(base_index);
1495 "---Init bitstring for a private written memory variable " +
1497 best[lhs_nid] = var_inf;
1503 "Analyzed " + stmt_node->get_kind_text() +
": " +
STR(stmt_node));
1506 else if(stmt_node->get_kind() == gimple_asm_K)
1508 const auto ga = GetPointerS<const gimple_asm>(stmt_node);
1511 const auto tl = GetPointer<const tree_list>(
GET_CONST_NODE(ga->out));
1512 THROW_ASSERT(tl->valu,
"only the first output and so only single output gimple_asm are supported");
1513 const auto ssa = GetPointer<const ssa_name>(
GET_CONST_NODE(tl->valu));
1517 "Analyzing " + stmt_node->get_kind_text() +
"(" +
STR(stmt_node->index) +
")");
1519 "---Initializing bitstring for an asm instruction");
1533 const auto set_value = [&](
unsigned int node_id) {
1538 auto use_node =
TM->GetTreeNode(node_id);
1548 if(use_node->get_kind() == ssa_name_K)
1550 const auto ssa = GetPointerS<ssa_name>(use_node);
1557 if(ssa->volatile_flag)
1559 ssa->bit_values.clear();
1564 const auto def = ssa->CGetDefStmt();
1565 if(!def || (ssa->var !=
nullptr && ((
GET_CONST_NODE(def)->get_kind() == gimple_nop_K)) &&
1568 ssa->bit_values.clear();
1579 if(
AppM->ApplyNewTransformation())
1581 const auto tree_man =
AppM->get_tree_manager();
1582 const auto ssa_node = tree_man->GetTreeReindex(node_id);
1583 const auto cst_value = tree_man->CreateUniqueIntegerCst(0, ssa->type);
1584 const auto uses = ssa->CGetUseStmts();
1585 for(
const auto& stmt_use : uses)
1587 tree_man->ReplaceTreeNode(stmt_use.first, ssa_node, cst_value);
1589 AppM->RegisterTransformation(
GetName(), ssa_node);
1597 if(use_node->get_kind() == integer_cst_K)
1623 for(
const auto&
phi :
B->CGetPhiList())
1628 const auto is_virtual = pn->virtual_flag;
1633 auto ssa = GetPointer<ssa_name>(
GET_NODE(pn->res));
1639 " not considered id: " +
STR(res_nid));
1649 ssa->bit_values.clear();
1653 if(ssa->CGetUseStmts().empty())
1656 if(
best.count(res_nid))
1664 if(ssa->bit_values.empty())
1672 if(
best.count(res_nid))
1678 for(
const auto& def_edge : pn->CGetDefEdgesList())
1687 for(
const auto& stmt :
B->CGetStmtList())
1694 "): " +
STR(stmt_node));
1695 if(stmt_node->get_kind() == gimple_assign_K)
1697 const auto ga = GetPointerS<const gimple_assign>(stmt_node);
1700 const auto lhs =
GET_NODE(ga->op0);
1702 if(lhs->get_kind() == ssa_name_K)
1704 auto lhs_ssa = GetPointerS<ssa_name>(lhs);
1717 lhs_ssa->bit_values.clear();
1728 if(lhs_ssa->CGetUseStmts().empty())
1733 else if(ga_op1_kind == array_ref_K || ga_op1_kind == mem_ref_K || ga_op1_kind == target_mem_ref_K ||
1734 ga_op1_kind == target_mem_ref461_K || ga_op1_kind == var_decl_K)
1751 else if(ga_op1_kind == call_expr_K || ga_op1_kind == aggr_init_expr_K)
1753 const auto ce = GetPointerS<const call_expr>(
GET_CONST_NODE(ga->op1));
1757 const auto ae = GetPointerS<const addr_expr>(addr_node);
1759 THROW_ASSERT(fu_decl_node->get_kind() == function_decl_K,
"node " +
STR(fu_decl_node) +
1760 " is not function_decl but " +
1761 fu_decl_node->get_kind_text());
1765 const auto called_fd = GetPointer<const function_decl>(fu_decl_node);
1766 const auto new_bitvalue =
1767 called_fd->bit_values.empty() ?
1769 called_fd->range->getBitValues(
1773 if(
best[lhs_nid].empty())
1775 best[lhs_nid] = new_bitvalue;
1779 best[lhs_nid] =
sup(new_bitvalue,
best[lhs_nid], lhs);
1789 else if(ga_op1_kind == lut_expr_K)
1793 else if(ga_op1_kind == extract_bit_expr_K)
1799 if(lhs_ssa->bit_values.empty())
1804 u_string.pop_front();
1807 best[lhs_nid] = u_string;
1822 else if(stmt_node->get_kind() == gimple_asm_K)
1824 const auto ga = GetPointerS<const gimple_asm>(stmt_node);
1827 const auto tl = GetPointer<const tree_list>(
GET_CONST_NODE(ga->out));
1828 THROW_ASSERT(tl->valu,
"only the first output and so only single output gimple_asm are supported");
1830 auto out_ssa = GetPointer<ssa_name>(out_node);
1831 if(out_ssa && !out_ssa->CGetUseStmts().empty())
1842 out_ssa->bit_values.clear();
1860 "---LHS unhandled for statement kind: " +
STR(stmt_node->index));
1863 std::vector<std::tuple<unsigned int, unsigned int>> vars_read;
1866 for(
const auto& var_pair : vars_read)
1868 const auto ssa_use_node_id = std::get<0>(var_pair);
1869 set_value(ssa_use_node_id);
1873 "Analyzed " + stmt_node->get_kind_text() +
": " +
STR(stmt_node));
1885 for(
const auto& b :
best)
1893 const auto position_in_current =
current.find(b.first);
1894 if(position_in_current !=
current.end())
1896 current.erase(position_in_current);
#define GET_NODE(t)
Macro used to hide implementation details when accessing a tree_node from another tree_node...
std::deque< bit_lattice > string_cst_bitstring(const tree_nodeRef &strcst_tn, unsigned int ssa_node_id) const
auxiliary function used to build the bitstring lattice for read-only string_cst
static size_t CGetPointerSize(const ParameterConstRef parameters)
Return the size of the pointer in bit.
#define DEBUG_LEVEL_VERY_PEDANTIC
extremely verbose debugging print is performed.
Data structure representing the entire HLS information.
#define INDENT_DBG_MEX(dbgLevel, curDbgLevel, mex)
We are producing a debug version of the program, so the message is printed;.
std::deque< bit_lattice > create_bitstring_from_constant(integer_cst_t value, unsigned long long len, bool signed_value)
Creates a bitstring from a constant input.
boost::graph_traits< graph >::out_edge_iterator OutEdgeIterator
out_edge_iterator definition.
static std::string name_function(const tree_managerConstRef &tm, const unsigned int index)
Return the name of the function.
static const std::map< bit_lattice, std::map< bit_lattice, std::map< bit_lattice, std::deque< bit_lattice > > > > plus_expr_map
Map storing the implementation of the forward_transfer's plus_expr.
#define MEMCPY
constant string identifying the operation performed when two objects are memcopied.
#define PRINT_DBG_MEX(dbgLevel, curDbgLevel, mex)
We are producing a debug version of the program, so the message is printed;.
#define DEBUG_LEVEL_PEDANTIC
very verbose debugging print is performed.
Step successfully executed.
std::deque< bit_lattice > create_x_bitstring(size_t lenght)
Create a bitstring containing bits initialized at <X>
Definition of the node_info object for the basic_block graph.
#define GET_CLASS(obj)
Macro returning the actual type of an object.
BBGraphInfoRef GetBBGraphInfo()
Returns the property associated with the graph.
bool not_frontend
True if this step is not executed in the frontend.
Definition of the class representing a generic C application.
std::string GetName() const override
Return the name of this design step.
RelationshipType
The relationship type.
Source must be executed to satisfy target.
static bool isBetter(const std::string &a_string, const std::string &b_string)
static unsigned long long int align(unsigned long long int address, unsigned long long int alignment)
STL includes.
static bool is_natural(const tree_managerConstRef &TM, const unsigned int index)
Return true if the treenode is a ssa_name greater or equal to zero.
CustomOrderedMap< T, U > CustomMap
DesignFlowStep_Status InternalExec() override
perform the bit value analysis
#define D_SELECTOR
Selectors used only in basic block graphs; numbers continue from cdfg_edge_info.hpp.
Full implementation of Bit Value analysis as described in BitValue Inference: Detecting and Exploitin...
bool IsHandledByBitvalue(const tree_nodeConstRef &tn) const
Returns true if the type identified by type_id is handled by bitvalue analysis.
static const unsigned int EXIT_BLOCK_ID
constant identifying the exit basic block
void backward()
Applies the backward algorithm, as described in the paper, analyzing each assignment statement starti...
#define GET_INDEX_NODE(t)
Macro used to hide implementation details when accessing a tree_node from another tree_node...
Data structure describing a basic block at tree level.
unsigned int bb_version
The version of the basic block intermediate representation on which this step has been applied...
redefinition of map to manage ordered/unordered structures
static void get_required_values(std::vector< std::tuple< unsigned int, unsigned int >> &required, const tree_nodeRef &tn)
void print_bitstring_map(const CustomMap< unsigned int, std::deque< bit_lattice >> &map) const
Debugging function used to print the contents of the current and best maps.
#define STR(s)
Macro which performs a lexical_cast to a string.
Auxiliary methods for manipulating string.
bool HasToBeExecuted() const override
Check if this step has actually to be executed.
static void sign_reduce_bitstring(std::deque< bit_lattice > &bitstring, bool bitstring_is_signed)
Reduce the size of a bitstring erasing all but one most significant zeros in unsigned bitstring and a...
static const std::map< bit_lattice, std::map< bit_lattice, std::map< bit_lattice, std::deque< bit_lattice > > > > minus_expr_map
Map storing the implementation of the forward_transfer's minus_expr.
void forward()
Applies the forward algorithm, as described in the paper, analyzing each assignment statement followi...
static bool IsSignedIntegerType(const tree_nodeConstRef &type)
Return true if the treenode is of integer type.
CustomSet< unsigned int > signed_var
Set storing the signed ssa.
std::string bitstring_to_string(const std::deque< bit_lattice > &bitstring)
Translates a bitstring ( expressed as an std::deque of bit_lattice ) into a string of characters...
~Bit_Value() override
Destructor.
#define THROW_UNREACHABLE(str_expr)
helper function used to specify that some points should never be reached
Class used to describe a particular graph with basic blocks as nodes.
std::deque< bit_lattice > inf(const std::deque< bit_lattice > &a, const std::deque< bit_lattice > &b, const unsigned int output_uid) const
Computes the inf between two bitstrings.
unsigned long long pointer_resizing(unsigned int output_id) const
unsigned map[NUM_VERTICES]
absl::flat_hash_map< T, U, Hash, Eq, Alloc > CustomUnorderedMap
std::deque< bit_lattice > create_u_bitstring(size_t lenght)
Creates a bitstring containing bits initialized at <U>
unsigned int lsb_to_zero(const addr_expr *ae, bool safe) const
CustomMap< unsigned int, std::deque< bit_lattice > > current
Map of the current bit-values of each variable.
void Initialize() override
Initialize the step (i.e., like a constructor, but executed just before exec.
static const std::map< bit_lattice, std::map< bit_lattice, bit_lattice > > bit_and_expr_map
Map storing the implementation of the forward_transfer's bit_and_expr_map.
Information associated with the whole basic-block graph.
static const std::map< bit_lattice, std::map< bit_lattice, bit_lattice > > bit_ior_expr_map
Map storing the implementation of the forward_transfer's bit_ior_expr_map.
Target must be reexecuted.
redefinition of set to manage ordered/unordered structures
static unsigned long long size(const tree_managerConstRef tm, unsigned int index)
static const std::string ComputeSignature(const FrontendFlowStepType frontend_flow_step_type)
Compute the signature of a function frontend flow step.
boost::graph_traits< graph >::vertex_descriptor vertex
vertex definition.
const Wrefcount< const DesignFlowManager > design_flow_manager
The design flow manager.
#define GET_CONST_NODE(t)
static unsigned long long Size(const tree_nodeConstRef &t)
const ParameterConstRef parameters
Set of input parameters.
DesignFlowStep_Status
The status of a step.
bool update_IR()
Updates the bitvalues of the intermediate representation with the values taken from the input map...
void calculate_dominance_info(enum dominance::cdi_direction dir)
The main entry point into this module.
#define DEBUG_LEVEL_NONE
no debugging print is performed.
#define THROW_ERROR(str_expr)
helper function used to throw an error in a standard way
const tree_managerConstRef TM
bool HasToBeExecuted() const override
Check if this step has actually to be executed.
This struct specifies the block node.
This file collects some utility functions.
bool mix()
Mixes the content of current and best using the sup operation, storing the result in the best map...
void TopologicalSort(std::list< boost::graph_traits< graphs_collection >::vertex_descriptor > &sorted_vertices) const
Compute the topological order of the graph.
std::deque< bit_lattice > string_to_bitstring(const std::string &s)
inverse of bitstring_to_string
CustomUnorderedMapUnstable< unsigned int, unsigned int > direct_call_id_to_called_id
Maps the id of a gimple statement to the id of the function called in that statement.
void initialize()
Initializes best with C type as bitstring, signed_var and arguments using the information taken from ...
std::deque< bit_lattice > sup(const std::deque< bit_lattice > &a, const std::deque< bit_lattice > &b, const unsigned int output_uid) const
Computes the sup between two bitstrings.
refcount< T > lock() const
const unsigned int function_id
The index of the function to be analyzed.
const application_managerRef AppM
The application manager.
Class specification of the tree_reindex support class.
static const unsigned int ENTRY_BLOCK_ID
constant identifying the entry basic block
const CustomUnorderedSet< std::pair< FrontendFlowStepType, FunctionRelationship > > ComputeFrontendRelationships(const DesignFlowStep::RelationshipType relationship_type) const override
Return the set of analyses in relationship with this design step.
std::vector< blocRef > bb_topological
Topologically ordered basic blocks.
Class specification of the basic_block structure.
CustomMap< unsigned int, std::deque< bit_lattice > > best
Map of the best bit-values of each variable.
std::deque< bit_lattice > constructor_bitstring(const tree_nodeRef &ctor_tn, unsigned int ssa_node_id) const
auxiliary function used to build the bitstring lattice for read-only arrays
void clear()
Clean up the internal data structures.
const BBNodeInfoConstRef CGetBBNodeInfo(const vertex node) const
Return the info associated with a basic block.
Data structures used in operations graph.
Template borrowed from the ANTLR library by Terence Parr (http://www.jGuru.com - Software rights: htt...
static tree_nodeConstRef CGetType(const tree_nodeConstRef &node)
Return the treenode of the type of node.
static std::deque< bit_lattice > sign_extend_bitstring(const std::deque< bit_lattice > &bitstring, bool bitstring_is_signed, size_t final_size)
Extends a bitstring.
this class is used to manage the command-line or XML options.
unsigned int bitvalue_version
The version of the bitvalue information on which this step has been applied.
static unsigned int get_base_index(const tree_managerConstRef &TM, const unsigned int index)
Retrun the base address of a memory access.
void clear_current()
Clears all the entry in the current map, except for the input arguments.
static integer_cst_t GetConstValue(const tree_nodeConstRef &tn, bool is_signed=true)
Get value from integer constant.
int debug_level
The debug level.
CustomUnorderedSet< unsigned int > arguments
Contains the input parameters of the function that's being analyzed.
#define GET_INDEX_CONST_NODE(t)
#define CFG_SELECTOR
Control flow graph edge selector.
static tree_nodeConstRef GetFunctionReturnType(const tree_nodeConstRef &function, bool void_as_null=true)
Return the return type of a function.
static const std::map< bit_lattice, std::map< bit_lattice, bit_lattice > > bit_xor_expr_map
Map storing the implementation of the forward_transfer's bit_xor_expr_map.
Bit_Value(const ParameterConstRef Param, const application_managerRef AM, unsigned int f_id, const DesignFlowManagerConstRef dfm)
Constructor.
refcount< BBGraphInfo > BBGraphInfoRef
refcount definition of the class
This class contains the base representation for a generic frontend flow step which works on the whole...
Datastructure to represent memory information in high-level synthesis.
Class specification of the manager of the tree structures extracted from the raw file.
HLS specialization of generic_device.
A brief description of the C++ Header File.
const FunctionBehaviorRef function_behavior
The function behavior of the function to be analyzed.
This structure defines graphs where nodes are basic_blocks.
#define THROW_ASSERT(cond, str_expr)
helper function used to check an assert and if needed to throw an error in a standard way ...
Implementation of the wrapper to Gcc for C sources.