12#include <llvm/ADT/SmallPtrSet.h>
14#include <mlir/IR/OwningOpRef.h>
20circt::firrtl::FModuleOp
26 throw std::logic_error(node->
DebugString() +
" has more than 1 output");
30 auto module = nodeToModule(node);
31 auto body =
module.getBodyBlock();
33 ::llvm::SmallVector<mlir::Value>
inBundles;
269 auto & value =
op->Representation();
270 auto size = value.nbits();
278 auto value =
op->value().alternative();
279 auto size =
ceil(
log2(
op->value().nalternatives()));
312 auto size =
op->nbits();
314 for (
auto it =
op->begin();
it !=
op->end();
it++)
320 if ((
unsigned long)
outSize != size)
334 const rvsdg::Type * pointeeType =
op->getPointeeType().get();
341 pointeeType =
nullptr;
345 pointeeType = &
arrayType->element_type();
353 throw std::logic_error(pointeeType->
debug_string() +
" pointer not implemented!");
373 auto vec =
Builder_->create<circt::firrtl::WireOp>(
379 for (
size_t i = 0;
i <
vt->size(); ++
i)
421 throw std::logic_error(
"Simple node " + node->
DebugString() +
" not implemented!");
450circt::firrtl::FModuleOp
454 auto module = nodeToModule(node);
455 auto body =
module.getBodyBlock();
459 auto constant =
Builder_->create<circt::firrtl::ConstantOp>(
462 ::llvm::APInt(1, 1));
463 body->push_back(constant);
475circt::firrtl::FModuleOp
479 auto module = nodeToModule(node);
480 auto body =
module.getBodyBlock();
505 Builder_->getStringAttr(
"data_reg"));
530circt::firrtl::FModuleOp
536 auto module = nodeToModule(node);
537 auto body =
module.getBodyBlock();
568 ::llvm::SmallVector<circt::firrtl::RegResetOp>
firedRegs;
632circt::firrtl::FModuleOp
636 auto module = nodeToModule(node);
637 auto body =
module.getBodyBlock();
644 ::llvm::SmallVector<circt::firrtl::RegResetOp>
firedRegs;
724circt::firrtl::FModuleOp
728 auto module = nodeToModule(node, false);
729 auto body =
module.getBodyBlock();
787 for (
size_t i = 0;
i <
j; ++
i)
803 "overlapping reponse id",
805 "response_id_assert_" + std::to_string(
j) +
"_" + std::to_string(
i));
813circt::firrtl::FModuleOp
817 auto module = nodeToModule(node, false);
818 auto body =
module.getBodyBlock();
824 ::llvm::SmallVector<circt::firrtl::SubfieldOp>
loadAddrDatas;
825 ::llvm::SmallVector<mlir::Value>
loadIds;
834 ::llvm::SmallVector<mlir::Value>
storeIds;
838 for (
size_t i = 0;
i <
op->get_nloads(); ++
i)
847 for (
size_t i =
op->get_nloads();
i < node->
ninputs(); ++
i)
953circt::firrtl::FModuleOp
959 auto module = nodeToModule(node, false);
960 auto body =
module.getBodyBlock();
968 ::llvm::SmallVector<circt::firrtl::SubfieldOp>
inReadyStates;
969 ::llvm::SmallVector<circt::firrtl::SubfieldOp>
inValidStates;
970 ::llvm::SmallVector<circt::firrtl::SubfieldOp>
inDataStates;
971 for (
size_t i = 1;
i < node->
ninputs() - 1; ++
i)
992 ::llvm::SmallVector<circt::firrtl::SubfieldOp>
outDataStates;
1012 ::llvm::SmallVector<circt::firrtl::RegResetOp>
oValidRegs;
1013 ::llvm::SmallVector<circt::firrtl::RegResetOp>
oDataRegs;
1049 Builder_->getStringAttr(
"sent_reg"));
1110 for (
size_t i = 1;
i < node->
ninputs() - 1; ++
i)
1126circt::firrtl::FModuleOp
1132 auto module = nodeToModule(node, false);
1133 auto body =
module.getBodyBlock();
1172circt::firrtl::FModuleOp
1183 ::llvm::SmallVector<circt::firrtl::PortInfo>
ports;
1191 std::string name(
"i");
1192 name.append(std::to_string(
i - 1));
1195 circt::firrtl::Direction::In,
1201 std::string name(
"o");
1202 name.append(std::to_string(
i));
1205 circt::firrtl::Direction::Out,
1214 auto module = Builder_->create<circt::firrtl::FModuleOp>(
1215 Builder_->getUnknownLoc(),
1217 circt::firrtl::ConventionAttr::get(
1218 Builder_->getContext(),
1219 circt::firrtl::Convention::Internal),
1222 auto body =
module.getBodyBlock();
1229 ::llvm::SmallVector<circt::firrtl::SubfieldOp>
loadAddrDatas;
1267 ::llvm::SmallVector<circt::firrtl::SubfieldOp>
loadDataDatas;
1282 auto arraytype = std::dynamic_pointer_cast<const llvm::ArrayType>(
lmem_op->result(0));
1285 ::llvm::SmallVector<mlir::Type>
memTypes;
1286 ::llvm::SmallVector<mlir::Attribute>
memNames;
1287 memTypes.push_back(circt::firrtl::MemOp::getTypeForPort(
1290 circt::firrtl::MemOp::PortKind::ReadWrite));
1302 circt::firrtl::RUWAttr::New,
1326 ::llvm::SmallVector<circt::firrtl::RegResetOp>
loadValidRegs;
1335 Builder_->getStringAttr(
"load_valid_" + std::to_string(
i)));
1379circt::firrtl::FModuleOp
1385 auto module = nodeToModule(node, false);
1386 auto body =
module.getBodyBlock();
1399 ::llvm::SmallVector<circt::firrtl::SubfieldOp>
inReadyStates;
1400 ::llvm::SmallVector<circt::firrtl::SubfieldOp>
inValidStates;
1401 ::llvm::SmallVector<circt::firrtl::SubfieldOp>
inDataStates;
1402 for (
size_t i = 2;
i < node->
ninputs() - 1; ++
i)
1416 ::llvm::SmallVector<circt::firrtl::SubfieldOp>
outDataStates;
1472 for (
size_t i = 2;
i < node->
ninputs() - 1; ++
i)
1479circt::firrtl::FModuleOp
1483 auto module = nodeToModule(node, true);
1484 auto body =
module.getBodyBlock();
1542 ::llvm::SmallVector<circt::firrtl::RegResetOp>
oValidRegs;
1543 ::llvm::SmallVector<circt::firrtl::RegResetOp>
oDataRegs;
1579 Builder_->getStringAttr(
"sent_reg"));
1603 bitWidth = std::dynamic_pointer_cast<const rvsdg::BitType>(node->
input(1)->
Type())->nbits();
1610 if (
auto bitType = std::dynamic_pointer_cast<const rvsdg::BitType>(node->
output(0)->
Type()))
1620 throw util::Error(
"unknown width for mem request");
1696circt::firrtl::FModuleOp
1700 auto module = nodeToModule(node);
1701 auto body =
module.getBodyBlock();
1730circt::firrtl::FModuleOp
1734 auto module = nodeToModule(node);
1735 auto body =
module.getBodyBlock();
1750 auto formatString =
"print node " + std::to_string(
pn->id()) +
": %x\n";
1751 auto name =
"print_node_" + std::to_string(
pn->id());
1753 ::llvm::SmallVector<mlir::Value>
operands;
1755 body->push_back(
Builder_->create<circt::firrtl::PrintFOp>(
1765circt::firrtl::FModuleOp
1769 auto module = nodeToModule(node);
1770 auto body =
module.getBodyBlock();
1787 std::string
dataName(
"buf_data_reg");
1830circt::firrtl::FModuleOp
1834 auto module = nodeToModule(node);
1835 auto body =
module.getBodyBlock();
1847 ::llvm::SmallVector<circt::firrtl::RegResetOp>
validRegs;
1848 ::llvm::SmallVector<circt::firrtl::RegResetOp>
dataRegs;
1849 for (
size_t i = 0;
i <= capacity;
i++)
1885 ::llvm::SmallVector<circt::firrtl::WireOp>
shiftWires;
1887 for (
size_t i = 0;
i <= capacity;
i++)
1912 if (
op->IsPassThrough())
1932 for (
size_t i = 0;
i < capacity; ++
i)
1970circt::firrtl::FModuleOp
1974 auto module = nodeToModule(node);
1975 auto body =
module.getBodyBlock();
1987 ::llvm::SmallVector<circt::firrtl::RegResetOp>
validRegs;
1988 ::llvm::SmallVector<circt::firrtl::RegResetOp>
dataRegs;
1989 for (
size_t i = 0;
i <= capacity;
i++)
2025 ::llvm::SmallVector<circt::firrtl::WireOp>
shiftWires;
2027 for (
size_t i = 0;
i <= capacity;
i++)
2085 for (
size_t i = 0;
i < capacity; ++
i)
2127 if (
op->combinatorial)
2138circt::firrtl::FModuleOp
2142 auto module = nodeToModule(node);
2143 auto body =
module.getBodyBlock();
2173 ::llvm::SmallVector<circt::firrtl::WireOp>
discardWires;
2185 regName.append(
"_discard_ctr");
2276circt::firrtl::FModuleOp
2280 auto module = nodeToModule(node);
2281 auto body =
module.getBodyBlock();
2323circt::firrtl::FModuleOp
2327 auto module = nodeToModule(node);
2328 auto body =
module.getBodyBlock();
2370circt::firrtl::FModuleLike
2479circt::firrtl::FModuleOp
2483 auto module = nodeToModule(loopNode);
2484 auto body =
module.getBodyBlock();
2502 auto arg =
loopNode->input(
i)->arguments.begin().ptr();
2515circt::firrtl::BitsPrimOp
2518 auto type = value.getType().cast<circt::firrtl::UIntType>();
2519 auto width = type.getWidth();
2531 auto region = arg->
region();
2532 auto node = region->
node();
2536 if (
auto back_edge = std::get_if<LoopNode::BackEdgeVar>(&
var))
2540 else if (
auto entry = std::get_if<LoopNode::EntryVar>(&
var))
2547 auto origin = entry->input->origin();
2564 throw std::logic_error(
"LoopNode argument is neither entry nor backedge");
2571circt::firrtl::FModuleLike
2577 return loopNode && std::holds_alternative<LoopNode::BackEdgeVar>(
loopNode->mapArgument(*arg));
2581 return loopNode && std::holds_alternative<LoopNode::BackEdgeVar>(
loopNode->mapResult(*
res));
2584 ::llvm::SmallVector<circt::firrtl::PortInfo>
ports;
2596 circt::firrtl::Direction::In,
2608 circt::firrtl::Direction::Out,
2617 auto module = Builder_->create<circt::firrtl::FModuleOp>(
2618 Builder_->getUnknownLoc(),
2620 circt::firrtl::ConventionAttr::get(
2621 Builder_->getContext(),
2622 circt::firrtl::Convention::Internal),
2628 auto body =
module.getBodyBlock();
2632 std::unordered_map<rvsdg::Output *, mlir::Value>
output_map;
2639 auto op =
Builder_->create<circt::firrtl::WireOp>(
2660 auto reset =
body->getArgument(1);
2670 for (
size_t i = 0;
i < node->ninputs(); ++
i)
2677 for (
size_t i = 0;
i < node->noutputs(); ++
i)
2691 auto op =
Builder_->create<circt::firrtl::WireOp>(
2720 auto node = output->
node();
2723 if (!
dynamic_cast<LoopNode *
>(node))
2725 throw std::logic_error(
"Expected a hls::LoopNode but found: " + node->DebugString());
2742 throw std::logic_error(
"Encountered pass through argument - should be eliminated");
2746 throw std::logic_error(
"Encountered an unexpected output type");
2751circt::firrtl::CircuitOp
2755 mlir::OwningOpRef<circt::firrtl::CircuitOp>
circuitRef;
2763 circuitRef = mlir::OwningOpRef<circt::firrtl::CircuitOp>(
2775 ::llvm::SmallVector<circt::firrtl::PortInfo>
ports;
2785 using BundleElement = circt::firrtl::BundleType::BundleElement;
2803 struct circt::firrtl::PortInfo
iBundle = {
2826 struct circt::firrtl::PortInfo
oBundle = {
2861 struct circt::firrtl::PortInfo
memBundle = {
2862 Builder_->getStringAttr(
"mem_" + std::to_string(
i)),
2864 circt::firrtl::Direction::Out,
2873 auto module = Builder_->create<circt::firrtl::FModuleOp>(
2874 Builder_->getUnknownLoc(),
2876 circt::firrtl::ConventionAttr::get(
2877 Builder_->getContext(),
2878 circt::firrtl::Convention::Internal),
2884 auto body =
module.getBodyBlock();
2907 ::llvm::SmallVector<circt::firrtl::RegResetOp>
inputDataRegs;
2995 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 1),
3019 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 1),
3106 struct circt::firrtl::PortInfo
port = {
3107 Builder_->getStringAttr(
"clk"), circt::firrtl::ClockType::get(
Builder_->getContext()),
3108 circt::firrtl::Direction::In, {},
3118 struct circt::firrtl::PortInfo
port = {
3119 Builder_->getStringAttr(
"reset"), circt::firrtl::IntType::get(
Builder_->getContext(),
false, 1),
3120 circt::firrtl::Direction::In, {},
3129 using BundleElement = circt::firrtl::BundleType::BundleElement;
3141 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 64)));
3145 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 1)));
3149 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 3)));
3152 struct circt::firrtl::PortInfo
memBundle = {
3153 Builder_->getStringAttr(
"mem_req"),
memType, circt::firrtl::Direction::Out, {},
3162 using BundleElement = circt::firrtl::BundleType::BundleElement;
3169 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 64)));
3181 ::llvm::SmallVector<circt::firrtl::PortInfo> *
ports,
3184 circt::firrtl::FIRRTLBaseType type)
3187 struct circt::firrtl::PortInfo
bundle = {
3193circt::firrtl::BundleType
3196 using BundleElement = circt::firrtl::BundleType::BundleElement;
3198 ::llvm::SmallVector<BundleElement>
elements;
3203 return circt::firrtl::BundleType::get(this->
Builder_->getContext(), elements);
3206circt::firrtl::SubfieldOp
3210 Builder_->create<circt::firrtl::SubfieldOp>(
Builder_->getUnknownLoc(), value, index);
3215circt::firrtl::SubfieldOp
3230 for (
size_t i = 0;
i <
module.getNumPorts(); ++
i)
3234 return module.getArgument(i);
3243 for (
size_t i = 0;
i <
instance.getNumResults(); ++
i)
3270 Builder_->create<circt::firrtl::ConnectOp>(
Builder_->getUnknownLoc(), sink, source));
3273circt::firrtl::BitsPrimOp
3277 auto op =
Builder_->create<circt::firrtl::BitsPrimOp>(
3286circt::firrtl::AndPrimOp
3294circt::firrtl::NodeOp
3297 auto op =
Builder_->create<circt::firrtl::NodeOp>(
Builder_->getUnknownLoc(), value, name);
3302circt::firrtl::XorPrimOp
3310circt::firrtl::OrPrimOp
3318circt::firrtl::NotPrimOp
3321 auto op =
Builder_->create<circt::firrtl::NotPrimOp>(
Builder_->getUnknownLoc(), first);
3326circt::firrtl::AddPrimOp
3334circt::firrtl::SubPrimOp
3342circt::firrtl::MulPrimOp
3350circt::firrtl::DivPrimOp
3358circt::firrtl::DShrPrimOp
3366circt::firrtl::DShlPrimOp
3374circt::firrtl::RemPrimOp
3382circt::firrtl::EQPrimOp
3390circt::firrtl::NEQPrimOp
3398circt::firrtl::GTPrimOp
3406circt::firrtl::GEQPrimOp
3414circt::firrtl::LTPrimOp
3422circt::firrtl::LEQPrimOp
3430circt::firrtl::MuxPrimOp
3443circt::firrtl::AsSIntPrimOp
3446 auto op =
Builder_->create<circt::firrtl::AsSIntPrimOp>(
Builder_->getUnknownLoc(), value);
3451circt::firrtl::AsUIntPrimOp
3454 auto op =
Builder_->create<circt::firrtl::AsUIntPrimOp>(
Builder_->getUnknownLoc(), value);
3459circt::firrtl::PadPrimOp
3467circt::firrtl::CvtPrimOp
3470 auto op =
Builder_->create<circt::firrtl::CvtPrimOp>(
Builder_->getUnknownLoc(), value);
3475circt::firrtl::WireOp
3484circt::firrtl::WhenOp
3497 ::llvm::SmallPtrSet<mlir::Value, 16> & visited)
3499 if (visited.contains(value))
3503 visited.insert(value);
3506 throw util::Error(
"forbidden dependency detected");
3508 auto op = value.getDefiningOp();
3511 if (mlir::dyn_cast<circt::firrtl::RegResetOp>(
op))
3515 else if (mlir::dyn_cast<circt::firrtl::RegOp>(
op))
3520 for (
auto &
use : value.getUses())
3523 if (
auto connectOp = mlir::dyn_cast<circt::firrtl::ConnectOp>(
user))
3535 if (mlir::dyn_cast<circt::firrtl::SubfieldOp>(
op))
3540 for (
size_t i = 0;
i <
op->getNumOperands(); ++
i)
3548 ::llvm::SmallVector<mlir::Value> &
oReadys,
3549 ::llvm::SmallVector<mlir::Value> &
oValids)
3554 ::llvm::SmallPtrSet<mlir::Value, 16> visited;
3565 ::llvm::SmallVector<mlir::Value>
oReadys;
3566 ::llvm::SmallVector<mlir::Value>
oValids;
3567 ::llvm::SmallVector<mlir::Value>
oDatas;
3568 for (
size_t i = 0;
i <
module.getNumPorts(); ++
i)
3570 auto portName =
module.getPortName(i);
3571 auto port =
module.getArgument(i);
3575 for (
auto &
use :
port.getUses())
3578 if (
auto subfieldOp = mlir::dyn_cast<circt::firrtl::SubfieldOp>(
user))
3598 user->print(::llvm::outs());
3607#ifdef FIRRTL_RUNTIME_ASSERTIONS
3609 auto body = &
module.getBody().back();
3613 for (
size_t i = 0;
i <
module.getNumPorts(); ++
i)
3615 auto portName =
module.getPortName(i);
3616 auto port =
module.getArgument(i);
3622 if (data.getResult().getType().dyn_cast<circt::firrtl::BundleType>())
3634 std::string(
portName) +
"_prev_ready_reg");
3642 std::string(
portName) +
"_prev_valid_reg");
3646 data.getResult().getType(),
3648 std::string(
portName) +
"_prev_data_reg");
3662 std::string(
portName) +
"_valid went down without firing",
3664 std::string(
portName) +
"_valid_assert");
3672 std::string(
portName) +
"_ready went down without firing",
3674 std::string(
portName) +
"_ready_assert");
3687 std::string(
portName) +
"_data changed without firing",
3689 std::string(
portName) +
"_data_assert");
3696circt::firrtl::InstanceOp
3705 auto module = MlirGen(sn);
3706 if (circt::isa<circt::firrtl::FModuleOp>(module))
3707 check_module(circt::cast<circt::firrtl::FModuleOp>(module));
3716 auto module = MlirGen(ln, circuitBody);
3724 return Builder_->create<circt::firrtl::InstanceOp>(
3730circt::firrtl::ConstantOp
3734 auto constant =
Builder_->create<circt::firrtl::ConstantOp>(
3737 ::llvm::APInt(size, value));
3738 body->push_back(constant);
3742circt::firrtl::InvalidValueOp
3757 Builder_->create<circt::firrtl::InvalidValueOp>(
Builder_->getUnknownLoc(), value.getType());
3766 auto clock =
module.getArgument(0);
3767 auto ctype =
clock.getType().cast<circt::firrtl::FIRRTLType>();
3768 if (!
ctype.isa<circt::firrtl::ClockType>())
3779 auto reset =
module.getArgument(1);
3780 auto rtype = reset.getType().cast<circt::firrtl::FIRRTLType>();
3781 if (!
rtype.isa<circt::firrtl::ResetType>())
3788circt::firrtl::BundleType::BundleElement
3791 using BundleElement = circt::firrtl::BundleType::BundleElement;
3796 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 1));
3799circt::firrtl::BundleType::BundleElement
3802 using BundleElement = circt::firrtl::BundleType::BundleElement;
3807 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 1));
3813 mlir::BlockArgument
mem =
GetPort(module,
"mem_req");
3814 mlir::Block *
body =
module.getBodyBlock();
3838circt::firrtl::FModuleOp
3842 ::llvm::SmallVector<circt::firrtl::PortInfo>
ports;
3850 std::string name(
"i");
3851 name.append(std::to_string(
i));
3854 circt::firrtl::Direction::In,
3860 std::string name(
"o");
3861 name.append(std::to_string(
i));
3864 circt::firrtl::Direction::Out,
3879 return Builder_->create<circt::firrtl::FModuleOp>(
3882 circt::firrtl::ConventionAttr::get(
3884 circt::firrtl::Convention::Internal),
3893circt::firrtl::IntType
3896 return circt::firrtl::IntType::get(
Builder_->getContext(),
false, size);
3903circt::firrtl::IntType
3909circt::firrtl::FIRRTLBaseType
3914 using BundleElement = circt::firrtl::BundleType::BundleElement;
3915 ::llvm::SmallVector<BundleElement>
elements;
3916 for (
size_t i = 0;
i <
bt->elements_.size(); ++
i)
3918 auto t = &
bt->elements_.at(
i);
3949 const rvsdg::Type * pointeeType =
op->getPointeeType().get();
3956 pointeeType =
nullptr;
3960 pointeeType = &
arrayType->element_type();
3968 throw std::logic_error(pointeeType->
debug_string() +
" pointer not implemented!");
3989 append.append(std::to_string(
3990 std::dynamic_pointer_cast<const llvm::ArrayType>(
op->result(0))->nelements()));
4016 for (
const auto &
pair :
op)
4029 const circt::firrtl::FModuleOp
fModuleOp,
4051 auto module = mlir::ModuleOp::create(Builder_->getUnknownLoc());
4052 module.push_back(circuit);
4055 if (
failed(mlir::verify(module)))
4057 module.emitError("module verification error");
4058 throw std::logic_error(
"Verification of firrtl failed");
4061 module.print(::llvm::outs());
4076 std::cout <<
"\nWritten firrtl to " <<
fileName <<
"\n";
4083 auto module = mlir::ModuleOp::create(Builder_->getUnknownLoc());
4084 module.push_back(circuit);
4087 if (
failed(mlir::verify(module)))
4089 module.emitError("module verification error");
4090 module.print(::llvm::outs());
4091 throw std::logic_error(
"Verification of firrtl failed");
4101 throw std::logic_error(
"Exporting of firrtl failed");
4106circt::firrtl::FExtModuleOp
4110 ::llvm::SmallVector<circt::firrtl::PortInfo>
ports;
4118 std::string name(
"i");
4119 name.append(std::to_string(
i));
4122 circt::firrtl::Direction::In,
4128 std::string name(
"o");
4129 name.append(std::to_string(
i));
4132 circt::firrtl::Direction::Out,
4141 return Builder_->create<circt::firrtl::FExtModuleOp>(
4144 circt::firrtl::ConventionAttr::get(
4146 circt::firrtl::Convention::Internal),
std::vector< rvsdg::RegionResult * > get_mem_reqs(const rvsdg::LambdaNode &lambda)
std::vector< rvsdg::RegionArgument * > get_reg_args(const rvsdg::LambdaNode &lambda)
static std::string get_port_name(jlm::rvsdg::Input *port)
void create_node_names(rvsdg::Region *r)
static int JlmSize(const jlm::rvsdg::Type *type)
std::unordered_map< jlm::rvsdg::Output *, std::string > output_map
std::string get_node_name(const rvsdg::Node *node)
std::vector< rvsdg::RegionResult * > get_reg_results(const rvsdg::LambdaNode &lambda)
std::vector< rvsdg::RegionArgument * > get_mem_resps(const rvsdg::LambdaNode &lambda)
std::size_t Capacity() const noexcept
bool IsConstant() const noexcept
const std::vector< std::shared_ptr< const rvsdg::Type > > * GetLoadTypes() const
circt::firrtl::InstanceOp AddInstanceOp(mlir::Block *circuitBody, jlm::rvsdg::Node *node)
circt::firrtl::GEQPrimOp AddGeqOp(mlir::Block *body, mlir::Value first, mlir::Value second)
circt::firrtl::FModuleOp MlirGenBuffer(const jlm::rvsdg::SimpleNode *node)
mlir::BlockArgument GetPort(circt::firrtl::FModuleOp &module, std::string portName)
circt::firrtl::FModuleOp MlirGenHlsMemReq(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::EQPrimOp AddEqOp(mlir::Block *body, mlir::Value first, mlir::Value second)
circt::firrtl::LTPrimOp AddLtOp(mlir::Block *body, mlir::Value first, mlir::Value second)
circt::firrtl::BitsPrimOp AddBitsOp(mlir::Block *body, mlir::Value value, int high, int low)
jlm::rvsdg::Output * TraceArgument(rvsdg::Output *arg)
void check_module(circt::firrtl::FModuleOp &module)
circt::firrtl::XorPrimOp AddXorOp(mlir::Block *body, mlir::Value first, mlir::Value second)
circt::firrtl::FModuleOp MlirGenNDMux(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::BundleType GetBundleType(const circt::firrtl::FIRRTLBaseType &type)
circt::firrtl::BitsPrimOp DropMSBs(mlir::Block *body, mlir::Value value, int amount)
circt::firrtl::WireOp AddWireOp(mlir::Block *body, std::string name, int size)
void AddMemResPort(::llvm::SmallVector< circt::firrtl::PortInfo > *ports)
circt::firrtl::RemPrimOp AddRemOp(mlir::Block *body, mlir::Value first, mlir::Value second)
std::unordered_map< std::string, circt::firrtl::FModuleLike > modules
circt::firrtl::FModuleOp MlirGenFork(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::FModuleOp nodeToModule(const jlm::rvsdg::Node *node, bool mem=false)
void WriteModuleToFile(const circt::firrtl::FModuleOp fModuleOp, const rvsdg::Node *node)
rvsdg::Output * TraceStructuralOutput(rvsdg::StructuralOutput *out)
circt::firrtl::NodeOp AddNodeOp(mlir::Block *body, mlir::Value value, std::string name)
circt::firrtl::FModuleOp MlirGenTrigger(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::DShrPrimOp AddDShrOp(mlir::Block *body, mlir::Value first, mlir::Value second)
circt::firrtl::NEQPrimOp AddNeqOp(mlir::Block *body, mlir::Value first, mlir::Value second)
circt::firrtl::FModuleOp MlirGenPrint(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::FModuleOp MlirGenHlsMemResp(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::BundleType::BundleElement GetReadyElement()
circt::firrtl::BundleType::BundleElement GetValidElement()
void AddResetPort(::llvm::SmallVector< circt::firrtl::PortInfo > *ports)
circt::firrtl::FModuleOp MlirGenStateGate(const jlm::rvsdg::SimpleNode *node)
const circt::firrtl::FIRVersion DefaultFIRVersion_
void InitializeMemReq(circt::firrtl::FModuleOp module)
circt::firrtl::FModuleOp MlirGenSink(const jlm::rvsdg::SimpleNode *node)
void Connect(mlir::Block *body, mlir::Value sink, mlir::Value source)
circt::firrtl::FModuleOp MlirGenHlsStore(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::FIRRTLBaseType GetFirrtlType(const jlm::rvsdg::Type *type)
void AddMemReqPort(::llvm::SmallVector< circt::firrtl::PortInfo > *ports)
circt::firrtl::DShlPrimOp AddDShlOp(mlir::Block *body, mlir::Value first, mlir::Value second)
void WriteCircuitToFile(const circt::firrtl::CircuitOp circuit, std::string name)
bool IsIdentityMapping(const rvsdg::MatchOperation &op)
circt::firrtl::CircuitOp MlirGen(const rvsdg::LambdaNode *lamdaNode)
circt::firrtl::FModuleOp MlirGenSimpleNode(const jlm::rvsdg::SimpleNode *node)
mlir::BlockArgument GetResetSignal(circt::firrtl::FModuleOp module)
std::string toString(const circt::firrtl::CircuitOp circuit)
circt::firrtl::ConstantOp GetConstant(mlir::Block *body, int size, int value)
circt::firrtl::InvalidValueOp GetInvalid(mlir::Block *body, int size)
mlir::BlockArgument GetOutPort(circt::firrtl::FModuleOp &module, size_t portNr)
circt::firrtl::FModuleOp MlirGenBranch(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::SubPrimOp AddSubOp(mlir::Block *body, mlir::Value first, mlir::Value second)
circt::firrtl::PadPrimOp AddPadOp(mlir::Block *body, mlir::Value value, int amount)
circt::firrtl::MuxPrimOp AddMuxOp(mlir::Block *body, mlir::Value select, mlir::Value high, mlir::Value low)
circt::firrtl::WhenOp AddWhenOp(mlir::Block *body, mlir::Value condition, bool elseStatment)
circt::firrtl::AsUIntPrimOp AddAsUIntOp(mlir::Block *body, mlir::Value value)
circt::firrtl::FModuleOp MlirGenPredicationBuffer(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::NotPrimOp AddNotOp(mlir::Block *body, mlir::Value first)
circt::firrtl::FModuleOp MlirGenAddrQueue(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::GTPrimOp AddGtOp(mlir::Block *body, mlir::Value first, mlir::Value second)
circt::firrtl::FExtModuleOp MlirGenExtModule(const jlm::rvsdg::SimpleNode *node)
void AddClockPort(::llvm::SmallVector< circt::firrtl::PortInfo > *ports)
std::string extension() override
circt::firrtl::FModuleOp MlirGenHlsDLoad(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::FModuleOp MlirGenLoopConstBuffer(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::OrPrimOp AddOrOp(mlir::Block *body, mlir::Value first, mlir::Value second)
circt::firrtl::IntType GetIntType(int size)
circt::firrtl::MulPrimOp AddMulOp(mlir::Block *body, mlir::Value first, mlir::Value second)
circt::firrtl::LEQPrimOp AddLeqOp(mlir::Block *body, mlir::Value first, mlir::Value second)
circt::firrtl::FModuleOp MlirGenHlsLocalMem(const jlm::rvsdg::SimpleNode *node)
std::string GetModuleName(const rvsdg::Node *node)
std::unique_ptr<::mlir::OpBuilder > Builder_
circt::firrtl::AsSIntPrimOp AddAsSIntOp(mlir::Block *body, mlir::Value value)
circt::firrtl::FModuleOp MlirGenDMux(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::DivPrimOp AddDivOp(mlir::Block *body, mlir::Value first, mlir::Value second)
circt::firrtl::FModuleOp MlirGenHlsLoad(const jlm::rvsdg::SimpleNode *node)
circt::firrtl::AddPrimOp AddAddOp(mlir::Block *body, mlir::Value first, mlir::Value second)
mlir::BlockArgument GetInPort(circt::firrtl::FModuleOp &module, size_t portNr)
circt::firrtl::CvtPrimOp AddCvtOp(mlir::Block *body, mlir::Value value)
circt::firrtl::SubfieldOp GetSubfield(mlir::Block *body, mlir::Value value, int index)
mlir::OpResult GetInstancePort(circt::firrtl::InstanceOp &instance, std::string portName)
mlir::BlockArgument GetClockSignal(circt::firrtl::FModuleOp module)
circt::firrtl::AndPrimOp AddAndOp(mlir::Block *body, mlir::Value first, mlir::Value second)
void ConnectInvalid(mlir::Block *body, mlir::Value value)
circt::firrtl::FModuleOp MlirGenMem(const jlm::rvsdg::SimpleNode *node)
void AddBundlePort(::llvm::SmallVector< circt::firrtl::PortInfo > *ports, circt::firrtl::Direction direction, std::string name, circt::firrtl::FIRRTLBaseType type)
const std::string & name() const noexcept
UndefValueOperation class.
rvsdg::Region * subregion() const noexcept
LambdaOperation & GetOperation() const noexcept override
NodeInput * input(size_t index) const noexcept
NodeOutput * output(size_t index) const noexcept
virtual std::string DebugString() const =0
virtual const Operation & GetOperation() const noexcept=0
size_t ninputs() const noexcept
size_t noutputs() const noexcept
rvsdg::Region * region() const noexcept
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
Represents the argument of a region.
Represent acyclic RVSDG subgraphs.
rvsdg::StructuralNode * node() const noexcept
const SimpleOperation & GetOperation() const noexcept override
std::string DebugString() const override
NodeInput * input(size_t index) const noexcept
NodeOutput * output(size_t index) const noexcept
StructuralNode * node() const noexcept
constexpr Type() noexcept
virtual std::string debug_string() const =0
size_type size() const noexcept
Iterator begin() noexcept
void check_may_not_depend_on(mlir::Value value, ::llvm::SmallPtrSet< mlir::Value, 16 > &forbiddenDependencies, ::llvm::SmallPtrSet< mlir::Value, 16 > &visited)
void check_oValids(::llvm::SmallVector< mlir::Value > &oReadys, ::llvm::SmallVector< mlir::Value > &oValids)
bool isForbiddenChar(char c)
size_t GetPointerSizeInBits()
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)
@ State
Designate a state type.
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
detail::TopDownTraverserGeneric< false > TopDownTraverser
Traverser for visiting every node in a region in a top down order.
static std::string strfmt(Args... args)