Jlm
ViewTests.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2024 David Metz <david.c.metz@ntnu.no>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #include <gtest/gtest.h>
7 
8 #include <jlm/hls/ir/hls.hpp>
9 #include <jlm/hls/util/view.hpp>
14 #include <jlm/rvsdg/lambda.hpp>
15 #include <jlm/rvsdg/theta.hpp>
16 #include <jlm/rvsdg/view.hpp>
17 
18 TEST(ViewTests, TestDumpDot)
19 {
20  std::cout << std::endl << "### Test dump_dot ###" << std::endl << std::endl;
21 
22  using namespace jlm;
23  using namespace jlm::hls;
24  using namespace jlm::llvm;
25 
26  // Arrange
27  auto b32 = rvsdg::BitType::Create(32);
28  auto ft = rvsdg::FunctionType::Create({}, { b32 });
29 
30  rvsdg::Graph graph;
31 
32  auto lambda = rvsdg::LambdaNode::Create(
33  graph.GetRootRegion(),
34  LlvmLambdaOperation::Create(ft, "f", Linkage::externalLinkage));
35 
36  auto bitConstant = &rvsdg::BitConstantOperation::create(*lambda->subregion(), { 32, 0 });
37 
38  auto f = lambda->finalize({ bitConstant });
40 
41  rvsdg::view(graph, stdout);
42 
43  std::unordered_map<rvsdg::Output *, ViewColors> outputColor;
44  std::unordered_map<rvsdg::Input *, ViewColors> inputColor;
45  std::unordered_map<rvsdg::Output *, ViewColors> tailLabel;
46 
47  // Act
48  auto dotOutput = ToDot(lambda->region(), outputColor, inputColor, tailLabel);
49 
50  // Assert
51  EXPECT_GT(dotOutput.size(), 0);
52  EXPECT_NE(dotOutput.find("digraph G {"), std::string::npos);
53  EXPECT_NE(dotOutput.find("subgraph cluster_"), std::string::npos);
54  EXPECT_NE(dotOutput.find("tooltip=\"bit32\""), std::string::npos);
55  EXPECT_NE(dotOutput.find("BITS32_0_"), std::string::npos);
56 }
57 
58 TEST(ViewTests, TestDumpDotTheta)
59 {
60  using namespace jlm;
61  using namespace jlm::hls;
62  using namespace jlm::llvm;
63 
64  // Arrange
65  auto b32 = rvsdg::BitType::Create(32);
66  auto ft = rvsdg::FunctionType::Create({ b32, b32, b32 }, { b32, b32, b32 });
67 
68  rvsdg::Graph graph;
69 
70  auto lambda = rvsdg::LambdaNode::Create(
71  graph.GetRootRegion(),
72  LlvmLambdaOperation::Create(ft, "f", Linkage::externalLinkage));
73 
74  auto theta = rvsdg::ThetaNode::create(lambda->subregion());
75  auto idv = theta->AddLoopVar(lambda->GetFunctionArguments()[0]);
76  auto lvs = theta->AddLoopVar(lambda->GetFunctionArguments()[1]);
77  auto lve = theta->AddLoopVar(lambda->GetFunctionArguments()[2]);
78 
79  auto arm = rvsdg::CreateOpNode<rvsdg::bitadd_op>({ idv.pre, lvs.pre }, 32).output(0);
80  auto cmp = rvsdg::CreateOpNode<rvsdg::bitult_op>({ arm, lve.pre }, 32).output(0);
81  auto & matchNode = rvsdg::MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);
82 
83  idv.post->divert_to(arm);
84  theta->set_predicate(matchNode.output(0));
85 
86  auto f = lambda->finalize({ theta->output(0), theta->output(1), theta->output(2) });
88 
89  rvsdg::view(graph, stdout);
90 
91  std::unordered_map<rvsdg::Output *, ViewColors> outputColor;
92  std::unordered_map<rvsdg::Input *, ViewColors> inputColor;
93  std::unordered_map<rvsdg::Output *, ViewColors> tailLabel;
94  // Act
95  auto dotOutput = ToDot(lambda->region(), outputColor, inputColor, tailLabel);
96 
97  // Assert
98  EXPECT_GT(dotOutput.size(), 0);
99  EXPECT_NE(dotOutput.find("digraph G {"), std::string::npos);
100  EXPECT_NE(dotOutput.find("subgraph cluster_"), std::string::npos);
101  EXPECT_NE(dotOutput.find("tooltip=\"bit32\""), std::string::npos);
102  EXPECT_NE(dotOutput.find("tooltip=\"ctl(2)\""), std::string::npos);
103 }
TEST(ViewTests, TestDumpDot)
Definition: ViewTests.cpp:18
static std::unique_ptr< LlvmLambdaOperation > Create(std::shared_ptr< const jlm::rvsdg::FunctionType > type, std::string name, const jlm::llvm::Linkage &linkage, jlm::llvm::CallingConvention callingConvention, jlm::llvm::AttributeSet attributes)
Definition: lambda.hpp:84
static Output & create(Region &region, BitValueRepresentation value)
Definition: constant.hpp:44
static std::shared_ptr< const BitType > Create(std::size_t nbits)
Creates bit type of specified width.
Definition: type.cpp:45
static std::shared_ptr< const FunctionType > Create(std::vector< std::shared_ptr< const jlm::rvsdg::Type >> argumentTypes, std::vector< std::shared_ptr< const jlm::rvsdg::Type >> resultTypes)
static GraphExport & Create(Output &origin, std::string name)
Definition: graph.cpp:62
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
Definition: lambda.cpp:140
static Node & CreateNode(Output &predicate, const std::unordered_map< uint64_t, uint64_t > &mapping, const uint64_t defaultAlternative, const size_t numAlternatives)
Definition: control.hpp:226
static ThetaNode * create(rvsdg::Region *parent)
Definition: theta.hpp:73
std::string ToDot(rvsdg::Region *region, std::unordered_map< rvsdg::Output *, ViewColors > &outputColor, std::unordered_map< rvsdg::Input *, ViewColors > &inputColor, std::unordered_map< rvsdg::Output *, ViewColors > &tailLabel)
Definition: view.cpp:424
Global memory state passed between functions.
std::string view(const rvsdg::Region *region)
Definition: view.cpp:142