PandA-2024.02
top_entity_parallel_cs.cpp
Go to the documentation of this file.
1 /*
2  *
3  * _/_/_/ _/_/ _/ _/ _/_/_/ _/_/
4  * _/ _/ _/ _/ _/_/ _/ _/ _/ _/ _/
5  * _/_/_/ _/_/_/_/ _/ _/_/ _/ _/ _/_/_/_/
6  * _/ _/ _/ _/ _/ _/ _/ _/ _/
7  * _/ _/ _/ _/ _/ _/_/_/ _/ _/
8  *
9  * ***********************************************
10  * PandA Project
11  * URL: http://panda.dei.polimi.it
12  * Politecnico di Milano - DEIB
13  * System Architectures Group
14  * ***********************************************
15  * Copyright (c) 2016-2024 Politecnico di Milano
16  *
17  * This file is part of the PandA framework.
18  *
19  * The PandA framework is free software; you can redistribute it and/or modify
20  * it under the terms of the GNU General Public License as published by
21  * the Free Software Foundation; either version 3 of the License, or
22  * (at your option) any later version.
23  *
24  * This program is distributed in the hope that it will be useful,
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27  * GNU General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License
30  * along with this program. If not, see <http://www.gnu.org/licenses/>.
31  *
32  */
41 #include "BambuParameter.hpp"
42 #include "behavioral_helper.hpp"
43 #include "copyrights_strings.hpp"
44 #include "hls.hpp"
45 #include "hls_device.hpp"
46 #include "hls_manager.hpp"
47 #include "loop.hpp"
48 #include "loops.hpp"
49 #include "memory.hpp"
50 #include "structural_manager.hpp"
51 #include "structural_objects.hpp"
52 #include "technology_manager.hpp"
53 #include "technology_node.hpp"
54 #include "tree_helper.hpp"
55 #include "tree_node.hpp"
56 
58 #include "call_graph_manager.hpp"
59 
61 #include <cmath>
62 #include <string>
63 
65 #include "custom_set.hpp"
66 #include <tuple>
67 
69 #include "dbgPrintHelper.hpp"
70 #include "math_function.hpp"
71 #include "utility.hpp"
72 
74  unsigned int _funId,
75  const DesignFlowManagerConstRef _design_flow_manager,
76  const HLSFlowStep_Type _hls_flow_step_type)
77  : top_entity(_parameters, _HLSMgr, _funId, _design_flow_manager, _hls_flow_step_type)
78 {
79  debug_level = parameters->get_class_debug_level(GET_CLASS(*this));
80 }
81 
83 
86 {
88  switch(relationship_type)
89  {
91  {
94  break;
95  }
97  {
98  break;
99  }
101  {
102  break;
103  }
104  default:
105  THROW_UNREACHABLE("");
106  }
107  return ret;
108 }
109 
111 {
113  const FunctionBehaviorConstRef FB = HLSMgr->CGetFunctionBehavior(funId);
114  const std::string function_name = FB->CGetBehavioralHelper()->get_function_name();
115  std::string module_name = function_name;
116  const auto top_functions = HLSMgr->CGetCallGraphManager()->GetRootFunctions();
117  bool is_top = top_functions.find(funId) != top_functions.end();
118  if(is_top)
119  {
120  module_name = "_" + function_name;
121  }
122 
125  THROW_ASSERT(HLS->datapath, "Datapath not created");
126 
127  // reference to hls top circuit
129  SM = HLS->top;
130  structural_managerRef Datapath = HLS->datapath;
131 
133  PRINT_DBG_MEX(DEBUG_LEVEL_VERBOSE, debug_level, "Top circuit creation");
134 
136  structural_type_descriptorRef module_type =
139  SM->set_top_info(module_name, module_type);
140  structural_objectRef circuit = SM->get_circ();
141  THROW_ASSERT(circuit, "Top circuit is missing");
142  // Now the top circuit is created, just as an empty box. <circuit> is a reference to the structural object that
143  // will contain all the circuit components
144 
145  circuit->set_black_box(false);
146 
148  GetPointer<module>(circuit)->set_description("Top component for " + function_name);
149  GetPointer<module>(circuit)->set_copyright(GENERATED_COPYRIGHT);
150  GetPointer<module>(circuit)->set_authors("Component automatically generated by bambu");
151  GetPointer<module>(circuit)->set_license(GENERATED_LICENSE);
152 
153  structural_objectRef datapath_circuit = Datapath->get_circ();
154  THROW_ASSERT(datapath_circuit, "Missing datapath circuit");
155 
156  PRINT_DBG_MEX(DEBUG_LEVEL_VERBOSE, debug_level, "Creating datapath object");
157  std::string parallel_controller_model = "__controller_parallel";
158  std::string parallel_controller_name = "__controller_parallel";
159  std::string par_ctrl_library = HLS->HLS_D->get_technology_manager()->get_library(parallel_controller_model);
160  structural_objectRef controller_circuit =
161  SM->add_module_from_technology_library(parallel_controller_name, parallel_controller_model, par_ctrl_library,
162  circuit, HLS->HLS_D->get_technology_manager());
163  controller_circuit->set_owner(circuit);
164  auto loopBW = BW_loop_iter(circuit);
165  resize_controller_parallel(controller_circuit, loopBW);
166  THROW_ASSERT(controller_circuit, "Missing controller circuit");
167 
168  PRINT_DBG_MEX(DEBUG_LEVEL_VERBOSE, debug_level, "Creating datapath object");
170  PRINT_DBG_MEX(DEBUG_LEVEL_VERBOSE, debug_level, "Adding datapath");
171  datapath_circuit->set_owner(circuit);
172  GetPointer<module>(circuit)->add_internal_object(datapath_circuit);
173 
176 
177  PRINT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "\tStart adding clock signal...");
179  structural_objectRef clock_obj = SM->add_port(CLOCK_PORT_NAME, port_o::IN, circuit, bool_type);
180  GetPointer<port_o>(clock_obj)->set_is_clock(true);
182  structural_objectRef datapath_clock = datapath_circuit->find_member(CLOCK_PORT_NAME, port_o_K, datapath_circuit);
183  SM->add_connection(datapath_clock, clock_obj);
184  structural_objectRef controller_clock =
185  controller_circuit->find_member(CLOCK_PORT_NAME, port_o_K, controller_circuit);
186  SM->add_connection(controller_clock, clock_obj);
187  PRINT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "\tClock signal added!");
188 
189  PRINT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "\tAdding reset signal...");
191  structural_objectRef reset_obj = SM->add_port(RESET_PORT_NAME, port_o::IN, circuit, bool_type);
193  structural_objectRef datapath_reset = datapath_circuit->find_member(RESET_PORT_NAME, port_o_K, datapath_circuit);
194  SM->add_connection(datapath_reset, reset_obj);
196  structural_objectRef controller_reset =
197  controller_circuit->find_member(RESET_PORT_NAME, port_o_K, controller_circuit);
198  SM->add_connection(controller_reset, reset_obj);
199  PRINT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "\tReset signal added!");
200 
201  PRINT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "\tAdding start signal...");
203  structural_objectRef start_obj = SM->add_port(START_PORT_NAME, port_o::IN, circuit, bool_type);
204  structural_objectRef controller_start =
205  controller_circuit->find_member(START_PORT_NAME, port_o_K, controller_circuit);
207  SM->add_connection(start_obj, controller_start);
208  PRINT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "\tStart signal added!");
209 
210  PRINT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "\tStart adding Done signal...");
212  structural_objectRef done_obj = SM->add_port(DONE_PORT_NAME, port_o::OUT, circuit, bool_type);
213  THROW_ASSERT(done_obj, "Done port not added in the top component");
214  structural_objectRef controller_done = controller_circuit->find_member(DONE_PORT_NAME, port_o_K, controller_circuit);
215  THROW_ASSERT(controller_done, "Done signal not found in the controller");
216  if(HLS->registered_done_port && (parameters->getOption<HLSFlowStep_Type>(OPT_controller_architecture) ==
218  parameters->getOption<HLSFlowStep_Type>(OPT_controller_architecture) ==
220  parameters->getOption<HLSFlowStep_Type>(OPT_controller_architecture) ==
222  {
223  const technology_managerRef TM = HLS->HLS_D->get_technology_manager();
224  std::string delay_unit;
225  auto reset_type = parameters->getOption<std::string>(OPT_reset_type);
226  if(reset_type == "sync")
227  {
228  delay_unit = flipflop_SR;
229  }
230  else
231  {
232  delay_unit = flipflop_AR;
233  }
234  structural_objectRef delay_gate =
235  SM->add_module_from_technology_library("done_delayed_REG", delay_unit, LIBRARY_STD, circuit, TM);
236  structural_objectRef port_ck = delay_gate->find_member(CLOCK_PORT_NAME, port_o_K, delay_gate);
237  if(port_ck)
238  {
239  SM->add_connection(clock_obj, port_ck);
240  }
241  structural_objectRef port_rst = delay_gate->find_member(RESET_PORT_NAME, port_o_K, delay_gate);
242  if(port_rst)
243  {
244  SM->add_connection(reset_obj, port_rst);
245  }
246 
247  structural_objectRef done_signal_in = SM->add_sign("done_delayed_REG_signal_in", circuit,
248  GetPointer<module>(delay_gate)->get_in_port(2)->get_typeRef());
249  SM->add_connection(GetPointer<module>(delay_gate)->get_in_port(2), done_signal_in);
250  SM->add_connection(controller_done, done_signal_in);
251  structural_objectRef done_signal_out = SM->add_sign(
252  "done_delayed_REG_signal_out", circuit, GetPointer<module>(delay_gate)->get_out_port(0)->get_typeRef());
253  SM->add_connection(GetPointer<module>(delay_gate)->get_out_port(0), done_signal_out);
254  SM->add_connection(done_obj, done_signal_out);
255  }
256  else
257  {
258  SM->add_connection(controller_done, done_obj);
259  }
260  PRINT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "\tDone signal added!");
261 
263 
264  PRINT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "\tAdding input/output ports...");
265  this->add_ports(circuit, clock_obj, reset_obj);
266  PRINT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "\tInput/output ports added!");
267 
268  connect_port_parallel(circuit, loopBW);
269 
271 
272  PRINT_DBG_MEX(DEBUG_LEVEL_VERBOSE, debug_level, "Circuit created without errors!");
273 
275 }
276 
278 {
279  const FunctionBehaviorConstRef FB = HLSMgr->CGetFunctionBehavior(funId);
280  circuit->find_member("__controller_parallel", component_o_K, circuit);
281 
282  integer_cst_t n = 0;
283  const auto listLoops = FB->CGetLoops()->GetList();
284  for(const auto& loop : listLoops)
285  {
286  if(loop->GetId() != 0)
287  {
288  n = loop->upper_bound;
289  }
290  }
291  if(n != 0)
292  {
293  auto loopBW = 1ull + ceil_log2(static_cast<unsigned long long>(n));
294  return loopBW;
295  }
296  else
297  {
298  for(const auto& loop : listLoops)
299  {
300  if(loop->GetId() != 0)
301  {
302  THROW_ASSERT(loop->upper_bound_tn, "unexpected condition");
303  return tree_helper::Size(loop->upper_bound_tn);
304  }
305  }
306  }
307  THROW_ERROR("unexpected condition");
308  return 0;
309 }
310 
311 void top_entity_parallel_cs::connect_loop_iter(const structural_objectRef circuit, unsigned long long loopBW)
312 {
313  const FunctionBehaviorConstRef FB = HLSMgr->CGetFunctionBehavior(funId);
315  structural_objectRef controller_circuit = circuit->find_member("__controller_parallel", component_o_K, circuit);
316 
317  integer_cst_t n = 0;
318  const auto listLoops = FB->CGetLoops()->GetList();
319  for(const auto& loop : listLoops)
320  {
321  if(loop->GetId() != 0)
322  {
323  n = loop->upper_bound;
324  }
325  }
326  if(n != 0)
327  {
328  structural_objectRef constant(new constant_o(parameters->getOption<int>(OPT_debug_level), circuit, STR(n)));
329  structural_type_descriptorRef constant_type =
331  constant->set_type(constant_type);
332  GetPointer<module>(SM->get_circ())->add_internal_object(constant);
333  structural_objectRef controller_Loop_Iter =
334  controller_circuit->find_member("LoopIteration", port_o_K, controller_circuit);
335  THROW_ASSERT(controller_Loop_Iter, "unexpected condition");
336  SM->add_connection(constant, controller_Loop_Iter);
337  return;
338  }
339  else
340  {
341  for(const auto& loop : listLoops)
342  {
343  if(loop->GetId() != 0)
344  {
345  std::string name_Loop_Upper_Bound = BH->PrintVariable(loop->upper_bound_tn->index);
346  structural_objectRef port_Loop_Iter = circuit->find_member(name_Loop_Upper_Bound, port_o_K, circuit);
347  structural_objectRef controller_Loop_Iter =
348  controller_circuit->find_member("LoopIteration", port_o_K, controller_circuit);
349  THROW_ASSERT(controller_Loop_Iter, "unexpected condition");
350  SM->add_connection(port_Loop_Iter, controller_Loop_Iter);
351  return;
352  }
353  }
354  }
355  THROW_ERROR("unexpected condition");
356 }
357 
359  unsigned long long loopBW)
360 {
361  auto num_kernel = parameters->getOption<unsigned int>(OPT_num_accelerators);
362  structural_objectRef controller_done_request =
363  controller_circuit->find_member(STR(DONE_REQUEST) + "_accelerator", port_vector_o_K, controller_circuit);
364  GetPointer<port_o>(controller_done_request)->add_n_ports(num_kernel, controller_done_request);
365  structural_objectRef controller_done_port =
366  controller_circuit->find_member(STR(DONE_PORT_NAME) + "_accelerator", port_vector_o_K, controller_circuit);
367  GetPointer<port_o>(controller_done_port)->add_n_ports(num_kernel, controller_done_port);
368  structural_objectRef controller_start_port =
369  controller_circuit->find_member(STR(START_PORT_NAME) + "_accelerator", port_vector_o_K, controller_circuit);
370  GetPointer<port_o>(controller_start_port)->add_n_ports(num_kernel, controller_start_port);
371 
372  structural_objectRef controller_request = controller_circuit->find_member("request", port_o_K, controller_circuit);
373  GetPointer<port_o>(controller_request)->type_resize(loopBW);
374  structural_objectRef controller_LoopIteration =
375  controller_circuit->find_member("LoopIteration", port_o_K, controller_circuit);
376  GetPointer<port_o>(controller_LoopIteration)->type_resize(loopBW);
377 }
378 
379 void top_entity_parallel_cs::connect_port_parallel(const structural_objectRef circuit, unsigned long long loopBW)
380 {
381  structural_managerRef Datapath = HLS->datapath;
382  structural_objectRef datapath_circuit = Datapath->get_circ();
383  structural_objectRef controller_circuit = circuit->find_member("__controller_parallel", component_o_K, circuit);
385  auto num_slots = parameters->getOption<unsigned int>(OPT_num_accelerators);
388 
389  structural_objectRef controller_task_pool_end =
390  controller_circuit->find_member(STR(TASKS_POOL_END), port_o_K, controller_circuit);
391  structural_objectRef datapath_task_pool_end =
392  datapath_circuit->find_member(STR(TASKS_POOL_END), port_o_K, datapath_circuit);
393  structural_objectRef task_pool_end_sign = SM->add_sign(STR(TASKS_POOL_END) + "_signal", circuit, bool_type);
394  SM->add_connection(datapath_task_pool_end, task_pool_end_sign);
395  SM->add_connection(task_pool_end_sign, controller_task_pool_end);
396 
397  structural_objectRef datapath_done_request =
398  datapath_circuit->find_member(STR(DONE_REQUEST) + "_accelerator", port_vector_o_K, datapath_circuit);
399  structural_objectRef controller_done_request =
400  controller_circuit->find_member(STR(DONE_REQUEST) + "_accelerator", port_vector_o_K, controller_circuit);
401  structural_objectRef done_request_sign =
402  SM->add_sign_vector(STR(DONE_REQUEST) + "_accelerator" + "_signal", num_slots, circuit, bool_type);
403  SM->add_connection(datapath_done_request, done_request_sign);
404  SM->add_connection(done_request_sign, controller_done_request);
405 
406  structural_objectRef datapath_done_port =
407  datapath_circuit->find_member(STR(DONE_PORT_NAME) + "_accelerator", port_vector_o_K, datapath_circuit);
408  structural_objectRef controller_done_port =
409  controller_circuit->find_member(STR(DONE_PORT_NAME) + "_accelerator", port_vector_o_K, controller_circuit);
410  structural_objectRef done_port_sign =
411  SM->add_sign_vector(STR(DONE_PORT_NAME) + "_accelerator" + "_signal", num_slots, circuit, bool_type);
412  SM->add_connection(datapath_done_port, done_port_sign);
413  SM->add_connection(done_port_sign, controller_done_port);
414 
415  structural_objectRef datapath_start_port =
416  datapath_circuit->find_member(STR(START_PORT_NAME) + "_accelerator", port_vector_o_K, datapath_circuit);
417  structural_objectRef controller_start_port =
418  controller_circuit->find_member(STR(START_PORT_NAME) + "_accelerator", port_vector_o_K, controller_circuit);
419  structural_objectRef done_start_sign =
420  SM->add_sign_vector(STR(START_PORT_NAME) + "_accelerator" + "_signal", num_slots, circuit, bool_type);
421  SM->add_connection(controller_start_port, done_start_sign);
422  SM->add_connection(done_start_sign, datapath_start_port);
423 
424  structural_objectRef datapath_request = datapath_circuit->find_member("request", port_o_K, datapath_circuit);
425  structural_objectRef controller_request = controller_circuit->find_member("request", port_o_K, controller_circuit);
426  structural_objectRef request_sign = SM->add_sign("request_signal", circuit, data_type);
427  SM->add_connection(controller_request, request_sign);
428  SM->add_connection(request_sign, datapath_request);
429 
430  connect_loop_iter(circuit, loopBW);
431 }
static void propagate_memory_parameters(const structural_objectRef src, const structural_managerRef tgt)
Propagates the memory parameters from the source (innermost) module to the target (outermost) one...
Definition: memory.cpp:654
void add_connection(structural_objectRef src, structural_objectRef dest)
Create a connection between a source structural object and a destination structural object...
structural_managerRef SM
reference to the resulting circuit
Definition: top_entity.hpp:54
#define TASKS_POOL_END
#define DEBUG_LEVEL_VERY_PEDANTIC
extremely verbose debugging print is performed.
const HLS_managerRef HLSMgr
information about all the HLS synthesis
Definition: hls_step.hpp:205
Data structure representing the entire HLS information.
refcount< structural_type_descriptor > structural_type_descriptorRef
RefCount type definition of the structural_type_descriptor class structure.
File containing functions and utilities to support the printing of debug messagges.
#define PRINT_DBG_MEX(dbgLevel, curDbgLevel, mex)
We are producing a debug version of the program, so the message is printed;.
#define DONE_REQUEST
structural_managerRef datapath
Store the datapath description.
Definition: hls.hpp:155
#define START_PORT_NAME
Structure representing the most relevant information about the type of a structural object...
#define GET_CLASS(obj)
Macro returning the actual type of an object.
void connect_loop_iter(const structural_objectRef circuit, unsigned long long loopBW)
std::string get_function_name() const
Return the name of the function.
void resize_controller_parallel(structural_objectRef controller_circuit, unsigned long long loopBW)
resize_controller_parallel
#define GENERATED_LICENSE
const structural_objectRef get_circ() const
Get a reference to circ field.
void set_owner(const structural_objectRef new_owner)
set the owner of the structural object
RelationshipType
The relationship type.
Source must be executed to satisfy target.
mathematical utility function not provided by standard libraries
const unsigned int funId
identifier of the function to be processed (0 means that it is a global step)
This class manages the circuit structures.
const HLS_deviceRef HLS_D
reference to the information representing the target for the synthesis
Definition: hls.hpp:107
void add_ports(structural_objectRef circuit, structural_objectRef clock_port, structural_objectRef reset_port)
Adds the input/output ports to the circuit.
Definition: top_entity.cpp:355
virtual structural_objectRef find_member(const std::string &id, so_kind type, const structural_objectRef owner) const =0
Return the object named id of a given type which belongs to or it is associated with the object...
Class specification of the manager of the technology library data structures.
#define STR(s)
Macro which performs a lexical_cast to a string.
#define CLOCK_PORT_NAME
standard name for ports
structural_managerRef top
Store the top description.
Definition: hls.hpp:164
#define THROW_UNREACHABLE(str_expr)
helper function used to specify that some points should never be reached
Definition: exceptions.hpp:292
T ceil_log2(T x)
Return the smallest n such that 2**n >= X.
static unsigned long long Size(const tree_nodeConstRef &tn)
Return the size of a tree object.
void set_top_info(const std::string &id, const technology_managerRef &LM, const std::string &Library="")
#define DONE_PORT_NAME
HLSFlowStep_Type
Definition: hls_step.hpp:95
Class specification of the data structures used to manage technology information. ...
static structural_objectRef add_port(const std::string &id, port_o::port_direction pdir, structural_objectRef owner, structural_type_descriptorRef type_descr, unsigned int treenode=0)
Create a new port.
DesignFlowStep_Status InternalExec() override
Add selector and suspension.
const CustomUnorderedSet< std::tuple< HLSFlowStep_Type, HLSFlowStepSpecializationConstRef, HLSFlowStep_Relationship > > ComputeHLSRelationships(const DesignFlowStep::RelationshipType relationship_type) const override
Return the set of analyses in relationship with this design step.
#define flipflop_AR
flipflop with asynchronous reset
redefinition of set to manage ordered/unordered structures
#define LIBRARY_STD
standard library where all built-in ports are defined.
void set_black_box(bool bb)
Set the black box property associated with the structural_object.
~top_entity_parallel_cs() override
Destructor.
const BehavioralHelperConstRef CGetBehavioralHelper() const
Returns the helper associated with the function.
Classes specification of the tree_node data structures.
const ParameterConstRef parameters
Set of input parameters.
DesignFlowStep_Status
The status of a step.
This file collects some utility functions and macros.
#define THROW_ERROR(str_expr)
helper function used to throw an error in a standard way
Definition: exceptions.hpp:263
std::string PrintVariable(unsigned int var) const
Print the name of the variable associated to the index.
refcount< structural_manager > structural_managerRef
RefCount type definition of the structural_manager class structure.
This file collects some utility functions.
structural_objectRef add_module_from_technology_library(const std::string &id, const std::string &fu_name, const std::string &library_name, const structural_objectRef owner, const technology_managerConstRef TM)
Create a new object starting from a library component.
Definition: APInt.hpp:53
bool registered_done_port
true when the done port is registered
Definition: hls.hpp:149
This class describes all classes used to represent a structural object.
static structural_objectRef add_sign(std::string id, structural_objectRef owner, structural_type_descriptorRef sign_type, unsigned int treenode=0)
Create a new signal.
hlsRef HLS
HLS data structure of the function to be analyzed.
interface of a loop
Template borrowed from the ANTLR library by Terence Parr (http://www.jGuru.com - Software rights: htt...
Definition: refcount.hpp:94
const LoopsConstRef CGetLoops() const
Return the loops.
interface of loops finding algorithm
It collects all the common strings covering PandA copyrights issues.
void connect_port_parallel(const structural_objectRef circuit, unsigned long long loopBW)
connect_port_parallel connect datapath and controller
#define RESET_PORT_NAME
Wrapper to call graph.
Class implementation of the structural_manager.
int debug_level
The debug level.
refcount< const HLSFlowStepSpecialization > HLSFlowStepSpecializationConstRef
const refcount definition of the class
Definition: hls_step.hpp:93
This class describes a constant value.
unsigned long long BW_loop_iter(const structural_objectRef circuit)
top_entity_parallel_cs(const ParameterConstRef _parameters, const HLS_managerRef HLSMgr, unsigned int funId, const DesignFlowManagerConstRef design_flow_manager, const HLSFlowStep_Type _hls_flow_step_type)
behavior include
#define flipflop_SR
flipflop with synchronous reset
#define DEBUG_LEVEL_VERBOSE
verbose debugging print is performed.
Data structure definition for high-level synthesis flow.
#define GENERATED_COPYRIGHT
Datastructure to represent memory information in high-level synthesis.
HLS specialization of generic_device.
void set_type(const structural_type_descriptorRef &s)
Set the type of the structural_object.
static structural_objectRef add_sign_vector(std::string id, unsigned int n_signs, structural_objectRef owner, structural_type_descriptorRef sign_type, unsigned int treenode=0)
#define THROW_ASSERT(cond, str_expr)
helper function used to check an assert and if needed to throw an error in a standard way ...
Definition: exceptions.hpp:289

Generated on Mon Feb 12 2024 13:02:53 for PandA-2024.02 by doxygen 1.8.13