Jlm
Loading...
Searching...
No Matches
RhlsToFirrtlConverterTests.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2026 Magnus Sjalander <work@sjalander.com>
3 * See COPYING for terms of redistribution.
4 */
5
6#include <gtest/gtest.h>
7
9#include <jlm/hls/ir/hls.hpp>
17#include <jlm/llvm/ir/types.hpp>
19#include <jlm/rvsdg/control.hpp>
20#include <jlm/rvsdg/lambda.hpp>
22
23#include <mlir/IR/OwningOpRef.h>
24
25using namespace jlm::hls;
26using namespace jlm::rvsdg;
27using namespace jlm::llvm;
28
29namespace jlm::hls
30{
32{
33public:
34 bool
39
40 circt::firrtl::CircuitOp
45};
46}
47
48/* ================================================================== */
49/* Base fixture: module + assert helpers */
50/* ================================================================== */
51
52class FirrtlTestBase : public ::testing::Test
53{
54protected:
55 std::unique_ptr<LlvmRvsdgModule> Module_{};
56 LambdaNode * Lambda_ = nullptr;
57
58 template<typename OpT>
59 bool
60 AssertFirrtlOpExists(mlir::Operation * circuit)
61 {
62 bool found = false;
63 circuit->walk(
64 [&found](mlir::Operation * op)
65 {
66 if (::mlir::isa<OpT>(op))
67 found = true;
68 });
69 return found;
70 }
71
72 template<typename OpT>
73 bool
74 AssertFirrtlOpExists(mlir::OwningOpRef<circt::firrtl::CircuitOp> & circuit)
75 {
76 return AssertFirrtlOpExists<OpT>(circuit->getOperation());
77 }
78
79 void
80 SetUp() override
81 {
83 Lambda_ = nullptr;
84 }
85};
86
87/* ================================================================== */
88/* Fixture: default lambda with 2x32-bit inputs, 32-bit output */
89/* ================================================================== */
90
92{
93protected:
96 const std::vector<std::shared_ptr<const Type>> & inputs,
97 const std::vector<std::shared_ptr<const Type>> & outputs)
98 {
101 Module_->Rvsdg().GetRootRegion(),
102 LlvmLambdaOperation::Create(functionType, "test", Linkage::externalLinkage));
103 return Lambda_;
104 }
105
106 template<typename OpT>
107 void
109 {
111 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
113 }
114
115 void
116 SetUp() override
117 {
120 }
121};
122
123/* ================================================================== */
124/* IsIdentityMapping tests */
125/* ================================================================== */
126
127class IdentityMappingTest : public ::testing::Test
128{
129protected:
130 std::unique_ptr<LlvmRvsdgModule> Module_{};
132
133 const MatchOperation *
134 CreateMatchOp(const std::unordered_map<uint64_t, uint64_t> & mapping, uint64_t nalternatives)
135 {
136 auto * predicate =
137 IntegerConstantOperation::Create(Module_->Rvsdg().GetRootRegion(), 2, 0).output(0);
138 auto & node = MatchOperation::CreateNode(*predicate, mapping, 0, nalternatives);
139 return dynamic_cast<const MatchOperation *>(&node.GetOperation());
140 }
141
142 void
143 SetUp() override
144 {
146 }
147};
148
150{
151 auto * matchOp = CreateMatchOp({ { 0, 0 }, { 1, 1 }, { 2, 2 } }, 3);
152 EXPECT_TRUE(Converter_.TestIsIdentityMapping(*matchOp));
153}
154
156{
157 auto * matchOp = CreateMatchOp({ { 0, 1 }, { 1, 0 } }, 2);
158 EXPECT_FALSE(Converter_.TestIsIdentityMapping(*matchOp));
159}
160
162{
163 auto * matchOp = CreateMatchOp({}, 2);
164 EXPECT_TRUE(Converter_.TestIsIdentityMapping(*matchOp));
165}
166
168{
169 auto * matchOp = CreateMatchOp({ { 0, 0 }, { 1, 2 } }, 3);
170 EXPECT_FALSE(Converter_.TestIsIdentityMapping(*matchOp));
171}
172
173/* ================================================================== */
174/* MatchOperation semantic tests */
175/* ================================================================== */
176
178{
179 auto * matchOp = CreateMatchOp({ { 0, 1 }, { 1, 3 }, { 2, 0 } }, 4);
180 EXPECT_EQ(matchOp->alternative(0), 1u);
181 EXPECT_EQ(matchOp->alternative(1), 3u);
182 EXPECT_EQ(matchOp->alternative(2), 0u);
183}
184
186{
187 auto * predicate =
188 IntegerConstantOperation::Create(Module_->Rvsdg().GetRootRegion(), 4, 0).output(0);
189 auto & node = MatchOperation::CreateNode(*predicate, { { 0, 1 }, { 2, 3 } }, 7, 8);
190 auto * matchOp = dynamic_cast<const MatchOperation *>(&node.GetOperation());
191 EXPECT_EQ(matchOp->alternative(1), 7u);
192 EXPECT_EQ(matchOp->alternative(3), 7u);
193}
194
196{
197 auto * matchOp = CreateMatchOp({ { 0, 1 } }, 4);
198 EXPECT_EQ(matchOp->default_alternative(), 0u);
199}
200
202{
203 auto * matchOp = CreateMatchOp({ { 0, 0 }, { 1, 1 } }, 16);
204 EXPECT_EQ(matchOp->nalternatives(), 16u);
205}
206
208{
209 auto * predicate =
210 IntegerConstantOperation::Create(Module_->Rvsdg().GetRootRegion(), 32, 0).output(0);
211 auto & node = MatchOperation::CreateNode(*predicate, { { 0, 0 } }, 0, 2);
212 auto * matchOp = dynamic_cast<const MatchOperation *>(&node.GetOperation());
213 EXPECT_EQ(matchOp->nbits(), 32u);
214}
215
217{
218 auto * matchOp = CreateMatchOp({ { 0, 10 }, { 1, 20 }, { 2, 30 } }, 3);
219 std::unordered_map<uint64_t, uint64_t> collected;
220 for (auto it = matchOp->begin(); it != matchOp->end(); ++it)
221 collected[it->first] = it->second;
222 EXPECT_EQ(collected.size(), 3u);
223 EXPECT_EQ(collected.at(0), 10u);
224 EXPECT_EQ(collected.at(1), 20u);
225 EXPECT_EQ(collected.at(2), 30u);
226}
227
229{
230 auto * matchOp1 = CreateMatchOp({ { 0, 1 }, { 1, 0 } }, 3);
231 auto * matchOp2 = CreateMatchOp({ { 0, 1 }, { 1, 0 } }, 3);
233}
234
236{
237 auto * matchOp1 = CreateMatchOp({ { 0, 0 }, { 1, 1 } }, 2);
238 auto * matchOp2 = CreateMatchOp({ { 0, 1 }, { 1, 0 } }, 2);
240}
241
242/* ================================================================== */
243/* Binary operation FIRRTL conversion tests */
244/* ================================================================== */
245
247{
248 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
249 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
250 auto & addNode = IntegerAddOperation::createNode(32, arg0, arg1);
251 Lambda_->finalize({ addNode.output(0) });
252
254}
255
257{
258 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
259 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
261 Lambda_->finalize({ subNode.output(0) });
262
264}
265
267{
268 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
269 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
271 Lambda_->finalize({ mulNode.output(0) });
272
274}
275
277{
278 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
279 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
281 Lambda_->finalize({ andNode.output(0) });
282
284}
285
287{
288 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
289 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
291 Lambda_->finalize({ orNode.output(0) });
292
294}
295
297{
298 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
299 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
301 Lambda_->finalize({ xorNode.output(0) });
302
304}
305
306/* ================================================================== */
307/* Shift operation FIRRTL conversion tests */
308/* ================================================================== */
309
311{
312 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
313 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
315 Lambda_->finalize({ shlNode.output(0) });
316
318}
319
321{
322 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
323 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
325 Lambda_->finalize({ lshrNode.output(0) });
326
328}
329
330/* ================================================================== */
331/* Signed arithmetic operation FIRRTL conversion tests */
332/* ================================================================== */
333
335{
336 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
337 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
339 Lambda_->finalize({ sdivNode.output(0) });
340
342 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
346}
347
349{
350 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
351 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
353 Lambda_->finalize({ ashrNode.output(0) });
354
356 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
360}
361
363{
364 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
365 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
367 Lambda_->finalize({ sremNode.output(0) });
368
370 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
374}
375
376/* ================================================================== */
377/* Comparison operation FIRRTL conversion tests */
378/* ================================================================== */
379
381{
382 Lambda_ = CreateLambda({ BitType::Create(32), BitType::Create(32) }, { BitType::Create(1) });
383
384 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
385 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
387 Lambda_->finalize({ eqNode.output(0) });
388
390}
391
393{
394 Lambda_ = CreateLambda({ BitType::Create(32), BitType::Create(32) }, { BitType::Create(1) });
395
396 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
397 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
399 Lambda_->finalize({ neqNode.output(0) });
400
402}
403
405{
406 Lambda_ = CreateLambda({ BitType::Create(32), BitType::Create(32) }, { BitType::Create(1) });
407
408 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
409 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
411 Lambda_->finalize({ sgtNode.output(0) });
412
414 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
417}
418
420{
421 Lambda_ = CreateLambda({ BitType::Create(32), BitType::Create(32) }, { BitType::Create(1) });
422
423 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
424 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
426 Lambda_->finalize({ sltNode.output(0) });
427
429 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
432}
433
435{
436 Lambda_ = CreateLambda({ BitType::Create(32), BitType::Create(32) }, { BitType::Create(1) });
437
438 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
439 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
441 Lambda_->finalize({ sleNode.output(0) });
442
444 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
447}
448
450{
451 Lambda_ = CreateLambda({ BitType::Create(32), BitType::Create(32) }, { BitType::Create(1) });
452
453 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
454 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
456 Lambda_->finalize({ sgeNode.output(0) });
457
459 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
462}
463
465{
466 Lambda_ = CreateLambda({ BitType::Create(32), BitType::Create(32) }, { BitType::Create(1) });
467
468 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
469 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
471 Lambda_->finalize({ ultNode.output(0) });
472
474}
475
477{
478 Lambda_ = CreateLambda({ BitType::Create(32), BitType::Create(32) }, { BitType::Create(1) });
479
480 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
481 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
483 Lambda_->finalize({ uleNode.output(0) });
484
486}
487
489{
490 Lambda_ = CreateLambda({ BitType::Create(32), BitType::Create(32) }, { BitType::Create(1) });
491
492 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
493 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
495 Lambda_->finalize({ ugtNode.output(0) });
496
498}
499
501{
502 Lambda_ = CreateLambda({ BitType::Create(32), BitType::Create(32) }, { BitType::Create(1) });
503
504 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
505 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
507 Lambda_->finalize({ ugeNode.output(0) });
508
510}
511
512/* ================================================================== */
513/* Unary operation FIRRTL conversion tests */
514/* ================================================================== */
515
517{
518 Lambda_ = CreateLambda({ BitType::Create(32) }, { BitType::Create(16) });
519
520 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
522 Lambda_->finalize({ &truncOutput });
523
525}
526
528{
529 Lambda_ = CreateLambda({ BitType::Create(16) }, { BitType::Create(32) });
530
531 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
533 Lambda_->finalize({ &sextOutput });
534
536 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
540}
541
542/* ================================================================== */
543/* Constant operation FIRRTL conversion tests */
544/* ================================================================== */
545
547{
548 Lambda_ = CreateLambda({}, { BitType::Create(32) });
549
550 auto & constantNode = IntegerConstantOperation::Create(*Lambda_->subregion(), 32, 42);
551 Lambda_->finalize({ constantNode.output(0) });
552
554}
555
557{
558 Lambda_ = CreateLambda({}, { BitType::Create(32) });
559
560 auto * undefOutput = UndefValueOperation::Create(*Lambda_->subregion(), BitType::Create(32));
561 Lambda_->finalize({ undefOutput });
562
564 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
566}
567
568/* ================================================================== */
569/* Pass-through operation FIRRTL conversion tests */
570/* ================================================================== */
571
573{
574 Lambda_ = CreateLambda({ BitType::Create(32) }, { BitType::Create(32) });
575
576 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
578 Lambda_->finalize({ bitcastOutput });
579
581 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
583}
584
586{
587 Lambda_ = CreateLambda({ BitType::Create(16) }, { BitType::Create(32) });
588
589 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
591 Lambda_->finalize({ &zextOutput });
592
594 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
596}
597
598/* ================================================================== */
599/* IntegerToPointerOperation FIRRTL conversion test */
600/* ================================================================== */
601
603{
605 Lambda_ = CreateLambda({ BitType::Create(32) }, { ptrType });
606
607 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
609 Lambda_->finalize({ itopOutput });
610
612 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
614}
615
616/* ================================================================== */
617/* MatchOperation non-identity FIRRTL conversion tests */
618/* ================================================================== */
619
621{
622protected:
623 LambdaNode *
625 {
626 auto functionType =
629 Module_->Rvsdg().GetRootRegion(),
630 LlvmLambdaOperation::Create(functionType, "test", Linkage::externalLinkage));
631 return Lambda_;
632 }
633};
634
636{
637 CreateMatchLambda(32, 4);
638
639 auto & predicate = *Lambda_->GetFunctionArguments()[0];
640 auto & node = MatchOperation::CreateNode(
641 predicate,
642 std::unordered_map<uint64_t, uint64_t>{ { 0, 3 }, { 1, 2 }, { 2, 1 }, { 3, 0 } },
643 0,
644 4);
645 Lambda_->finalize({ node.output(0) });
646
648 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
651}
652
654{
655 CreateMatchLambda(32, 4);
656
657 auto & predicate = *Lambda_->GetFunctionArguments()[0];
658 auto & node = MatchOperation::CreateNode(
659 predicate,
660 std::unordered_map<uint64_t, uint64_t>{ { 0, 5 }, { 2, 3 } },
661 7,
662 4);
663 Lambda_->finalize({ node.output(0) });
664
666 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
670}
671
673{
674 CreateMatchLambda(32, 4);
675
676 auto & predicate = *Lambda_->GetFunctionArguments()[0];
677 auto & node =
678 MatchOperation::CreateNode(predicate, std::unordered_map<uint64_t, uint64_t>{}, 0, 4);
679 Lambda_->finalize({ node.output(0) });
680
682 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
684}
685
687{
689 Lambda_ = LambdaNode::Create(
690 Module_->Rvsdg().GetRootRegion(),
691 LlvmLambdaOperation::Create(functionType, "test", Linkage::externalLinkage));
692
693 auto & predicate = *Lambda_->GetFunctionArguments()[0];
694 auto & node =
695 MatchOperation::CreateNode(predicate, std::unordered_map<uint64_t, uint64_t>{}, 0, 4);
696 Lambda_->finalize({ node.output(0) });
697
699 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
704}
705
706/* ================================================================== */
707/* ControlConstantOperation FIRRTL conversion test */
708/* ================================================================== */
709
711{
712protected:
713 void
714 SetUp() override
715 {
719 Module_->Rvsdg().GetRootRegion(),
720 LlvmLambdaOperation::Create(functionType, "test", Linkage::externalLinkage));
721 }
722};
723
725{
726 auto & controlValue = ControlConstantOperation::create(*Lambda_->subregion(), 4, 2);
727 Lambda_->finalize({ &controlValue });
728
730 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
732}
733
734/* ================================================================== */
735/* Memory state pass-through FIRRTL conversion tests */
736/* ================================================================== */
737
739{
741 auto functionType =
743 Lambda_ = LambdaNode::Create(
744 Module_->Rvsdg().GetRootRegion(),
745 LlvmLambdaOperation::Create(functionType, "test", Linkage::externalLinkage));
746
747 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
748 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
749 auto * mergeOutput =
750 MemoryStateMergeOperation::Create(std::vector<jlm::rvsdg::Output *>{ &arg0, &arg1 });
751 Lambda_->finalize({ mergeOutput });
752
754 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
756}
757
759{
761 auto functionType =
763 Lambda_ = LambdaNode::Create(
764 Module_->Rvsdg().GetRootRegion(),
765 LlvmLambdaOperation::Create(functionType, "test", Linkage::externalLinkage));
766
767 auto & arg0 = *Lambda_->GetFunctionArguments()[0];
768 auto & arg1 = *Lambda_->GetFunctionArguments()[1];
770 *Lambda_->subregion(),
771 { &arg0, &arg1 },
772 { 0, 1 });
773 Lambda_->finalize({ mergeOutput.output(0) });
774
776 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
778}
779
780/* ================================================================== */
781/* Error handling tests */
782/* ================================================================== */
783
785{
786 auto bitType = BitType::Create(32);
788 Lambda_ = LambdaNode::Create(
789 Module_->Rvsdg().GetRootRegion(),
790 LlvmLambdaOperation::Create(functionType, "test", Linkage::externalLinkage));
791
792 auto * testNode = jlm::rvsdg::TestOperation::createNode(Lambda_->subregion(), {}, { bitType });
793 Lambda_->finalize({ testNode->output(0) });
794
796 bool exceptionThrown = false;
797
798 try
799 {
800 converter.TestMlirGen(Lambda_);
801 }
802 catch (const std::logic_error &)
803 {
804 exceptionThrown = true;
805 }
806
808}
809
810/* ================================================================== */
811/* MuxOperation FIRRTL conversion tests */
812/* ================================================================== */
813
815{
817 auto bitType = BitType::Create(32);
819 Lambda_ = LambdaNode::Create(
820 Module_->Rvsdg().GetRootRegion(),
821 LlvmLambdaOperation::Create(functionType, "test", Linkage::externalLinkage));
822
823 auto & predicate = *Lambda_->GetFunctionArguments()[0];
824 auto & value0 = *Lambda_->GetFunctionArguments()[1];
825 auto & value1 = *Lambda_->GetFunctionArguments()[2];
826 auto muxOutputs = MuxOperation::create(predicate, { &value0, &value1 }, true, false);
827 Lambda_->finalize({ muxOutputs[0] });
828
830 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
833}
834
836{
838 auto bitType = BitType::Create(32);
840 Lambda_ = LambdaNode::Create(
841 Module_->Rvsdg().GetRootRegion(),
842 LlvmLambdaOperation::Create(functionType, "test", Linkage::externalLinkage));
843
844 auto & predicate = *Lambda_->GetFunctionArguments()[0];
845 auto & value0 = *Lambda_->GetFunctionArguments()[1];
846 auto & value1 = *Lambda_->GetFunctionArguments()[2];
847 auto & value2 = *Lambda_->GetFunctionArguments()[3];
848 auto muxOutputs = MuxOperation::create(predicate, { &value0, &value1, &value2 }, true, false);
849 Lambda_->finalize({ muxOutputs[0] });
850
852 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
855}
856
857/* ================================================================== */
858/* GetElementPtrOperation FIRRTL conversion test */
859/* ================================================================== */
860
862{
864 auto bitType = BitType::Create(32);
867 Lambda_ = LambdaNode::Create(
868 Module_->Rvsdg().GetRootRegion(),
869 LlvmLambdaOperation::Create(functionType, "test", Linkage::externalLinkage));
870
871 auto & ptr = *Lambda_->GetFunctionArguments()[0];
872 auto & index = *Lambda_->GetFunctionArguments()[1];
873 auto * gepOutput = GetElementPtrOperation::create(&ptr, { &index }, arrayType);
874 Lambda_->finalize({ gepOutput });
875
877 mlir::OwningOpRef<circt::firrtl::CircuitOp> circuit(converter.TestMlirGen(Lambda_));
882}
TEST_F(IdentityMappingTest, IdentityMapping)
LambdaNode * CreateLambda(const std::vector< std::shared_ptr< const Type > > &inputs, const std::vector< std::shared_ptr< const Type > > &outputs)
LambdaNode * CreateMatchLambda(int predicateBits, int outBits)
std::unique_ptr< LlvmRvsdgModule > Module_
bool AssertFirrtlOpExists(mlir::OwningOpRef< circt::firrtl::CircuitOp > &circuit)
bool AssertFirrtlOpExists(mlir::Operation *circuit)
const MatchOperation * CreateMatchOp(const std::unordered_map< uint64_t, uint64_t > &mapping, uint64_t nalternatives)
std::unique_ptr< LlvmRvsdgModule > Module_
TestableRhlsToFirrtlConverter Converter_
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &predicate, const std::vector< jlm::rvsdg::Output * > &alternatives, bool discarding, bool loop=false)
Definition hls.hpp:235
bool IsIdentityMapping(const rvsdg::MatchOperation &op)
circt::firrtl::CircuitOp MlirGen(const rvsdg::LambdaNode *lamdaNode)
bool TestIsIdentityMapping(const rvsdg::MatchOperation &op)
circt::firrtl::CircuitOp TestMlirGen(const rvsdg::LambdaNode *lambdaNode)
static std::shared_ptr< const ArrayType > Create(std::shared_ptr< const Type > type, size_t nelements)
Definition types.hpp:98
static jlm::rvsdg::Output * create(jlm::rvsdg::Output *operand, std::shared_ptr< const jlm::rvsdg::Type > rtype)
static rvsdg::Output * create(rvsdg::Output *baseAddress, const std::vector< rvsdg::Output * > &indices, std::shared_ptr< const rvsdg::Type > gepType)
static std::unique_ptr< ThreeAddressCode > create(const Variable *argument)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & Create(rvsdg::Region &region, IntegerValueRepresentation representation)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::SimpleNode & CreateNode(rvsdg::Region &region, const std::vector< rvsdg::Output * > &operands, const std::vector< MemoryNodeId > &memoryNodeIds)
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 std::unique_ptr< LlvmRvsdgModule > Create(const util::FilePath &sourceFileName, const std::string &targetTriple, const std::string &dataLayout)
static rvsdg::Output * Create(const std::vector< rvsdg::Output * > &operands)
static std::shared_ptr< const MemoryStateType > Create()
Definition types.cpp:379
static std::shared_ptr< const PointerType > Create()
Definition types.cpp:45
static rvsdg::Output & create(size_t ndstbits, rvsdg::Output &operand)
static rvsdg::Output & create(size_t ndstbits, rvsdg::Output &operand)
static jlm::rvsdg::Output * Create(rvsdg::Region &region, std::shared_ptr< const jlm::rvsdg::Type > type)
static rvsdg::Output & create(size_t ndstbits, rvsdg::Output &operand)
static std::shared_ptr< const BitType > Create(std::size_t nbits)
Creates bit type of specified width.
Definition type.cpp:45
static Output & create(Region &region, ControlValueRepresentation value)
Definition control.hpp:122
static std::shared_ptr< const ControlType > Create(std::size_t nalternatives)
Instantiates control type.
Definition control.cpp:50
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 LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
Definition lambda.cpp:141
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:220
NodeOutput * output(size_t index) const noexcept
Definition node.hpp:650
static SimpleNode * createNode(Region *region, const std::vector< Output * > &operands, std::vector< std::shared_ptr< const Type > > resultTypes)
Global memory state passed between functions.
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)
Definition node.hpp:1058
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
Definition node.hpp:872