ReadyValidPipeline.multi constructor

ReadyValidPipeline.multi(
  1. List<Logic> _clks,
  2. Logic validPipeIn,
  3. Logic readyPipeOut,
  4. {List<List<Conditional> Function(PipelineStageInfo p)> stages = const [],
  5. Map<Logic, Const> resetValues = const {},
  6. List<Logic> signals = const [],
  7. Logic? reset}
)

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];
}