本文整理汇总了C++中nodecl::NodeclBase::get_locus_str方法的典型用法代码示例。如果您正苦于以下问题:C++ NodeclBase::get_locus_str方法的具体用法?C++ NodeclBase::get_locus_str怎么用?C++ NodeclBase::get_locus_str使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类nodecl::NodeclBase
的用法示例。
在下文中一共展示了NodeclBase::get_locus_str方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: unhandled_node
int SuitableAlignmentVisitor::unhandled_node(const Nodecl::NodeclBase& n)
{
WARNING_MESSAGE( "Suitable Alignment Visitor: Unknown node '%s' at '%s'\n",
ast_print_node_type( n.get_kind( ) ), n.get_locus_str( ).c_str( ) );
return -1;
}
示例2: gen_hls_wrapper
/*
* Create wrapper function for HLS to unpack streamed arguments
*
*/
Nodecl::NodeclBase DeviceFPGA::gen_hls_wrapper(const Symbol &func_symbol, ObjectList<OutlineDataItem*>& data_items)
{
//Check that we are calling a function task (this checking may be performed earlyer in the code)
if (!func_symbol.is_function())
{
running_error("Only function-tasks are supperted at this moment");
}
Scope fun_scope = func_symbol.get_scope();
// const ObjectList<Symbol> ¶m_list = func_symbol.get_function_parameters();
/*
* FIXME We suppose that all the input or the output arrays
* are of the same type
* Otherwise we must convert (~cast, raw type conversion) for each type
*/
/*
* The wrapper function must have:
* An input and an output parameters
* with respective pragmas needed for streaming
* For each scalar parameter, another scalar patameter
* IN THE SAME ORDER AS THE ORIGINAL FUNCTION as long as we are generating
* scalar parameter passing based on original function task parameters
*/
//Source wrapper_params;
std::string in_dec, out_dec;
get_inout_decl(data_items, in_dec, out_dec);
Source pragmas_src;
//call to task_has_scalars is not the optimal, but it is much more simple and readable
//than checking inside another loop
if (task_has_scalars(data_items))
{
pragmas_src
<< "#pragma HLS resource core=AXI_SLAVE variable=return metadata=\"-bus_bundle AXIlite\" "
<< "port_map={{ap_start START} {ap_done DONE} {ap_idle IDLE} {ap_return RETURN}}\n";
;
}
Source args;
if (in_dec != "")
{
args << in_dec << hls_in;
//add stream parameter pragma
pragmas_src
<< "#pragma HLS resource core=AXI4Stream variable=" << hls_in << "\n"
<< "#pragma HLS interface ap_fifo port=" << hls_in << "\n"
;
}
if (out_dec != "")
{
args.append_with_separator(out_dec + hls_out, ",");
pragmas_src
<< "#pragma HLS resource core=AXI4Stream variable=" << hls_out << "\n"
<< "#pragma HLS interface ap_fifo port=" << hls_out << "\n"
;
}
/*
* Generate wrapper code
* We are going to keep original parameter name for the original function
*
* input/outlut parameters are received concatenated one after another.
* The wrapper must create local variables for each input/output and unpack
* streamed input/output data into that local variables.
*
* Scalar parameters are going to be copied as long as no unpacking is needed
*/
Source copies_src;
Source in_copies, out_copies;
Source fun_params;
Source local_decls;
int in_offset = 0;
int out_offset = 0;
for (ObjectList<OutlineDataItem*>::iterator it = data_items.begin();
it != data_items.end();
it++)
{
fun_params.append_with_separator((*it)->get_field_name(), ",");
const std::string &field_name = (*it)->get_field_name();
const Scope &scope = (*it)->get_symbol().get_scope();
const ObjectList<OutlineDataItem::CopyItem> &copies = (*it)->get_copies();
if (!copies.empty())
{
Nodecl::NodeclBase expr = copies.front().expression;
if (copies.size() > 1)
{
internal_error("Only one copy per object (in/out/inout) is allowed (%s)",
expr.get_locus_str().c_str());
}
/*
* emit copy code
* - Create local variable (known size in compile time)
* - Create create copy loop + update param offset
*/
//.........这里部分代码省略.........
示例3: reduction_initialization_code
void LoweringVisitor::reduction_initialization_code(
OutlineInfo& outline_info,
Nodecl::NodeclBase ref_tree,
Nodecl::NodeclBase construct)
{
ERROR_CONDITION(ref_tree.is_null(), "Invalid tree", 0);
if (!Nanos::Version::interface_is_at_least("master", 5023))
{
running_error("%s: error: a newer version of Nanos++ (>=5023) is required for reductions support\n",
construct.get_locus_str().c_str());
}
TL::ObjectList<OutlineDataItem*> reduction_items = outline_info.get_data_items().filter(
predicate(lift_pointer(functor(&OutlineDataItem::is_reduction))));
ERROR_CONDITION (reduction_items.empty(), "No reductions to process", 0);
Source result;
Source reduction_declaration,
thread_initializing_reduction_info,
thread_fetching_reduction_info;
result
<< reduction_declaration
<< "{"
<< as_type(get_bool_type()) << " red_single_guard;"
<< "nanos_err_t err;"
<< "err = nanos_enter_sync_init(&red_single_guard);"
<< "if (err != NANOS_OK)"
<< "nanos_handle_error(err);"
<< "if (red_single_guard)"
<< "{"
<< "int nanos_num_threads = nanos_omp_get_num_threads();"
<< thread_initializing_reduction_info
<< "err = nanos_release_sync_init();"
<< "if (err != NANOS_OK)"
<< "nanos_handle_error(err);"
<< "}"
<< "else"
<< "{"
<< "err = nanos_wait_sync_init();"
<< "if (err != NANOS_OK)"
<< "nanos_handle_error(err);"
<< thread_fetching_reduction_info
<< "}"
<< "}"
;
for (TL::ObjectList<OutlineDataItem*>::iterator it = reduction_items.begin();
it != reduction_items.end();
it++)
{
std::string nanos_red_name = "nanos_red_" + (*it)->get_symbol().get_name();
std::pair<OpenMP::Reduction*, TL::Type> reduction_info = (*it)->get_reduction_info();
OpenMP::Reduction* reduction = reduction_info.first;
TL::Type reduction_type = reduction_info.second;
if (reduction_type.is_any_reference())
reduction_type = reduction_type.references_to();
TL::Type reduction_element_type = reduction_type;
if (IS_FORTRAN_LANGUAGE)
{
while (reduction_element_type.is_fortran_array())
reduction_element_type = reduction_element_type.array_element();
}
else
{
while (reduction_element_type.is_array())
reduction_element_type = reduction_element_type.array_element();
}
Source element_size;
if (IS_FORTRAN_LANGUAGE)
{
if (reduction_type.is_fortran_array())
{
// We need to parse this bit in Fortran
Source number_of_bytes;
number_of_bytes << "SIZE(" << (*it)->get_symbol().get_name() << ") * " << reduction_element_type.get_size();
element_size << as_expression(number_of_bytes.parse_expression(construct));
}
else
{
element_size << "sizeof(" << as_type(reduction_type) << ")";
}
}
else
{
element_size << "sizeof(" << as_type(reduction_type) << ")";
}
reduction_declaration
<< "nanos_reduction_t* " << nanos_red_name << ";"
;
Source allocate_private_buffer, cleanup_code;
//.........这里部分代码省略.........