Jlm
json-hls.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2021 David Metz <david.c.metz@ntnu.no>
3  * See COPYING for terms of redistribution.
4  */
5 
8 
9 namespace jlm::hls
10 {
11 
12 std::string
14 {
15  std::ostringstream json;
16  const auto & ln = *get_hls_lambda(rm);
17  auto function_name = dynamic_cast<llvm::LlvmLambdaOperation &>(ln.GetOperation()).name();
18  auto file_name = get_base_file_name(rm);
19  json << "{\n";
20 
21  auto reg_args = get_reg_args(ln);
22  auto reg_results = get_reg_results(ln);
23 
24  json << "\"addr_width\": " << GetPointerSizeInBits() << ",\n";
25  json << "\"arguments\": [";
26  for (size_t i = 0; i < reg_args.size(); ++i)
27  {
28  // don't generate ports for state edges
29  if (reg_args[i]->Type()->Kind() == rvsdg::TypeKind::State)
30  continue;
31  if (i != 0)
32  {
33  json << ", ";
34  }
35  json << JlmSize(reg_args[i]->Type().get());
36  }
37  json << "],\n";
38  json << "\"results\": [";
39  for (size_t i = 0; i < reg_results.size(); ++i)
40  {
41  // don't generate ports for state edges
42  if (reg_results[i]->Type()->Kind() == rvsdg::TypeKind::State)
43  continue;
44  if (i != 0)
45  {
46  json << ", ";
47  }
48  json << JlmSize(reg_results[i]->Type().get());
49  }
50  json << "],\n";
51  // TODO: memory ports
52  auto mem_reqs = get_mem_reqs(ln);
53  auto mem_resps = get_mem_resps(ln);
54  json << "\"mem\": [";
55  for (size_t i = 0; i < mem_reqs.size(); ++i)
56  {
57  if (i != 0)
58  {
59  json << ", ";
60  }
61  auto req_bt = std::dynamic_pointer_cast<const BundleType>(mem_reqs[i]->Type());
62  auto resp_bt = std::dynamic_pointer_cast<const BundleType>(mem_resps[i]->Type());
63  auto size = JlmSize(&*resp_bt->get_element_type("data"));
64  auto has_write = req_bt->get_element_type("write") != nullptr;
65  json << "{ \"size\": " << size << ", \"has_write\": " << has_write << "}";
66  }
67  json << "]\n";
68  json << "}\n";
69  return json.str();
70 }
71 
72 } // namespace jlm::hls
std::vector< rvsdg::RegionArgument * > get_reg_args(const rvsdg::LambdaNode &lambda)
Definition: base-hls.hpp:112
std::vector< rvsdg::RegionResult * > get_reg_results(const rvsdg::LambdaNode &lambda)
Definition: base-hls.hpp:130
std::vector< rvsdg::RegionResult * > get_mem_reqs(const rvsdg::LambdaNode &lambda)
Definition: base-hls.hpp:93
static int JlmSize(const jlm::rvsdg::Type *type)
Definition: base-hls.cpp:110
const rvsdg::LambdaNode * get_hls_lambda(llvm::LlvmRvsdgModule &rm)
Definition: base-hls.cpp:136
std::vector< rvsdg::RegionArgument * > get_mem_resps(const rvsdg::LambdaNode &lambda)
Definition: base-hls.hpp:75
static std::string get_base_file_name(const llvm::LlvmRvsdgModule &rm)
Definition: base-hls.cpp:151
std::string GetText(llvm::LlvmRvsdgModule &rm) override
Definition: json-hls.cpp:13
Lambda operation.
Definition: lambda.hpp:30
size_t GetPointerSizeInBits()
Definition: hls.cpp:396
@ State
Designate a state type.