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();
2533 if (
dynamic_cast<LoopNode *
>(node))
2537 return ba->result()->origin();
2566circt::firrtl::FModuleLike
2570 ::llvm::SmallVector<circt::firrtl::PortInfo>
ports;
2582 circt::firrtl::Direction::In,
2594 circt::firrtl::Direction::Out,
2603 auto module = Builder_->create<circt::firrtl::FModuleOp>(
2604 Builder_->getUnknownLoc(),
2606 circt::firrtl::ConventionAttr::get(
2607 Builder_->getContext(),
2608 circt::firrtl::Convention::Internal),
2614 auto body =
module.getBodyBlock();
2618 std::unordered_map<rvsdg::Output *, mlir::Value>
output_map;
2625 auto op =
Builder_->create<circt::firrtl::WireOp>(
2646 auto reset =
body->getArgument(1);
2656 for (
size_t i = 0;
i < node->ninputs(); ++
i)
2663 for (
size_t i = 0;
i < node->noutputs(); ++
i)
2676 auto op =
Builder_->create<circt::firrtl::WireOp>(
2705 auto node = output->
node();
2708 if (!
dynamic_cast<LoopNode *
>(node))
2710 throw std::logic_error(
"Expected a hls::LoopNode but found: " + node->DebugString());
2727 throw std::logic_error(
"Encountered pass through argument - should be eliminated");
2731 throw std::logic_error(
"Encountered an unexpected output type");
2736circt::firrtl::CircuitOp
2740 mlir::OwningOpRef<circt::firrtl::CircuitOp>
circuitRef;
2748 circuitRef = mlir::OwningOpRef<circt::firrtl::CircuitOp>(
2760 ::llvm::SmallVector<circt::firrtl::PortInfo>
ports;
2770 using BundleElement = circt::firrtl::BundleType::BundleElement;
2788 struct circt::firrtl::PortInfo
iBundle = {
2811 struct circt::firrtl::PortInfo
oBundle = {
2846 struct circt::firrtl::PortInfo
memBundle = {
2847 Builder_->getStringAttr(
"mem_" + std::to_string(
i)),
2849 circt::firrtl::Direction::Out,
2858 auto module = Builder_->create<circt::firrtl::FModuleOp>(
2859 Builder_->getUnknownLoc(),
2861 circt::firrtl::ConventionAttr::get(
2862 Builder_->getContext(),
2863 circt::firrtl::Convention::Internal),
2869 auto body =
module.getBodyBlock();
2892 ::llvm::SmallVector<circt::firrtl::RegResetOp>
inputDataRegs;
2980 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 1),
3004 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 1),
3091 struct circt::firrtl::PortInfo
port = {
3092 Builder_->getStringAttr(
"clk"), circt::firrtl::ClockType::get(
Builder_->getContext()),
3093 circt::firrtl::Direction::In, {},
3103 struct circt::firrtl::PortInfo
port = {
3104 Builder_->getStringAttr(
"reset"), circt::firrtl::IntType::get(
Builder_->getContext(),
false, 1),
3105 circt::firrtl::Direction::In, {},
3114 using BundleElement = circt::firrtl::BundleType::BundleElement;
3126 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 64)));
3130 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 1)));
3134 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 3)));
3137 struct circt::firrtl::PortInfo
memBundle = {
3138 Builder_->getStringAttr(
"mem_req"),
memType, circt::firrtl::Direction::Out, {},
3147 using BundleElement = circt::firrtl::BundleType::BundleElement;
3154 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 64)));
3166 ::llvm::SmallVector<circt::firrtl::PortInfo> *
ports,
3169 circt::firrtl::FIRRTLBaseType type)
3172 struct circt::firrtl::PortInfo
bundle = {
3178circt::firrtl::BundleType
3181 using BundleElement = circt::firrtl::BundleType::BundleElement;
3183 ::llvm::SmallVector<BundleElement>
elements;
3188 return circt::firrtl::BundleType::get(this->
Builder_->getContext(), elements);
3191circt::firrtl::SubfieldOp
3195 Builder_->create<circt::firrtl::SubfieldOp>(
Builder_->getUnknownLoc(), value, index);
3200circt::firrtl::SubfieldOp
3215 for (
size_t i = 0;
i <
module.getNumPorts(); ++
i)
3219 return module.getArgument(i);
3228 for (
size_t i = 0;
i <
instance.getNumResults(); ++
i)
3255 Builder_->create<circt::firrtl::ConnectOp>(
Builder_->getUnknownLoc(), sink, source));
3258circt::firrtl::BitsPrimOp
3262 auto op =
Builder_->create<circt::firrtl::BitsPrimOp>(
3271circt::firrtl::AndPrimOp
3279circt::firrtl::NodeOp
3282 auto op =
Builder_->create<circt::firrtl::NodeOp>(
Builder_->getUnknownLoc(), value, name);
3287circt::firrtl::XorPrimOp
3295circt::firrtl::OrPrimOp
3303circt::firrtl::NotPrimOp
3306 auto op =
Builder_->create<circt::firrtl::NotPrimOp>(
Builder_->getUnknownLoc(), first);
3311circt::firrtl::AddPrimOp
3319circt::firrtl::SubPrimOp
3327circt::firrtl::MulPrimOp
3335circt::firrtl::DivPrimOp
3343circt::firrtl::DShrPrimOp
3351circt::firrtl::DShlPrimOp
3359circt::firrtl::RemPrimOp
3367circt::firrtl::EQPrimOp
3375circt::firrtl::NEQPrimOp
3383circt::firrtl::GTPrimOp
3391circt::firrtl::GEQPrimOp
3399circt::firrtl::LTPrimOp
3407circt::firrtl::LEQPrimOp
3415circt::firrtl::MuxPrimOp
3428circt::firrtl::AsSIntPrimOp
3431 auto op =
Builder_->create<circt::firrtl::AsSIntPrimOp>(
Builder_->getUnknownLoc(), value);
3436circt::firrtl::AsUIntPrimOp
3439 auto op =
Builder_->create<circt::firrtl::AsUIntPrimOp>(
Builder_->getUnknownLoc(), value);
3444circt::firrtl::PadPrimOp
3452circt::firrtl::CvtPrimOp
3455 auto op =
Builder_->create<circt::firrtl::CvtPrimOp>(
Builder_->getUnknownLoc(), value);
3460circt::firrtl::WireOp
3469circt::firrtl::WhenOp
3482 ::llvm::SmallPtrSet<mlir::Value, 16> & visited)
3484 if (visited.contains(value))
3488 visited.insert(value);
3491 throw util::Error(
"forbidden dependency detected");
3493 auto op = value.getDefiningOp();
3496 if (mlir::dyn_cast<circt::firrtl::RegResetOp>(
op))
3500 else if (mlir::dyn_cast<circt::firrtl::RegOp>(
op))
3505 for (
auto &
use : value.getUses())
3508 if (
auto connectOp = mlir::dyn_cast<circt::firrtl::ConnectOp>(
user))
3520 if (mlir::dyn_cast<circt::firrtl::SubfieldOp>(
op))
3525 for (
size_t i = 0;
i <
op->getNumOperands(); ++
i)
3533 ::llvm::SmallVector<mlir::Value> &
oReadys,
3534 ::llvm::SmallVector<mlir::Value> &
oValids)
3539 ::llvm::SmallPtrSet<mlir::Value, 16> visited;
3550 ::llvm::SmallVector<mlir::Value>
oReadys;
3551 ::llvm::SmallVector<mlir::Value>
oValids;
3552 ::llvm::SmallVector<mlir::Value>
oDatas;
3553 for (
size_t i = 0;
i <
module.getNumPorts(); ++
i)
3555 auto portName =
module.getPortName(i);
3556 auto port =
module.getArgument(i);
3560 for (
auto &
use :
port.getUses())
3563 if (
auto subfieldOp = mlir::dyn_cast<circt::firrtl::SubfieldOp>(
user))
3583 user->print(::llvm::outs());
3592#ifdef FIRRTL_RUNTIME_ASSERTIONS
3594 auto body = &
module.getBody().back();
3598 for (
size_t i = 0;
i <
module.getNumPorts(); ++
i)
3600 auto portName =
module.getPortName(i);
3601 auto port =
module.getArgument(i);
3607 if (data.getResult().getType().dyn_cast<circt::firrtl::BundleType>())
3619 std::string(
portName) +
"_prev_ready_reg");
3627 std::string(
portName) +
"_prev_valid_reg");
3631 data.getResult().getType(),
3633 std::string(
portName) +
"_prev_data_reg");
3647 std::string(
portName) +
"_valid went down without firing",
3649 std::string(
portName) +
"_valid_assert");
3657 std::string(
portName) +
"_ready went down without firing",
3659 std::string(
portName) +
"_ready_assert");
3672 std::string(
portName) +
"_data changed without firing",
3674 std::string(
portName) +
"_data_assert");
3681circt::firrtl::InstanceOp
3690 auto module = MlirGen(sn);
3691 if (circt::isa<circt::firrtl::FModuleOp>(module))
3692 check_module(circt::cast<circt::firrtl::FModuleOp>(module));
3701 auto module = MlirGen(ln, circuitBody);
3709 return Builder_->create<circt::firrtl::InstanceOp>(
3715circt::firrtl::ConstantOp
3719 auto constant =
Builder_->create<circt::firrtl::ConstantOp>(
3722 ::llvm::APInt(size, value));
3723 body->push_back(constant);
3727circt::firrtl::InvalidValueOp
3742 Builder_->create<circt::firrtl::InvalidValueOp>(
Builder_->getUnknownLoc(), value.getType());
3751 auto clock =
module.getArgument(0);
3752 auto ctype =
clock.getType().cast<circt::firrtl::FIRRTLType>();
3753 if (!
ctype.isa<circt::firrtl::ClockType>())
3764 auto reset =
module.getArgument(1);
3765 auto rtype = reset.getType().cast<circt::firrtl::FIRRTLType>();
3766 if (!
rtype.isa<circt::firrtl::ResetType>())
3773circt::firrtl::BundleType::BundleElement
3776 using BundleElement = circt::firrtl::BundleType::BundleElement;
3781 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 1));
3784circt::firrtl::BundleType::BundleElement
3787 using BundleElement = circt::firrtl::BundleType::BundleElement;
3792 circt::firrtl::IntType::get(
Builder_->getContext(),
false, 1));
3798 mlir::BlockArgument
mem =
GetPort(module,
"mem_req");
3799 mlir::Block *
body =
module.getBodyBlock();
3823circt::firrtl::FModuleOp
3827 ::llvm::SmallVector<circt::firrtl::PortInfo>
ports;
3835 std::string name(
"i");
3836 name.append(std::to_string(
i));
3839 circt::firrtl::Direction::In,
3845 std::string name(
"o");
3846 name.append(std::to_string(
i));
3849 circt::firrtl::Direction::Out,
3864 return Builder_->create<circt::firrtl::FModuleOp>(
3867 circt::firrtl::ConventionAttr::get(
3869 circt::firrtl::Convention::Internal),
3878circt::firrtl::IntType
3881 return circt::firrtl::IntType::get(
Builder_->getContext(),
false, size);
3888circt::firrtl::IntType
3894circt::firrtl::FIRRTLBaseType
3899 using BundleElement = circt::firrtl::BundleType::BundleElement;
3900 ::llvm::SmallVector<BundleElement>
elements;
3901 for (
size_t i = 0;
i <
bt->elements_.size(); ++
i)
3903 auto t = &
bt->elements_.at(
i);
3934 const rvsdg::Type * pointeeType =
op->getPointeeType().get();
3941 pointeeType =
nullptr;
3945 pointeeType = &
arrayType->element_type();
3953 throw std::logic_error(pointeeType->
debug_string() +
" pointer not implemented!");
3974 append.append(std::to_string(
3975 std::dynamic_pointer_cast<const llvm::ArrayType>(
op->result(0))->nelements()));
4001 for (
const auto &
pair :
op)
4014 const circt::firrtl::FModuleOp
fModuleOp,
4036 auto module = mlir::ModuleOp::create(Builder_->getUnknownLoc());
4037 module.push_back(circuit);
4040 if (
failed(mlir::verify(module)))
4042 module.emitError("module verification error");
4043 throw std::logic_error(
"Verification of firrtl failed");
4046 module.print(::llvm::outs());
4061 std::cout <<
"\nWritten firrtl to " <<
fileName <<
"\n";
4068 auto module = mlir::ModuleOp::create(Builder_->getUnknownLoc());
4069 module.push_back(circuit);
4072 if (
failed(mlir::verify(module)))
4074 module.emitError("module verification error");
4075 module.print(::llvm::outs());
4076 throw std::logic_error(
"Verification of firrtl failed");
4086 throw std::logic_error(
"Exporting of firrtl failed");
4091circt::firrtl::FExtModuleOp
4095 ::llvm::SmallVector<circt::firrtl::PortInfo>
ports;
4103 std::string name(
"i");
4104 name.append(std::to_string(
i));
4107 circt::firrtl::Direction::In,
4113 std::string name(
"o");
4114 name.append(std::to_string(
i));
4117 circt::firrtl::Direction::Out,
4126 return Builder_->create<circt::firrtl::FExtModuleOp>(
4129 circt::firrtl::ConventionAttr::get(
4131 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)
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)
jlm::rvsdg::Output * TraceArgument(rvsdg::RegionArgument *arg)
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.
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.
StructuralInput * input() const noexcept
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)