Skip to content

Commit

Permalink
Merge branch 'master' into hls-avoid-extra-constant
Browse files Browse the repository at this point in the history
  • Loading branch information
sjalander authored Feb 1, 2025
2 parents efe2b7a + 2bf6956 commit a89fed1
Show file tree
Hide file tree
Showing 278 changed files with 8,353 additions and 7,729 deletions.
20 changes: 20 additions & 0 deletions .github/workflows/DefaultCache.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: DefaultCache

on:
push:
branches: [ master ]

jobs:
DefaultCache:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: "Install dependencies"
uses: ./.github/actions/InstallPackages
with:
install-llvm: true
install-clang: true
- name: "Build CIRCT to generate cache"
uses: ./.github/actions/BuildCirct
- name: "Build MLIR to generate cache"
uses: ./.github/actions/BuildMlirDialect
1 change: 1 addition & 0 deletions jlm/hls/Makefile.sub
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ 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/util/ViewTests \

libhls_TEST_LIBS += \
libjlmtest \
Expand Down
15 changes: 8 additions & 7 deletions jlm/hls/backend/rhls2firrtl/RhlsToFirrtlConverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ RhlsToFirrtlConverter::MlirGenSimpleNode(const jlm::rvsdg::SimpleNode * node)
{
pointeeType = nullptr;
}
else if (auto arrayType = dynamic_cast<const llvm::arraytype *>(pointeeType))
else if (auto arrayType = dynamic_cast<const llvm::ArrayType *>(pointeeType))
{
pointeeType = &arrayType->element_type();
}
Expand Down Expand Up @@ -1235,7 +1235,7 @@ RhlsToFirrtlConverter::MlirGenHlsLocalMem(const jlm::rvsdg::SimpleNode * node)
auto oneBitValue = GetConstant(body, 1, 1);

