Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion jlm/hls/Makefile.sub
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,15 @@ libhls_SOURCES = \
jlm/hls/backend/rvsdg2rhls/rvsdg2rhls.cpp \
jlm/hls/backend/rvsdg2rhls/ThetaConversion.cpp \
jlm/hls/backend/rvsdg2rhls/UnusedStateRemoval.cpp \
\
jlm/hls/backend/rvsdg2rhls/static/ThetaConversion.cpp \
jlm/hls/backend/rvsdg2rhls/static/rvsdg2rhls.cpp \
\
jlm/hls/ir/hls.cpp \
\
jlm/hls/ir/static-hls.cpp \
jlm/hls/ir/static/loop.cpp \
jlm/hls/ir/static/fsm.cpp \
\
jlm/hls/util/view.cpp \

libhls_HEADERS = \
Expand Down Expand Up @@ -70,7 +76,13 @@ libhls_HEADERS = \
jlm/hls/backend/rvsdg2rhls/ThetaConversion.hpp \
jlm/hls/backend/rvsdg2rhls/UnusedStateRemoval.hpp \
\
jlm/hls/backend/rvsdg2rhls/static/ThetaConversion.hpp \
jlm/hls/backend/rvsdg2rhls/static/rvsdg2rhls.hpp \
\
jlm/hls/ir/hls.hpp \
jlm/hls/ir/static-hls.hpp \
jlm/hls/ir/static/loop.hpp \
jlm/hls/ir/static/fsm.hpp \
\
jlm/hls/util/view.hpp \

Expand All @@ -81,6 +93,8 @@ libhls_TESTS += \
tests/jlm/hls/backend/rvsdg2rhls/TestTheta \
tests/jlm/hls/backend/rvsdg2rhls/UnusedStateRemovalTests \
tests/jlm/hls/backend/rvsdg2rhls/test-loop-passthrough \
\
tests/jlm/hls/backend/rvsdg2rhls/static/TestTheta \

libhls_TEST_LIBS += \
libjlmtest \
Expand Down
123 changes: 123 additions & 0 deletions jlm/hls/backend/rvsdg2rhls/static/ThetaConversion.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
/*
* Copyright 2024 Louis Maurin <louis7maurin@gmail.com>
* See COPYING for terms of redistribution.
*/

#include <jlm/hls/backend/rvsdg2rhls/static/ThetaConversion.hpp>
#include <jlm/rvsdg/substitution.hpp>
#include <jlm/rvsdg/traverser.hpp>

#include <jlm/hls/ir/static/loop.hpp>

namespace jlm::static_hls
{

void
addSimpleNodes(jlm::rvsdg::region & region, jlm::static_hls::loop_node & loop)
{
for (auto & node : jlm::rvsdg::topdown_traverser(&region))
{
// FIXME now we only handle simple nodes
if (dynamic_cast<const jlm::rvsdg::simple_node *>(node))
{
loop.add_node(node);
}
else
{
JLM_UNREACHABLE("Static HLS only support simple nodes in theta node at this point");
}
}
}

static void
ConvertThetaNode(jlm::rvsdg::theta_node & theta)
{
std::cout << "***** Converting theta node *****" << std::endl;

auto loop = static_hls::loop_node::create(theta.region());

// add loopvars and populate the smap
for (size_t i = 0; i < theta.ninputs(); i++)
{
loop->add_loopvar(theta.input(i));
// divert theta outputs
theta.output(i)->divert_users(loop->output(i));
}

// copy contents of theta
addSimpleNodes(*theta.subregion(), *loop);

for (size_t i = 0; i < theta.ninputs(); i++)
{
loop->add_loopback_arg(theta.input(i));
}

loop->print_nodes_registers();

std::cout << "**** Printing operations users ****" << std::endl;
for (auto & node : loop->compute_subregion()->nodes)
{
for (size_t i = 0; i < node.ninputs(); i++)
{
std::cout << "node " << node.operation().debug_string();
std::cout << " input " << i;
std::cout << " users: ";
auto users = loop->get_users(node.input(i));
for (auto & user : users)
{
if (auto node_out = dynamic_cast<jlm::rvsdg::node_output *>(user))
{
std::cout << node_out->node()->operation().debug_string() << ", ";
}
else if (auto arg = dynamic_cast<jlm::rvsdg::argument *>(user))
{
std::cout << "control arg " << arg->index() << ", ";
}
}
std::cout << std::endl;
}
}

loop->finalize();

// // copy contents of theta
// theta.subregion()->copy(loop->subregion(), smap, false, false);
remove(&theta);
}

static void
ConvertThetaNodesInRegion(jlm::rvsdg::region & region);

static void
ConvertThetaNodesInStructuralNode(jlm::rvsdg::structural_node & structuralNode)
{
for (size_t n = 0; n < structuralNode.nsubregions(); n++)
{
ConvertThetaNodesInRegion(*structuralNode.subregion(n));
}

if (auto thetaNode = dynamic_cast<jlm::rvsdg::theta_node *>(&structuralNode))
{
ConvertThetaNode(*thetaNode);
}
}

static void
ConvertThetaNodesInRegion(jlm::rvsdg::region & region)
{
for (auto & node : jlm::rvsdg::topdown_traverser(&region))
{
if (auto structuralNode = dynamic_cast<jlm::rvsdg::structural_node *>(node))
{
ConvertThetaNodesInStructuralNode(*structuralNode);
}
}
}

void
ConvertThetaNodes(jlm::llvm::RvsdgModule & rvsdgModule)
{
ConvertThetaNodesInRegion(*rvsdgModule.Rvsdg().root());
}

}
21 changes: 21 additions & 0 deletions jlm/hls/backend/rvsdg2rhls/static/ThetaConversion.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*
* Copyright 2024 Louis Maurin <louis7maurin@gmail.com>
* See COPYING for terms of redistribution.
*/

