PandA-2024.02
parallel_memory_fu_binding.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) 2015-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  */
42 
44 #include "Parameter.hpp"
45 
47 #include "structural_manager.hpp"
48 
50 #include "hls.hpp"
51 #include "hls_device.hpp"
52 
54 #include "omp_functions.hpp"
55 
58 
60 #include "generic_obj.hpp"
61 
63 #include <string>
64 
66 #include <list>
67 
69 #include "technology_manager.hpp"
70 #include "technology_node.hpp"
71 
73 #include "tree_manager.hpp"
74 #include "tree_node.hpp"
75 #include "tree_reindex.hpp"
76 
78 #include "dbgPrintHelper.hpp"
79 #include "utility.hpp"
80 
81 ParallelMemoryFuBinding::ParallelMemoryFuBinding(const HLS_managerConstRef _HLS_mgr, const unsigned int _function_id,
82  const ParameterConstRef _parameters)
83  : fu_binding(_HLS_mgr, _function_id, _parameters)
84 {
85  debug_level = parameters->get_class_debug_level(GET_CLASS(*this));
86 }
87 
89  structural_objectRef reset_port)
90 {
91  fu_binding::add_to_SM(HLSMgr, HLS, clock_port, reset_port);
92  const auto& parallelized_functions = GetPointer<const OmpFunctions>(HLSMgr->Rfuns)->parallelized_functions;
93  const auto& omp_for_wrappers = GetPointer<const OmpFunctions>(HLSMgr->Rfuns)->omp_for_wrappers;
94  const auto TM = HLS->HLS_D->get_technology_manager();
95  const auto memory_banks_number = parameters->getOption<unsigned int>(OPT_memory_banks_number);
96  const structural_managerRef SM = HLS->datapath;
97  const structural_objectRef circuit = SM->get_circ();
98  if(parallelized_functions.find(HLS->functionId) != parallelized_functions.end())
99  {
100  std::list<structural_objectRef> memory_enableds;
101  bool load_store_operation = [&]() -> bool {
102  for(const auto fu_index : get_allocation_list())
103  {
104  std::string channels_type =
105  GetPointer<const functional_unit>(allocation_information->get_fu(fu_index))->channels_type;
106  if(channels_type == CHANNELS_TYPE_MEM_ACC_P1N)
107  {
108  return true;
109  }
110  }
111  return false;
112  }();
114  for(unsigned int internal_object_id = 0;
115  internal_object_id < GetPointer<const module>(circuit)->get_internal_objects_size(); internal_object_id++)
116  {
117  const auto internal_object = GetPointer<const module>(circuit)->get_internal_object(internal_object_id);
118  const auto memory_enabled = internal_object->find_member("memory_enabled", port_o_K, internal_object);
119  if(memory_enabled)
120  {
121  memory_enableds.push_back(memory_enabled);
122  }
123  }
124  if(load_store_operation)
125  {
126  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "-->Adding ALLOW_MEM_ACCESS_FU for memory operations");
127  const auto allow_mem_access = SM->add_module_from_technology_library(
128  "allow_memory_access", "ALLOW_MEM_ACCESS_FU", LIBRARY_PC, circuit, TM);
129  const auto clock = allow_mem_access->find_member(CLOCK_PORT_NAME, port_o_K, allow_mem_access);
130  SM->add_connection(clock_port, clock);
131  const auto reset = allow_mem_access->find_member(RESET_PORT_NAME, port_o_K, allow_mem_access);
132  SM->add_connection(reset_port, reset);
133  const auto amaf_access_allowed = allow_mem_access->find_member("access_allowed", port_o_K, allow_mem_access);
134  GetPointer<port_o>(amaf_access_allowed)->add_n_ports(memory_banks_number, amaf_access_allowed);
135  HLS->Rfu->manage_extern_global_port(HLSMgr, HLS, SM, amaf_access_allowed, port_o::IN, circuit, 0);
136 
137  // start_port and done_port are connected in ParallelMemoryConnBinding::add_to_SM
138 
139  const auto memory_enabled = allow_mem_access->find_member("memory_enabled", port_o_K, allow_mem_access);
140  GetPointer<port_o>(memory_enabled)->add_n_ports(memory_banks_number, memory_enabled);
141  memory_enableds.push_back(memory_enabled);
142 
143  for(unsigned int internal_object_id = 0;
144  internal_object_id < GetPointer<const module>(circuit)->get_internal_objects_size(); internal_object_id++)
145  {
146  const auto internal_object = GetPointer<const module>(circuit)->get_internal_object(internal_object_id);
147  if(internal_object->get_typeRef()->id_type == "MEMORY_CTRL_P1N")
148  {
149  component_to_allow_mem_access[internal_object] = allow_mem_access;
150  }
151  }
152  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "<--Added ALLOW_MEM_ACCESS_FU for memory operations");
153  }
156  VertexIterator operation, operation_end;
157  for(boost::tie(operation, operation_end) = boost::vertices(*op_graph); operation != operation_end; operation++)
158  {
159  if((GET_TYPE(op_graph, *operation) & TYPE_ATOMIC) != 0)
160  {
161  atomics.insert(get(*operation)->get_structural_obj());
162  }
163  }
164  for(const auto& atomic : atomics)
165  {
167  "-->Adding ALLOW_MEM_ACCESS_FU for " + atomic->get_path());
168  const auto allow_mem_access = SM->add_module_from_technology_library(
169  "allow_memory_access_" + atomic->get_id(), "ALLOW_MEM_ACCESS_FU", LIBRARY_PC, circuit, TM);
170  component_to_allow_mem_access[atomic] = allow_mem_access;
171 
172  const auto clock = allow_mem_access->find_member(CLOCK_PORT_NAME, port_o_K, allow_mem_access);
173  SM->add_connection(clock_port, clock);
174  const auto reset = allow_mem_access->find_member(RESET_PORT_NAME, port_o_K, allow_mem_access);
175  SM->add_connection(reset_port, reset);
176  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "---Connected clock and reset");
177 
178  const auto amaf_access_allowed = allow_mem_access->find_member("access_allowed", port_o_K, allow_mem_access);
179  GetPointer<port_o>(amaf_access_allowed)->add_n_ports(memory_banks_number, amaf_access_allowed);
180  HLS->Rfu->manage_extern_global_port(HLSMgr, HLS, SM, amaf_access_allowed, port_o::IN, circuit, 0);
181  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "---Connected access allowed");
182 
183  // Done is connected in ParallelMemoryConnBinding::add_to_SM
184 
185  const auto memory_enabled = allow_mem_access->find_member("memory_enabled", port_o_K, allow_mem_access);
186  GetPointer<port_o>(memory_enabled)->add_n_ports(memory_banks_number, memory_enabled);
187  memory_enableds.push_back(memory_enabled);
188  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "---Resized memory enabled");
189 
190  // Op is connected in ParallelMemoryConnBinding::add_to_SM
191 
193  "<--Added ALLOW_MEM_ACCESS_FU for " + atomic->get_path());
194  }
196  if(memory_enableds.size())
197  {
199  "-->" + STR(memory_enableds.size()) + " memory enableds to be put in and");
200  size_t and_counter = 0;
201  size_t and_counter_sig = 0;
202  while(memory_enableds.size() > 1)
203  {
204  const auto first = memory_enableds.front();
205  memory_enableds.pop_front();
206  const auto first_signal = SM->add_sign_vector("memory_enabled_and_sign_" + STR(and_counter_sig),
207  memory_banks_number, circuit, first->get_typeRef());
208  SM->add_connection(first, first_signal);
209  and_counter_sig++;
210 
211  const auto second = memory_enableds.front();
212  memory_enableds.pop_front();
213  const auto second_signal = SM->add_sign_vector("memory_enabled_and_sign_" + STR(and_counter_sig),
214  memory_banks_number, circuit, second->get_typeRef());
215  SM->add_connection(second, second_signal);
216  and_counter_sig++;
217 
218  const auto and_port = SM->add_module_from_technology_library("memory_enabled_and_" + STR(and_counter),
219  "MEMORY_ENABLED_AND", LIBRARY_PC, circuit, TM);
220  const auto out_memory_enabled = and_port->find_member("memory_enabled", port_o_K, and_port);
221  GetPointer<port_o>(out_memory_enabled)->add_n_ports(memory_banks_number, out_memory_enabled);
222  and_counter++;
223 
224  const auto first_port = and_port->find_member("in1", port_o_K, and_port);
225  GetPointer<port_o>(first_port)->add_n_ports(memory_banks_number, first_port);
226  SM->add_connection(first_signal, first_port);
227 
228  const auto second_port = and_port->find_member("in2", port_o_K, and_port);
229  GetPointer<port_o>(second_port)->add_n_ports(memory_banks_number, second_port);
230  SM->add_connection(second_signal, second_port);
231 
232  memory_enableds.push_back(out_memory_enabled);
233  }
234  GetPointer<port_o>(memory_enableds.front())->set_is_memory(true);
235  GetPointer<port_o>(memory_enableds.front())->set_is_global(true);
236  GetPointer<port_o>(memory_enableds.front())->set_is_extern(true);
237  HLS->Rfu->manage_extern_global_port(HLSMgr, HLS, SM, memory_enableds.front(), port_o::OUT, circuit, 0);
238  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "<--Generated memory enabled and");
239  }
240  else
241  {
242  THROW_UNREACHABLE("");
243  }
244  }
245  else if(omp_for_wrappers.find(HLS->functionId) != omp_for_wrappers.end())
246  {
248  std::list<structural_objectRef> slaves;
249  std::list<structural_objectRef> memory_enableds;
251  for(unsigned int internal_object_id = 0;
252  internal_object_id < GetPointer<const module>(circuit)->get_internal_objects_size(); internal_object_id++)
253  {
254  const auto internal_object = GetPointer<const module>(circuit)->get_internal_object(internal_object_id);
255  const auto access_request = internal_object->find_member("access_request", port_o_K, internal_object);
256  if(access_request)
257  {
258  slaves.push_back(internal_object);
259  memory_enableds.push_back(internal_object->find_member("memory_enabled", port_o_K, internal_object));
260  }
261  }
262  size_t and_counter = 0;
263  size_t and_counter_sig = 0;
264  while(memory_enableds.size() > 1)
265  {
266  const auto first = memory_enableds.front();
267  memory_enableds.pop_front();
268  const auto first_signal = SM->add_sign_vector("memory_enabled_and_sign_" + STR(and_counter_sig),
269  memory_banks_number, circuit, first->get_typeRef());
270  SM->add_connection(first, first_signal);
271  and_counter_sig++;
272 
273  const auto second = memory_enableds.front();
274  memory_enableds.pop_front();
275  const auto second_signal = SM->add_sign_vector("memory_enabled_and_sign_" + STR(and_counter_sig),
276  memory_banks_number, circuit, second->get_typeRef());
277  SM->add_connection(second, second_signal);
278  and_counter_sig++;
279 
280  const auto and_port = SM->add_module_from_technology_library("memory_enabled_and_" + STR(and_counter),
281  "MEMORY_ENABLED_AND", LIBRARY_PC, circuit, TM);
282  const auto out_memory_enabled = and_port->find_member("memory_enabled", port_o_K, and_port);
283  GetPointer<port_o>(out_memory_enabled)->add_n_ports(memory_banks_number, out_memory_enabled);
284  and_counter++;
285 
286  const auto first_port = and_port->find_member("in1", port_o_K, and_port);
287  GetPointer<port_o>(first_port)->add_n_ports(memory_banks_number, first_port);
288  SM->add_connection(first_signal, first_port);
289 
290  const auto second_port = and_port->find_member("in2", port_o_K, and_port);
291  GetPointer<port_o>(second_port)->add_n_ports(memory_banks_number, second_port);
292  SM->add_connection(second_signal, second_port);
293 
294  memory_enableds.push_back(out_memory_enabled);
295  }
296  for(unsigned int memory_bank_index = 0; memory_bank_index < memory_banks_number; memory_bank_index++)
297  {
298  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "-->Considering memory bank " + STR(memory_bank_index));
299  const auto pt_rr_fu = SM->add_module_from_technology_library("pt_rr_fu_" + STR(memory_bank_index), "PT_FU_MEM",
300  LIBRARY_PC, circuit, TM);
301  // const auto clock = pt_rr_fu->find_member(CLOCK_PORT_NAME, port_o_K, pt_rr_fu);
302  // SM->add_connection(clock_port, clock);
303  // const auto reset = pt_rr_fu->find_member(RESET_PORT_NAME, port_o_K, pt_rr_fu);
304  // SM->add_connection(reset_port, reset);
305  const auto rops_so = pt_rr_fu->find_member("rops", port_o_K, pt_rr_fu);
306  THROW_ASSERT(rops_so, "");
307  const auto rops = GetPointer<port_o>(rops_so);
308  rops->add_n_ports(static_cast<unsigned int>(slaves.size()), rops_so);
309  const auto ops_so = pt_rr_fu->find_member("ops", port_o_K, pt_rr_fu);
310  THROW_ASSERT(ops_so, "");
311  const auto ops = GetPointer<port_o>(ops_so);
312  ops->add_n_ports(static_cast<unsigned int>(slaves.size()), ops_so);
313  const auto enable_so = pt_rr_fu->find_member("ENABLE", port_o_K, pt_rr_fu);
314  THROW_ASSERT(enable_so, "");
315 
316  unsigned int internal_object_id = 0;
317  for(const auto& slave : slaves)
318  {
319  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "-->Considering component " + slave->get_path());
320  THROW_ASSERT(slave->find_member("access_request", port_o_K, slave), "");
321  const auto int_access_request =
322  GetPointer<port_o>(slave->find_member("access_request", port_o_K, slave))->get_port(memory_bank_index);
323  const auto access_request_sign =
324  SM->add_sign("access_request_" + STR(internal_object_id) + "_" + STR(memory_bank_index), circuit,
325  int_access_request->get_typeRef());
326  const auto rop = rops->get_port(internal_object_id);
327  SM->add_connection(int_access_request, access_request_sign);
328  SM->add_connection(access_request_sign, rop);
329  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "---Connected access request");
330 
331  THROW_ASSERT(slave->find_member("access_allowed", port_o_K, slave), "");
332  const auto int_access_allowed =
333  GetPointer<port_o>(slave->find_member("access_allowed", port_o_K, slave))->get_port(memory_bank_index);
334  const auto access_allowed_sign =
335  SM->add_sign("access_allowed_" + STR(internal_object_id) + "_" + STR(memory_bank_index), circuit,
336  int_access_allowed->get_typeRef());
337  const auto op = ops->get_port(internal_object_id);
338  SM->add_connection(int_access_allowed, access_allowed_sign);
339  SM->add_connection(access_allowed_sign, op);
340  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "---Connected access allowed");
341 
342  internal_object_id++;
343  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "<--Considered component " + slave->get_path());
344  }
345  const auto int_enable = GetPointer<port_o>(memory_enableds.front())->get_port(memory_bank_index);
346  const auto enable_sign = SM->add_sign("enable_" + STR(memory_bank_index), circuit, int_enable->get_typeRef());
347  SM->add_connection(int_enable, enable_sign);
348  SM->add_connection(enable_sign, enable_so);
349  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "---Connected enabled");
350  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "<--Considered memory bank " + STR(memory_bank_index));
351  }
353  }
354  else
355  {
356  for(unsigned int internal_object_id = 0;
357  internal_object_id < GetPointer<const module>(circuit)->get_internal_objects_size(); internal_object_id++)
358  {
359  const auto internal_object = GetPointer<const module>(circuit)->get_internal_object(internal_object_id);
360  if(internal_object->get_typeRef()->id_type == "MEMORY_CTRL_P1N")
361  {
362  const auto access_allowed = internal_object->find_member("access_allowed", port_o_K, internal_object);
363  for(unsigned int memory_bank_index = 0; memory_bank_index < memory_banks_number; memory_bank_index++)
364  {
365  const auto constant = SM->add_constant("access_allowed_enabled_" + STR(memory_bank_index), circuit,
366  access_allowed->get_typeRef(), "1");
367  SM->add_connection(constant, GetPointer<port_o>(access_allowed)->get_port(memory_bank_index));
368  }
369  }
370  else
371  {
372  const auto access_allowed = internal_object->find_member("access_allowed", port_o_K, internal_object);
373  if(access_allowed)
374  {
375  for(unsigned int memory_bank_index = 0; memory_bank_index < memory_banks_number; memory_bank_index++)
376  {
377  const auto constant = SM->add_constant("access_allowed_enabled_" + internal_object->get_id() + "_" +
378  STR(memory_bank_index),
379  circuit, access_allowed->get_typeRef(), "1");
380  SM->add_connection(constant, GetPointer<port_o>(access_allowed)->get_port(memory_bank_index));
381  }
382  }
383  }
384  }
385  }
386 }
387 
389  const structural_managerRef SM, const structural_objectRef curr_gate,
390  unsigned int num)
391 {
392  const auto TM = HLSMgr->get_tree_manager();
393  const auto memory_enabled = curr_gate->find_member("memory_enabled", port_o_K, curr_gate);
394  if(memory_enabled)
395  {
396  GetPointerS<port_o>(memory_enabled)->set_is_memory(false);
397  GetPointerS<port_o>(memory_enabled)->set_is_global(false);
398  GetPointerS<port_o>(memory_enabled)->set_is_extern(false);
399  }
400  const auto& parallelized_functions = GetPointerS<const OmpFunctions>(HLSMgr->Rfuns)->parallelized_functions;
401  const auto fu_node = TM->GetFunction(curr_gate->get_typeRef()->id_type);
402  if(fu_node)
403  {
404  const auto fd = GetPointerS<const function_decl>(GET_CONST_NODE(fu_node));
405  if(fd->omp_atomic)
406  {
407  const auto access_allowed = curr_gate->find_member("access_allowed", port_o_K, curr_gate);
408  if(access_allowed)
409  {
410  access_allowed_killeds.insert(curr_gate);
411  GetPointerS<port_o>(access_allowed)->set_is_memory(false);
412  GetPointerS<port_o>(access_allowed)->set_is_global(false);
413  GetPointerS<port_o>(access_allowed)->set_is_extern(false);
414  }
415  }
416  }
417  if(parallelized_functions.find(HLS->functionId) == parallelized_functions.end())
418  {
419  const auto access_request = curr_gate->find_member("access_request", port_o_K, curr_gate);
420  if(access_request)
421  {
422  GetPointerS<port_o>(access_request)->set_is_memory(false);
423  GetPointerS<port_o>(access_request)->set_is_global(false);
424  GetPointerS<port_o>(access_request)->set_is_extern(false);
425  }
426  const auto access_allowed = curr_gate->find_member("access_allowed", port_o_K, curr_gate);
427  if(access_allowed)
428  {
429  access_allowed_killeds.insert(curr_gate);
430  GetPointerS<port_o>(access_allowed)->set_is_memory(false);
431  GetPointerS<port_o>(access_allowed)->set_is_global(false);
432  GetPointerS<port_o>(access_allowed)->set_is_extern(false);
433  }
434  }
435  return fu_binding::manage_module_ports(HLSMgr, HLS, SM, curr_gate, num);
436 }
#define DEBUG_LEVEL_VERY_PEDANTIC
extremely verbose debugging print is performed.
#define INDENT_DBG_MEX(dbgLevel, curDbgLevel, mex)
We are producing a debug version of the program, so the message is printed;.
int debug_level
The debug level.
Definition: fu_binding.hpp:121
#define GET_TYPE(data, vertex_index)
Helper macro returning the type associated with a node.
File containing functions and utilities to support the printing of debug messagges.
structural_managerRef datapath
Store the datapath description.
Definition: hls.hpp:155
#define GET_CLASS(obj)
Macro returning the actual type of an object.
void reset()
Definition: adpcm.c:540
const HLS_deviceRef HLS_D
reference to the information representing the target for the synthesis
Definition: hls.hpp:107
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...
void add_to_SM(const HLS_managerRef HLSMgr, const hlsRef HLS, structural_objectRef clock_port, structural_objectRef reset_port) override
Instance the functional unit inside the structural representation of the datapath.
bool manage_module_ports(const HLS_managerRef HLSMgr, const hlsRef HLS, const structural_managerRef SM, const structural_objectRef curr_gate, unsigned int num) override
virtual void add_to_SM(const HLS_managerRef HLSMgr, const hlsRef HLS, structural_objectRef clock_port, structural_objectRef reset_port)
Instance the functional unit inside the structural representation of the datapath.
Definition: fu_binding.cpp:551
virtual void manage_extern_global_port(const HLS_managerRef HLSMgr, const hlsRef HLS, const structural_managerRef SM, structural_objectRef port_in, unsigned int dir, structural_objectRef circuit, unsigned int num)
Class specification of the manager of the technology library data structures.
static technology_nodeRef get_fu(const std::string &fu_name, const HLS_managerConstRef hls_manager)
Returns the technology_node associated with the given operation.
#define STR(s)
Macro which performs a lexical_cast to a string.
Base class for all resources into datapath.
#define CLOCK_PORT_NAME
standard name for ports
#define CHANNELS_TYPE_MEM_ACC_P1N
#define THROW_UNREACHABLE(str_expr)
helper function used to specify that some points should never be reached
Definition: exceptions.hpp:292
fu_bindingRef Rfu
Store the refcounted functional unit binding of the operations.
Definition: hls.hpp:121
const OpGraphConstRef op_graph
The operation graph.
Definition: fu_binding.hpp:112
This class specifies the characteristic of a particular operation working on a given functional unit...
#define TYPE_ATOMIC
Constant identifying an atomic operation.
Definition: op_graph.hpp:207
Class specification of the data structures used to manage technology information. ...
Data structure used to store the functional-unit binding of the vertices.
#define GET_CONST_NODE(t)
Definition: tree_node.hpp:347
#define LIBRARY_PC
standard library for parallel controller
boost::graph_traits< graph >::vertex_iterator VertexIterator
vertex_iterator definition.
Definition: graph.hpp:1307
Classes specification of the tree_node data structures.
This package is used by all HLS packages to manage resource constraints and characteristics.
This file collects some utility functions and macros.
std::list< unsigned int > get_allocation_list() const
Returns the set of allocated unit.
Definition: fu_binding.cpp:221
AllocationInformationRef allocation_information
allocation manager. Used to retrieve the string name of the functional units.
Definition: fu_binding.hpp:106
std::string id_type
Original type id of the structural object.
virtual bool manage_module_ports(const HLS_managerRef HLSMgr, const hlsRef HLS, const structural_managerRef SM, const structural_objectRef curr_gate, unsigned int num)
const structural_type_descriptorRef & get_typeRef() const
Return the type descriptor of the structural_object.
Class specification of the tree_reindex support class.
ParallelMemoryFuBinding(const HLS_managerConstRef HLS_mgr, const unsigned int function_id, const ParameterConstRef parameters)
Constructor.
Template borrowed from the ANTLR library by Terence Parr (http://www.jGuru.com - Software rights: htt...
Definition: refcount.hpp:94
this class is used to manage the command-line or XML options.
unsigned int functionId
this is the identifier of the function to be implemented
Definition: hls.hpp:87
#define RESET_PORT_NAME
Class implementation of the structural_manager.
Class managing the functional-unit binding.
Definition: fu_binding.hpp:90
const ParameterConstRef parameters
The set of input parameters.
Definition: fu_binding.hpp:118
Datastructure to describe functions allocation in high-level synthesis.
Data structure definition for high-level synthesis flow.
Class specification of the manager of the tree structures extracted from the raw file.
HLS specialization of generic_device.
CustomSet< structural_objectRef > access_allowed_killeds
Internal objects for which access_allowed was killed.
#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
CustomMap< structural_objectRef, structural_objectRef > component_to_allow_mem_access
For each component, the corresponding ALLOW_MEM_ACCESS_FU.

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