29
29
#include " absl/random/distributions.h"
30
30
#include " absl/status/status.h"
31
31
#include " absl/status/statusor.h"
32
+ #include " absl/strings/str_cat.h"
32
33
#include " absl/strings/str_format.h"
33
34
#include " absl/types/span.h"
34
35
#include " xls/common/status/ret_check.h"
35
36
#include " xls/common/status/status_macros.h"
36
37
#include " xls/ir/bits.h"
37
38
#include " xls/ir/block.h"
39
+ #include " xls/ir/block_elaboration.h"
40
+ #include " xls/ir/elaboration.h"
38
41
#include " xls/ir/events.h"
39
42
#include " xls/ir/node.h"
40
43
#include " xls/ir/nodes.h"
@@ -179,16 +182,24 @@ absl::StatusOr<std::vector<absl::flat_hash_map<std::string, Value>>>
179
182
BlockEvaluator::EvaluateSequentialBlock (
180
183
Block* block,
181
184
absl::Span<const absl::flat_hash_map<std::string, Value>> inputs) const {
185
+ XLS_ASSIGN_OR_RETURN (BlockElaboration elaboration,
186
+ BlockElaboration::Elaborate (block));
182
187
// Initial register state is zero for all registers.
183
188
absl::flat_hash_map<std::string, Value> reg_state;
184
- for (Register* reg : block->GetRegisters ()) {
185
- reg_state[reg->name ()] = ZeroOfType (reg->type ());
189
+ for (BlockInstance* inst : elaboration.instances ()) {
190
+ if (!inst->block ().has_value ()) {
191
+ continue ;
192
+ }
193
+ for (Register* reg : inst->block ().value ()->GetRegisters ()) {
194
+ reg_state[absl::StrCat (inst->RegisterPrefix (), reg->name ())] =
195
+ ZeroOfType (reg->type ());
196
+ }
186
197
}
187
198
188
199
std::vector<absl::flat_hash_map<std::string, Value>> outputs;
189
200
for (const absl::flat_hash_map<std::string, Value>& input_set : inputs) {
190
201
XLS_ASSIGN_OR_RETURN (BlockRunResult result,
191
- EvaluateBlock (input_set, reg_state, block ));
202
+ EvaluateBlock (input_set, reg_state, elaboration ));
192
203
outputs.push_back (std::move (result.outputs ));
193
204
reg_state = std::move (result.reg_state );
194
205
}
@@ -394,10 +405,21 @@ BlockEvaluator::EvaluateChannelizedSequentialBlock(
394
405
std::minstd_rand random_engine;
395
406
random_engine.seed (seed);
396
407
408
+ XLS_ASSIGN_OR_RETURN (BlockElaboration elaboration,
409
+ BlockElaboration::Elaborate (block));
410
+
397
411
// Initial register state is zero for all registers.
398
412
absl::flat_hash_map<std::string, Value> reg_state;
399
- for (Register* reg : block->GetRegisters ()) {
400
- reg_state[reg->name ()] = ZeroOfType (reg->type ());
413
+ for (BlockInstance* inst : elaboration.instances ()) {
414
+ // Instance isn't a BlockInstantiation, must be e.g. a FIFO or FFI
415
+ // instantiation. No registers to initialize.
416
+ if (!inst->block ().has_value ()) {
417
+ continue ;
418
+ }
419
+ for (Register* reg : inst->block ().value ()->GetRegisters ()) {
420
+ reg_state[absl::StrCat (inst->RegisterPrefix (), reg->name ())] =
421
+ ZeroOfType (reg->type ());
422
+ }
401
423
}
402
424
403
425
int64_t max_cycle_count = inputs.size ();
@@ -427,7 +449,7 @@ BlockEvaluator::EvaluateChannelizedSequentialBlock(
427
449
428
450
// Block results
429
451
XLS_ASSIGN_OR_RETURN (BlockRunResult result,
430
- EvaluateBlock (input_set, reg_state, block ));
452
+ EvaluateBlock (input_set, reg_state, elaboration ));
431
453
432
454
// Sources get ready
433
455
for (ChannelSource& src : channel_sources) {
@@ -503,9 +525,10 @@ BlockEvaluator::EvaluateChannelizedSequentialBlockWithUint64(
503
525
namespace {
504
526
class BaseBlockContinuation final : public BlockContinuation {
505
527
public:
506
- BaseBlockContinuation (Block* block, BlockRunResult&& initial_result,
528
+ BaseBlockContinuation (BlockElaboration&& block,
529
+ BlockRunResult&& initial_result,
507
530
const BlockEvaluator& evaluator)
508
- : block_( block),
531
+ : elaboration_(std::move( block) ),
509
532
last_result_ (std::move(initial_result)),
510
533
evaluator_(evaluator) {}
511
534
@@ -525,7 +548,7 @@ class BaseBlockContinuation final : public BlockContinuation {
525
548
const absl::flat_hash_map<std::string, Value>& inputs) final {
526
549
XLS_ASSIGN_OR_RETURN (
527
550
last_result_,
528
- evaluator_.EvaluateBlock (inputs, last_result_.reg_state , block_ ));
551
+ evaluator_.EvaluateBlock (inputs, last_result_.reg_state , elaboration_ ));
529
552
return absl::OkStatus ();
530
553
}
531
554
@@ -540,7 +563,7 @@ class BaseBlockContinuation final : public BlockContinuation {
540
563
}
541
564
542
565
private:
543
- Block* block_ ;
566
+ BlockElaboration elaboration_ ;
544
567
BlockRunResult last_result_;
545
568
const BlockEvaluator& evaluator_;
546
569
};
@@ -550,18 +573,36 @@ absl::StatusOr<std::unique_ptr<BlockContinuation>>
550
573
BlockEvaluator::NewContinuation (
551
574
Block* block,
552
575
const absl::flat_hash_map<std::string, Value>& initial_registers) const {
553
- return std::make_unique<BaseBlockContinuation>(
554
- block, BlockRunResult{.reg_state = initial_registers}, *this );
576
+ XLS_ASSIGN_OR_RETURN (BlockElaboration elaboration,
577
+ BlockElaboration::Elaborate (block));
578
+ return NewContinuation (std::move (elaboration), initial_registers);
555
579
}
556
580
557
581
absl::StatusOr<std::unique_ptr<BlockContinuation>>
558
582
BlockEvaluator::NewContinuation (Block* block) const {
583
+ XLS_ASSIGN_OR_RETURN (BlockElaboration elaboration,
584
+ BlockElaboration::Elaborate (block));
559
585
absl::flat_hash_map<std::string, Value> regs;
560
586
regs.reserve (block->GetRegisters ().size ());
561
- for (const auto reg : block->GetRegisters ()) {
562
- regs[reg->name ()] = ZeroOfType (reg->type ());
587
+ for (BlockInstance* inst : elaboration.instances ()) {
588
+ if (!inst->block ().has_value ()) {
589
+ continue ;
590
+ }
591
+ for (const auto reg : inst->block ().value ()->GetRegisters ()) {
592
+ regs[absl::StrCat (inst->RegisterPrefix (), reg->name ())] =
593
+ ZeroOfType (reg->type ());
594
+ }
563
595
}
564
- return NewContinuation (block, regs);
596
+ return NewContinuation (std::move (elaboration), regs);
597
+ }
598
+
599
+ absl::StatusOr<std::unique_ptr<BlockContinuation>>
600
+ BlockEvaluator::NewContinuation (
601
+ BlockElaboration&& elaboration,
602
+ const absl::flat_hash_map<std::string, Value>& initial_registers) const {
603
+ return std::make_unique<BaseBlockContinuation>(
604
+ std::move (elaboration), BlockRunResult{.reg_state = initial_registers},
605
+ *this );
565
606
}
566
607
567
608
} // namespace xls
0 commit comments