// memory
auto arraytype = std::dynamic_pointer_cast<const llvm::arraytype>(lmem_op->result(0));
auto arraytype = std::dynamic_pointer_cast<const llvm::ArrayType>(lmem_op->result(0));
size_t depth = arraytype->nelements();
auto dataType = GetFirrtlType(&arraytype->element_type());
::llvm::SmallVector<mlir::Type> memTypes;
Expand Down Expand Up @@ -2746,7 +2746,7 @@ RhlsToFirrtlConverter::createInstances(
auto clock = body->getArgument(0);
auto reset = body->getArgument(1);
std::unordered_map<jlm::rvsdg::SimpleNode *, circt::firrtl::InstanceOp> instances;
for (const auto node : jlm::rvsdg::topdown_traverser(subRegion))
for (const auto node : rvsdg::TopDownTraverser(subRegion))
{
if (auto sn = dynamic_cast<jlm::rvsdg::SimpleNode *>(node))
{
Expand Down Expand Up @@ -2813,13 +2813,14 @@ RhlsToFirrtlConverter::TraceStructuralOutput(rvsdg::StructuralOutput * output)

// Emit a circuit
circt::firrtl::CircuitOp
RhlsToFirrtlConverter::MlirGen(const llvm::lambda::node * lambdaNode)
RhlsToFirrtlConverter::MlirGen(const rvsdg::LambdaNode * lambdaNode)
{

// Ensure consistent naming across runs
create_node_names(lambdaNode->subregion());
// The same name is used for the circuit and main module
auto moduleName = Builder_->getStringAttr(lambdaNode->name() + "_lambda_mod");
auto moduleName = Builder_->getStringAttr(
dynamic_cast<llvm::LlvmLambdaOperation &>(lambdaNode->GetOperation()).name() + "_lambda_mod");
// Create the top level FIRRTL circuit
auto circuit = Builder_->create<circt::firrtl::CircuitOp>(Builder_->getUnknownLoc(), moduleName);
// The body will be populated with a list of modules
Expand Down Expand Up @@ -3977,7 +3978,7 @@ RhlsToFirrtlConverter::GetModuleName(const rvsdg::Node * node)
{
pointeeType = nullptr;
}
else if (auto arrayType = dynamic_cast<const llvm::arraytype *>(pointeeType))
else if (auto arrayType = dynamic_cast<const llvm::ArrayType *>(pointeeType))
{
pointeeType = &arrayType->element_type();
}
Expand Down Expand Up @@ -4017,7 +4018,7 @@ RhlsToFirrtlConverter::GetModuleName(const rvsdg::Node * node)
{
append.append("_S");
append.append(std::to_string(
std::dynamic_pointer_cast<const llvm::arraytype>(op->result(0))->nelements()));
std::dynamic_pointer_cast<const llvm::ArrayType>(op->result(0))->nelements()));
append.append("_L");
size_t loads = rvsdg::input::GetNode(**node->output(0)->begin())->noutputs();
append.append(std::to_string(loads));
Expand Down
2 changes: 1 addition & 1 deletion jlm/hls/backend/rhls2firrtl/RhlsToFirrtlConverter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class RhlsToFirrtlConverter : public BaseHLS
operator=(RhlsToFirrtlConverter &&) = delete;

circt::firrtl::CircuitOp
MlirGen(const llvm::lambda::node * lamdaNode);
MlirGen(const rvsdg::LambdaNode * lamdaNode);

void
WriteModuleToFile(const circt::firrtl::FModuleOp fModuleOp, const rvsdg::Node * node);
Expand Down
7 changes: 4 additions & 3 deletions jlm/hls/backend/rhls2firrtl/base-hls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <jlm/hls/backend/rhls2firrtl/base-hls.hpp>

#include <algorithm>
#include <cmath>

namespace jlm::hls
{
Expand Down Expand Up @@ -110,7 +111,7 @@ BaseHLS::JlmSize(const jlm::rvsdg::Type * type)
{
return bt->nbits();
}
else if (auto at = dynamic_cast<const llvm::arraytype *>(type))
else if (auto at = dynamic_cast<const llvm::ArrayType *>(type))
{
return JlmSize(&at->element_type()) * at->nelements();
}
Expand Down Expand Up @@ -158,11 +159,11 @@ BaseHLS::create_node_names(rvsdg::Region * r)
}
}

const jlm::llvm::lambda::node *
const jlm::rvsdg::LambdaNode *
BaseHLS::get_hls_lambda(llvm::RvsdgModule & rm)
{
auto region = &rm.Rvsdg().GetRootRegion();
auto ln = dynamic_cast<const llvm::lambda::node *>(region->Nodes().begin().ptr());
auto ln = dynamic_cast<const rvsdg::LambdaNode *>(region->Nodes().begin().ptr());
if (region->nnodes() == 1 && ln)
{
return ln;
Expand Down
10 changes: 5 additions & 5 deletions jlm/hls/backend/rhls2firrtl/base-hls.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class BaseHLS
static std::string
get_port_name(jlm::rvsdg::output * port);

const llvm::lambda::node *
const rvsdg::LambdaNode *
get_hls_lambda(llvm::RvsdgModule & rm);

void
Expand All @@ -81,7 +81,7 @@ class BaseHLS
* @return the arguments that represent memory responses
*/
std::vector<rvsdg::RegionArgument *>
get_mem_resps(const llvm::lambda::node & lambda)
get_mem_resps(const rvsdg::LambdaNode & lambda)
{
std::vector<rvsdg::RegionArgument *> mem_resps;
for (auto arg : lambda.subregion()->Arguments())
Expand All @@ -99,7 +99,7 @@ class BaseHLS
* @return the results that represent memory requests
*/
std::vector<rvsdg::RegionResult *>
get_mem_reqs(const llvm::lambda::node & lambda)
get_mem_reqs(const rvsdg::LambdaNode & lambda)
{
std::vector<rvsdg::RegionResult *> mem_resps;
for (auto result : lambda.subregion()->Results())
Expand All @@ -118,7 +118,7 @@ class BaseHLS
* @return the arguments of the lambda that represent kernel inputs
*/
std::vector<rvsdg::RegionArgument *>
get_reg_args(const llvm::lambda::node & lambda)
get_reg_args(const rvsdg::LambdaNode & lambda)
{
std::vector<rvsdg::RegionArgument *> args;
for (auto argument : lambda.subregion()->Arguments())
Expand All @@ -136,7 +136,7 @@ class BaseHLS
* @return the results of the lambda that represent the kernel outputs
*/
std::vector<rvsdg::RegionResult *>
get_reg_results(const llvm::lambda::node & lambda)
get_reg_results(const rvsdg::LambdaNode & lambda)
{
std::vector<rvsdg::RegionResult *> results;
for (auto result : lambda.subregion()->Results())
Expand Down
12 changes: 6 additions & 6 deletions jlm/hls/backend/rhls2firrtl/dot-hls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ DotHLS::loop_to_dot(hls::loop_node * ln)
}
}

for (auto node : jlm::rvsdg::topdown_traverser(sr))
for (auto node : rvsdg::TopDownTraverser(sr))
{
if (dynamic_cast<jlm::rvsdg::SimpleNode *>(node))
{
Expand Down Expand Up @@ -246,7 +246,7 @@ DotHLS::loop_to_dot(hls::loop_node * ln)

// all loop muxes at one level
dot << "{rank=same ";
for (auto node : jlm::rvsdg::topdown_traverser(sr))
for (auto node : rvsdg::TopDownTraverser(sr))
{
auto mx = dynamic_cast<const hls::mux_op *>(&node->GetOperation());
auto lc = dynamic_cast<const hls::loop_constant_buffer_op *>(&node->GetOperation());
Expand All @@ -258,7 +258,7 @@ DotHLS::loop_to_dot(hls::loop_node * ln)
dot << "}\n";
// all loop branches at one level
dot << "{rank=same ";
for (auto node : jlm::rvsdg::topdown_traverser(sr))
for (auto node : rvsdg::TopDownTraverser(sr))
{
auto br = dynamic_cast<const hls::branch_op *>(&node->GetOperation());
if (br && br->loop)
Expand All @@ -270,7 +270,7 @@ DotHLS::loop_to_dot(hls::loop_node * ln)

dot << "}\n";
// do edges outside in order not to pull other nodes into the cluster
for (auto node : jlm::rvsdg::topdown_traverser(sr))
for (auto node : rvsdg::TopDownTraverser(sr))
{
if (dynamic_cast<jlm::rvsdg::SimpleNode *>(node))
{
Expand Down Expand Up @@ -305,7 +305,7 @@ DotHLS::prepare_loop_out_port(hls::loop_node * ln)

auto sr = ln->subregion();
// just translate outputs
for (auto node : jlm::rvsdg::topdown_traverser(sr))
for (auto node : rvsdg::TopDownTraverser(sr))
{
if (dynamic_cast<jlm::rvsdg::SimpleNode *>(node))
{
Expand Down Expand Up @@ -386,7 +386,7 @@ DotHLS::subregion_to_dot(rvsdg::Region * sr)
output_map[sr->argument(i)] = get_port_name(sr->argument(i));
}
// process nodes
for (auto node : jlm::rvsdg::topdown_traverser(sr))
for (auto node : rvsdg::TopDownTraverser(sr))
{
if (dynamic_cast<jlm::rvsdg::SimpleNode *>(node))
{
Expand Down
2 changes: 1 addition & 1 deletion jlm/hls/backend/rhls2firrtl/json-hls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ JsonHLS::GetText(llvm::RvsdgModule & rm)
{
std::ostringstream json;
const auto & ln = *get_hls_lambda(rm);
auto function_name = ln.name();
auto function_name = dynamic_cast<llvm::LlvmLambdaOperation &>(ln.GetOperation()).name();
auto file_name = get_base_file_name(rm);
json << "{\n";

Expand Down
13 changes: 7 additions & 6 deletions jlm/hls/backend/rhls2firrtl/verilator-harness-hls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ ConvertToCType(const rvsdg::Type * type)
{
return "void*";
}
if (auto t = dynamic_cast<const llvm::arraytype *>(type))
if (auto t = dynamic_cast<const llvm::ArrayType *>(type))
{
return ConvertToCType(&t->element_type()) + "*";
}
Expand All @@ -41,9 +41,9 @@ ConvertToCType(const rvsdg::Type * type)
* @return the return type of the kernel as written in C, or nullopt if it has no return value.
*/
std::optional<std::string>
GetReturnTypeAsC(const llvm::lambda::node & kernel)
GetReturnTypeAsC(const rvsdg::LambdaNode & kernel)
{
const auto & results = kernel.type().Results();
const auto & results = kernel.GetOperation().type().Results();

if (results.empty())
return std::nullopt;
Expand All @@ -65,13 +65,13 @@ GetReturnTypeAsC(const llvm::lambda::node & kernel)
* @return a tuple (number of parameters, string of parameters, string of call arguments)
*/
std::tuple<size_t, std::string, std::string>
GetParameterListAsC(const llvm::lambda::node & kernel)
GetParameterListAsC(const rvsdg::LambdaNode & kernel)
{
size_t argument_index = 0;
std::ostringstream parameters;
std::ostringstream arguments;

for (auto & argType : kernel.type().Arguments())
for (auto & argType : kernel.GetOperation().type().Arguments())
{
if (rvsdg::is<rvsdg::StateType>(argType))
continue;
Expand All @@ -97,7 +97,8 @@ VerilatorHarnessHLS::GetText(llvm::RvsdgModule & rm)
{
std::ostringstream cpp;
const auto & kernel = *get_hls_lambda(rm);
const auto & function_name = kernel.name();
const auto & function_name =
dynamic_cast<llvm::LlvmLambdaOperation &>(kernel.GetOperation()).name();

// The request and response parts of memory queues
const auto mem_reqs = get_mem_reqs(kernel);
Expand Down
4 changes: 2 additions & 2 deletions jlm/hls/backend/rvsdg2rhls/DeadNodeElimination.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ EliminateDeadNodesInRegion(rvsdg::Region & region)
do
{
changed = false;
for (auto & node : jlm::rvsdg::bottomup_traverser(&region))
for (auto & node : rvsdg::BottomUpTraverser(&region))
{
if (!node->has_users())
{
Expand Down Expand Up @@ -120,7 +120,7 @@ EliminateDeadNodes(llvm::RvsdgModule & rvsdgModule)
throw util::error("Root should have only one node now");
}

auto lambdaNode = dynamic_cast<const llvm::lambda::node *>(rootRegion.Nodes().begin().ptr());
auto lambdaNode = dynamic_cast<const rvsdg::LambdaNode *>(rootRegion.Nodes().begin().ptr());
if (!lambdaNode)
{
throw util::error("Node needs to be a lambda");
Expand Down
2 changes: 1 addition & 1 deletion jlm/hls/backend/rvsdg2rhls/GammaConversion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ ConvertGammaNodesInStructuralNode(rvsdg::StructuralNode & structuralNode)
static void
ConvertGammaNodesInRegion(rvsdg::Region & region)
{
for (auto & node : rvsdg::topdown_traverser(&region))
for (auto & node : rvsdg::TopDownTraverser(&region))
{
if (auto structuralNode = dynamic_cast<rvsdg::StructuralNode *>(node))
{
Expand Down
2 changes: 1 addition & 1 deletion jlm/hls/backend/rvsdg2rhls/ThetaConversion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ ConvertThetaNodesInStructuralNode(rvsdg::StructuralNode & structuralNode)
static void
ConvertThetaNodesInRegion(rvsdg::Region & region)
{
for (auto & node : jlm::rvsdg::topdown_traverser(&region))
for (auto & node : rvsdg::TopDownTraverser(&region))
{
if (auto structuralNode = dynamic_cast<rvsdg::StructuralNode *>(node))
{
Expand Down
23 changes: 11 additions & 12 deletions jlm/hls/backend/rvsdg2rhls/UnusedStateRemoval.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*/

#include <jlm/hls/backend/rvsdg2rhls/UnusedStateRemoval.hpp>
#include <jlm/llvm/ir/CallSummary.hpp>
#include <jlm/llvm/ir/operators/lambda.hpp>
#include <jlm/llvm/ir/RvsdgModule.hpp>
#include <jlm/rvsdg/gamma.hpp>
Expand Down Expand Up @@ -32,9 +33,10 @@ IsPassthroughResult(const rvsdg::input & result)
}

static void
RemoveUnusedStatesFromLambda(llvm::lambda::node & lambdaNode)
RemoveUnusedStatesFromLambda(rvsdg::LambdaNode & lambdaNode)
{
auto & oldFunctionType = lambdaNode.type();
const auto & op = dynamic_cast<llvm::LlvmLambdaOperation &>(lambdaNode.GetOperation());
auto & oldFunctionType = op.type();

std::vector<std::shared_ptr<const jlm::rvsdg::Type>> newArgumentTypes;
for (size_t i = 0; i < oldFunctionType.NumArguments(); ++i)
Expand Down Expand Up @@ -62,13 +64,10 @@ RemoveUnusedStatesFromLambda(llvm::lambda::node & lambdaNode)
}
}

auto newFunctionType = llvm::FunctionType::Create(newArgumentTypes, newResultTypes);
auto newLambda = llvm::lambda::node::create(
lambdaNode.region(),
newFunctionType,
lambdaNode.name(),
lambdaNode.linkage(),
lambdaNode.attributes());
auto newFunctionType = rvsdg::FunctionType::Create(newArgumentTypes, newResultTypes);
auto newLambda = rvsdg::LambdaNode::Create(
*lambdaNode.region(),
llvm::LlvmLambdaOperation::Create(newFunctionType, op.name(), op.linkage(), op.attributes()));

rvsdg::SubstitutionMap substitutionMap;
for (const auto & ctxvar : lambdaNode.GetContextVars())
Expand Down Expand Up @@ -109,7 +108,7 @@ RemoveUnusedStatesFromLambda(llvm::lambda::node & lambdaNode)

JLM_ASSERT(lambdaNode.output()->nusers() == 1);
lambdaNode.region()->RemoveResult((*lambdaNode.output()->begin())->index());
auto oldExport = lambdaNode.ComputeCallSummary()->GetRvsdgExport();
auto oldExport = jlm::llvm::ComputeCallSummary(lambdaNode).GetRvsdgExport();
jlm::llvm::GraphExport::Create(*newLambdaOutput, oldExport ? oldExport->Name() : "");
remove(&lambdaNode);
}
Expand Down Expand Up @@ -208,7 +207,7 @@ RemoveUnusedStatesInStructuralNode(rvsdg::StructuralNode & structuralNode)
{
RemoveUnusedStatesFromThetaNode(*thetaNode);
}
else if (auto lambdaNode = dynamic_cast<llvm::lambda::node *>(&structuralNode))
else if (auto lambdaNode = dynamic_cast<rvsdg::LambdaNode *>(&structuralNode))
{
RemoveUnusedStatesFromLambda(*lambdaNode);
}
Expand All @@ -217,7 +216,7 @@ RemoveUnusedStatesInStructuralNode(rvsdg::StructuralNode & structuralNode)
static void
RemoveUnusedStatesInRegion(rvsdg::Region & region)
{
for (auto & node : rvsdg::topdown_traverser(&region))
for (auto & node : rvsdg::TopDownTraverser(&region))
{
if (auto structuralNode = dynamic_cast<rvsdg::StructuralNode *>(node))
{
Expand Down
2 changes: 1 addition & 1 deletion jlm/hls/backend/rvsdg2rhls/add-buffers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ namespace jlm::hls
void
add_buffers(rvsdg::Region * region, bool pass_through)
{
for (auto & node : jlm::rvsdg::topdown_traverser(region))
for (auto & node : rvsdg::TopDownTraverser(region))
{
if (auto structnode = dynamic_cast<rvsdg::StructuralNode *>(node))
{
Expand Down
Loading

0 comments on commit a89fed1

Please sign in to comment.