ReadyValidPipeline.multi constructor
Creates a ReadyValidPipeline with multiple triggers.
Implementation
ReadyValidPipeline.multi(
super._clks,
this.validPipeIn,
this.readyPipeOut, {
List<List<Conditional> Function(PipelineStageInfo p)> stages = const [],
super.resetValues,
List<Logic> signals = const [],
super.reset,
}) : super.multi(
stages: stages,
signals: [validPipeIn, ...signals],
stalls: List.generate(stages.length,
(index) => Logic(name: 'stall_$index', naming: Naming.mergeable)),
) {
final valid = validPipeIn;
final stalls = _stages.map((stage) => stage.stall).toList()
..removeLast(); // garbage value at the end
final readys = List.generate(stages.length,
(index) => Logic(name: 'ready_$index', naming: Naming.mergeable))
..add(readyPipeOut);
for (var i = 0; i < stalls.length; i++) {
readys[i] <= ~get(valid, i + 1) | readys[i + 1];
stalls[i]! <= get(valid, i + 1) & ~readys[i + 1];
}
validPipeOut = get(valid);
readyPipeIn = readys[0];
}