#ifndef JLM_HLS_BACKEND_RVSDG2RHLS_STATIC_THETACONVERSION_HPP
#define JLM_HLS_BACKEND_RVSDG2RHLS_STATIC_THETACONVERSION_HPP

#include <jlm/hls/ir/static-hls.hpp>
#include <jlm/llvm/ir/RvsdgModule.hpp>
#include <jlm/rvsdg/theta.hpp>

namespace jlm::static_hls
{

void
ConvertThetaNodes(jlm::llvm::RvsdgModule & rvsdgModule);

} // namespace jlm::static_hls

#endif // JLM_HLS_BACKEND_RVSDG2RHLS_STATIC_THETACONVERSION_HPP
21 changes: 21 additions & 0 deletions jlm/hls/backend/rvsdg2rhls/static/rvsdg2rhls.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*
* Copyright 2024 Louis Maurin <louis7maurin@gmail.com>
* See COPYING for terms of redistribution.
*/

#include <jlm/hls/backend/rvsdg2rhls/static/rvsdg2rhls.hpp>
#include <jlm/hls/backend/rvsdg2rhls/static/ThetaConversion.hpp>
#include <jlm/rvsdg/traverser.hpp>

namespace jlm::static_hls
{

using namespace jlm::static_hls;

void
rvsdg2rhls(llvm::RvsdgModule & rvsdgModule)
{
ConvertThetaNodes(rvsdgModule);
}

} // namespace jlm::static_hls
20 changes: 20 additions & 0 deletions jlm/hls/backend/rvsdg2rhls/static/rvsdg2rhls.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright 2024 Louis Maurin <louis7maurin@gmail.com>
* See COPYING for terms of redistribution.
*/

#ifndef JLM_HLS_BACKEND_RVSDG2RHLS_STATIC_RVSDG2RHLS_HPP
#define JLM_HLS_BACKEND_RVSDG2RHLS_STATIC_RVSDG2RHLS_HPP

#include <jlm/llvm/ir/operators/operators.hpp>
#include <jlm/llvm/ir/RvsdgModule.hpp>

namespace jlm::static_hls
{

void
rvsdg2rhls(llvm::RvsdgModule & rvsdgModule);

}

#endif // JLM_HLS_BACKEND_RVSDG2RHLS_STATIC_RVSDG2RHLS_HPP
52 changes: 52 additions & 0 deletions jlm/hls/ir/static-hls.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* Copyright 2024 Louis Maurin <louis7maurin@gmail.com>
* See COPYING for terms of redistribution.
*/

#include <jlm/hls/ir/static-hls.hpp>

namespace jlm::static_hls
{

jlm::rvsdg::node *
mux_add_input(jlm::rvsdg::node * old_mux, jlm::rvsdg::output * new_input, bool predicate)
{
JLM_ASSERT(jlm::rvsdg::is<jlm::static_hls::mux_op>(old_mux->operation()));

// If the input already exists, return the old mux
// FIXME and add to the fsm
for (size_t i = 0; i < old_mux->ninputs(); i++)
{
if (old_mux->input(i)->origin() == new_input)
{
return old_mux;
}
}

std::vector<jlm::rvsdg::output *> new_mux_inputs;
for (size_t i = 0; i < old_mux->ninputs(); i++)
{
new_mux_inputs.push_back(old_mux->input(i)->origin());
}

jlm::rvsdg::simple_node * new_mux;
if (!predicate)
{
new_mux_inputs.push_back(new_input);

new_mux = jlm::static_hls::mux_op::create(new_mux_inputs);
}
else
{
new_mux = jlm::static_hls::mux_op::create(*new_input, new_mux_inputs);
}

old_mux->output(0)->divert_users(new_mux->output(0));

remove(old_mux);

// old_mux = static_cast<jlm::rvsdg::node*>(new_mux);
return new_mux;
};

} // namespace jlm::static_hls
Loading