unit::alu_branch: convert *MOp functions to hdl_module
All checks were successful
/ test (pull_request) Successful in 6m55s

This commit is contained in:
Jacob Lifshay 2026-05-26 20:10:41 -07:00
parent 42056ce6b5
commit a3898e8c13
Signed by: programmerjake
SSH key fingerprint: SHA256:HnFTLGpSm4Q4Fj502oCFisjZSoakwEuTsJJMSke63RQ
5 changed files with 155663 additions and 115637 deletions

View file

@ -26,13 +26,20 @@ use fayalite::{
};
use std::{collections::HashMap, ops::RangeTo};
#[hdl]
fn add_sub<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
global_state: Expr<GlobalState>,
pc: Expr<UInt<64>>,
mop: Expr<AddSubMOp<PRegNum<C>, PRegNum<C>, SrcCount>>,
src_values: Expr<Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }>>,
) -> Expr<TraceAsString<PRegValue>> {
#[hdl_module]
fn add_sub<C: Type + PhantomConstCpuConfig, SrcCount: KnownSize>(config: C) {
#[hdl]
let global_state: GlobalState = m.input();
#[hdl]
let pc: UInt<64> = m.input();
#[hdl]
let mop: TraceAsString<AddSubMOp<PRegNum<C>, PRegNum<C>, SrcCount>> =
m.input(TraceAsString[AddSubMOp[PRegNum[config]][PRegNum[config]][SrcCount::SIZE]]);
#[hdl]
let src_values: Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }> = m.input();
#[hdl]
let output: TraceAsString<PRegValue> = m.output();
#[hdl]
let GlobalState { flags_mode } = global_state;
#[hdl]
@ -42,7 +49,7 @@ fn add_sub<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
src1_is_carry_in,
invert_carry_in,
add_pc,
} = mop;
} = *mop;
#[hdl]
let AluCommonMOp::<_, _, _, _> {
common,
@ -111,8 +118,7 @@ fn add_sub<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
},
));
#[hdl]
let int_fp: UInt<64> = wire();
let int_fp = output.int_fp;
#[hdl]
let x86_cf = wire();
@ -201,12 +207,10 @@ fn add_sub<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
}
}
#[hdl]
let flags = wire();
#[hdl]
match flags_mode {
FlagsMode::PowerISA(_) => {
connect(
flags,
output.flags,
PRegFlagsPowerISA::from_view(PRegFlagsPowerISAView {
unused: ViewUnused::splat(false.to_expr()),
xer_ca: pwr_ca,
@ -222,7 +226,7 @@ fn add_sub<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
}
FlagsMode::X86(_) => {
connect(
flags,
output.flags,
PRegFlagsX86::from_view(PRegFlagsX86View {
unused: ViewUnused::splat(false.to_expr()),
cf: x86_cf,
@ -237,32 +241,44 @@ fn add_sub<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
);
}
}
let retval = #[hdl]
PRegValue { int_fp, flags };
retval.to_trace_as_string()
}
#[hdl]
fn logical_flags<C: PhantomConstCpuConfig>(
global_state: Expr<GlobalState>,
mop: Expr<LogicalFlagsMOp<PRegNum<C>, PRegNum<C>>>,
src_values: Expr<Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }>>,
) -> Expr<TraceAsString<PRegValue>> {
#[hdl_module]
fn logical_flags<C: Type + PhantomConstCpuConfig>(config: C) {
#[hdl]
let global_state: GlobalState = m.input();
#[hdl]
let mop: TraceAsString<LogicalFlagsMOp<PRegNum<C>, PRegNum<C>>> =
m.input(TraceAsString[LogicalFlagsMOp[PRegNum[config]][PRegNum[config]]]);
#[hdl]
let src_values: Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }> = m.input();
#[hdl]
let output: TraceAsString<PRegValue> = m.output();
#[hdl]
let GlobalState { flags_mode: _ } = global_state;
LogicalFlagsMOp::operation(mop, src_values.map(|v| *v)).to_trace_as_string()
connect(
output,
LogicalFlagsMOp::operation(*mop, src_values.map(|v| *v)).to_trace_as_string(),
);
}
#[hdl]
fn logical<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
global_state: Expr<GlobalState>,
mop: Expr<LogicalMOp<PRegNum<C>, PRegNum<C>, SrcCount>>,
src_values: Expr<Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }>>,
) -> Expr<TraceAsString<PRegValue>> {
#[hdl_module]
fn logical<C: Type + PhantomConstCpuConfig, SrcCount: KnownSize>(config: C) {
#[hdl]
let global_state: GlobalState = m.input();
#[hdl]
let mop: TraceAsString<LogicalMOp<PRegNum<C>, PRegNum<C>, SrcCount>> =
m.input(TraceAsString[LogicalMOp[PRegNum[config]][PRegNum[config]][SrcCount::SIZE]]);
#[hdl]
let src_values: Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }> = m.input();
#[hdl]
let output: TraceAsString<PRegValue> = m.output();
#[hdl]
let GlobalState { flags_mode } = global_state;
#[hdl]
let LogicalMOp::<_, _, _> { alu_common, lut } = mop;
let LogicalMOp::<_, _, _> { alu_common, lut } = *mop;
#[hdl]
let AluCommonMOp::<_, _, _, _> {
common,
@ -287,8 +303,6 @@ fn logical<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
let lut4_output = wire();
connect(lut4_output, Lut4::output(lut, lhs.int_fp, rhs.int_fp));
#[hdl]
let logical_result: TraceAsString<PRegValue> = wire();
#[hdl]
let x86_sf = wire();
#[hdl]
match flags_mode {
@ -303,13 +317,13 @@ fn logical<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
cr_gt,
cr_eq,
so,
} = PRegFlags::view::<PRegFlagsPowerISA>(logical_result.flags);
} = PRegFlags::view::<PRegFlagsPowerISA>(output.flags);
unused.clear();
connect(xer_ca, false);
connect(xer_ca32, false);
connect(xer_ov, false);
connect(xer_ov32, false);
let signed_result = logical_result.int_fp.cast_to_static::<SInt<64>>();
let signed_result = output.int_fp.cast_to_static::<SInt<64>>();
connect(cr_lt, signed_result.cmp_lt(0i64));
connect(cr_eq, signed_result.cmp_eq(0i64));
connect(cr_gt, !(cr_lt | cr_eq));
@ -325,29 +339,29 @@ fn logical<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
af,
pf,
df,
} = PRegFlags::view::<PRegFlagsX86>(logical_result.flags);
} = PRegFlags::view::<PRegFlagsX86>(output.flags);
unused.clear();
connect(cf, false);
connect(zf, logical_result.int_fp.cmp_eq(0u64));
connect(zf, output.int_fp.cmp_eq(0u64));
connect(sf, x86_sf);
connect(of, false);
connect(af, false);
connect(pf, logical_result.int_fp[..8].parity_even());
connect(pf, output.int_fp[..8].parity_even());
connect(df, false);
}
}
let connect_output = |width, signed| {
connect(x86_sf, logical_result.int_fp[width - 1]);
connect(x86_sf, output.int_fp[width - 1]);
if signed {
connect(
logical_result.int_fp,
output.int_fp,
lut4_output
.cast_to(SInt[width])
.cast_to_static::<UInt<64>>(),
);
} else {
connect(
logical_result.int_fp,
output.int_fp,
lut4_output
.cast_to(UInt[width])
.cast_to_static::<UInt<64>>(),
@ -358,9 +372,9 @@ fn logical<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
match output_integer_mode {
OutputIntegerMode::Full64 => connect_output(64, false),
OutputIntegerMode::DupLow32 => {
connect(x86_sf, logical_result.int_fp[31]);
connect(x86_sf, output.int_fp[31]);
let v = lut4_output.cast_to_static::<UInt<32>>();
connect_any(logical_result.int_fp, v | (v << 32));
connect_any(output.int_fp, v | (v << 32));
}
OutputIntegerMode::ZeroExt32 => connect_output(32, false),
OutputIntegerMode::SignExt32 => connect_output(32, true),
@ -369,7 +383,6 @@ fn logical<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
OutputIntegerMode::ZeroExt8 => connect_output(8, false),
OutputIntegerMode::SignExt8 => connect_output(8, true),
}
logical_result
}
#[hdl]
@ -438,16 +451,22 @@ fn funnel_shift<W: Size, A: Size>(
funnel_shift_retval
}
#[hdl]
fn shift_rotate<C: PhantomConstCpuConfig>(
global_state: Expr<GlobalState>,
mop: Expr<ShiftRotateMOp<PRegNum<C>, PRegNum<C>>>,
src_values: Expr<Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }>>,
) -> Expr<TraceAsString<PRegValue>> {
#[hdl_module]
fn shift_rotate<C: Type + PhantomConstCpuConfig>(config: C) {
#[hdl]
let global_state: GlobalState = m.input();
#[hdl]
let mop: TraceAsString<ShiftRotateMOp<PRegNum<C>, PRegNum<C>>> =
m.input(TraceAsString[ShiftRotateMOp[PRegNum[config]][PRegNum[config]]]);
#[hdl]
let src_values: Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }> = m.input();
#[hdl]
let output: TraceAsString<PRegValue> = m.output();
#[hdl]
let GlobalState { flags_mode } = global_state;
#[hdl]
let ShiftRotateMOp::<_, _> { alu_common, mode } = mop;
let ShiftRotateMOp::<_, _> { alu_common, mode } = *mop;
#[hdl]
let AluCommonMOp::<_, _, _, _> {
common,
@ -561,8 +580,7 @@ fn shift_rotate<C: PhantomConstCpuConfig>(
} else {
connect(masked, shifted_rotated);
}
#[hdl]
let int_fp: UInt<64> = wire();
let int_fp = output.int_fp;
fn connect_int_fp_cast<T: IntType + StaticType>(int_fp: Expr<UInt<64>>, masked: Expr<UInt<64>>)
where
UInt<64>: CastToImpl<T>,
@ -587,27 +605,28 @@ fn shift_rotate<C: PhantomConstCpuConfig>(
OutputIntegerMode::ZeroExt8 => connect_int_fp_cast::<UInt<8>>(int_fp, masked),
OutputIntegerMode::SignExt8 => connect_int_fp_cast::<SInt<8>>(int_fp, masked),
}
let retval = #[hdl]
PRegValue {
int_fp,
flags: PRegFlags::zeroed(), // TODO: compute flags
};
retval.into_trace_as_string()
connect(output.flags, PRegFlags::zeroed()); // TODO: compute flags
}
#[hdl]
fn compare<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
global_state: Expr<GlobalState>,
mop: Expr<CompareMOp<PRegNum<C>, PRegNum<C>, SrcCount>>,
src_values: Expr<Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }>>,
) -> Expr<TraceAsString<PRegValue>> {
#[hdl_module]
fn compare<C: Type + PhantomConstCpuConfig, SrcCount: KnownSize>(config: C) {
#[hdl]
let global_state: GlobalState = m.input();
#[hdl]
let mop: TraceAsString<CompareMOp<PRegNum<C>, PRegNum<C>, SrcCount>> =
m.input(TraceAsString[CompareMOp[PRegNum[config]][PRegNum[config]][SrcCount::SIZE]]);
#[hdl]
let src_values: Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }> = m.input();
#[hdl]
let output: TraceAsString<PRegValue> = m.output();
#[hdl]
let GlobalState { flags_mode } = global_state;
#[hdl]
let CompareMOp::<_, _, _> {
common,
compare_mode,
} = mop;
} = *mop;
let config = common.dest.unit_num.config.ty();
let (lhs, rhs) = match SrcCount::VALUE {
1 => (
@ -624,9 +643,7 @@ fn compare<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
2 => (src_values[0], src_values[1]),
_ => todo!(),
};
#[hdl]
let compare_result = wire();
connect(compare_result, PRegValue::zeroed().to_trace_as_string());
connect(output, PRegValue::zeroed().to_trace_as_string());
#[hdl]
let lhs_casted: SInt<65> = wire();
@ -640,25 +657,37 @@ fn compare<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
#[hdl]
let x86_flags = wire();
let zero_reg = PRegNum[config].const_zero();
#[hdl]
let add_sub_for_flags = instance(add_sub(config));
#[hdl]
let add_sub::<_, _> {
global_state: add_sub_for_flags_global_state,
pc: add_sub_for_flags_pc,
mop: add_sub_for_flags_mop,
src_values: add_sub_for_flags_src_values,
output: add_sub_for_flags_output,
} = add_sub_for_flags;
connect(add_sub_for_flags_global_state, global_state);
connect(add_sub_for_flags_pc, 0u64);
connect(
x86_flags,
add_sub(
global_state,
0u64.to_expr(),
AddSubMOp::add_sub_i(
zero_reg,
repeat(zero_reg, ConstUsize),
0.cast_to_static::<SInt<_>>(),
x86_sub_mode,
true,
false,
true,
false,
),
[rhs, lhs, PRegValue::zeroed().to_trace_as_string()].to_expr(),
)
.flags,
*add_sub_for_flags_mop,
AddSubMOp::add_sub_i(
zero_reg,
repeat(zero_reg, ConstUsize),
0.cast_to_static::<SInt<_>>(),
x86_sub_mode,
true,
false,
true,
false,
),
);
connect(
add_sub_for_flags_src_values,
[rhs, lhs, PRegValue::zeroed().to_trace_as_string()],
);
connect(x86_flags, add_sub_for_flags_output.flags);
#[hdl]
let power_isa_flags = wire();
@ -690,8 +719,8 @@ fn compare<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
connect(rhs_casted, do_cast(rhs.int_fp));
#[hdl]
match flags_mode {
FlagsMode::PowerISA(_) => connect(compare_result.flags, power_isa_flags),
FlagsMode::X86(_) => connect(compare_result.flags, x86_flags),
FlagsMode::PowerISA(_) => connect(output.flags, power_isa_flags),
FlagsMode::X86(_) => connect(output.flags, x86_flags),
}
};
@ -717,24 +746,31 @@ fn compare<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
// TODO
}
}
compare_result
}
#[hdl]
fn branch<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
global_state: Expr<GlobalState>,
pc: Expr<UInt<64>>,
fallthrough_pc: Expr<UInt<64>>,
predicted_next_pc: Expr<UInt<64>>,
mop: Expr<BranchMOp<PRegNum<C>, PRegNum<C>, SrcCount>>,
src_values: Expr<Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }>>,
config: C,
) -> (
Expr<TraceAsString<PRegValue>>,
Expr<NextPcPredictorOp<C>>,
Expr<HdlOption<UnitCausedCancel<C>>>,
) {
#[hdl_module]
fn branch<C: Type + PhantomConstCpuConfig, SrcCount: KnownSize>(config: C) {
#[hdl]
let global_state: GlobalState = m.input();
#[hdl]
let pc: UInt<64> = m.input();
#[hdl]
let fallthrough_pc: UInt<64> = m.input();
#[hdl]
let predicted_next_pc: UInt<64> = m.input();
#[hdl]
let mop: TraceAsString<BranchMOp<PRegNum<C>, PRegNum<C>, SrcCount>> =
m.input(TraceAsString[BranchMOp[PRegNum[config]][PRegNum[config]][SrcCount::SIZE]]);
#[hdl]
let src_values: Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }> = m.input();
#[hdl]
let output: TraceAsString<PRegValue> = m.output();
#[hdl]
let predictor_op: NextPcPredictorOp<C> = m.output(NextPcPredictorOp[config]);
#[hdl]
let caused_cancel: HdlOption<UnitCausedCancel<C>> =
m.output(HdlOption[UnitCausedCancel[config]]);
#[hdl]
let GlobalState { flags_mode } = global_state;
#[hdl]
@ -746,7 +782,7 @@ fn branch<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
pc_relative,
is_call,
is_ret,
} = mop;
} = *mop;
#[hdl]
let CommonMOp::<_, _, _, _, _> {
prefix_pad: _,
@ -850,11 +886,9 @@ fn branch<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
connect(next_pc, fallthrough_pc);
};
#[hdl]
let cancel = wire(HdlOption[UnitCausedCancel[config]]);
#[hdl]
if next_pc.cmp_ne(predicted_next_pc) {
connect(
cancel,
caused_cancel,
HdlSome(
#[hdl]
UnitCausedCancel::<C> {
@ -865,13 +899,16 @@ fn branch<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
),
);
} else {
connect(cancel, cancel.ty().HdlNone());
};
let fallthrough_pc_value = #[hdl]
PRegValue {
int_fp: fallthrough_pc,
flags: PRegFlags::zeroed_sim(),
connect(caused_cancel, caused_cancel.ty().HdlNone());
};
connect(
*output,
#[hdl]
PRegValue {
int_fp: fallthrough_pc,
flags: PRegFlags::zeroed_sim(),
},
);
#[hdl]
let call_stack_op = wire();
#[hdl]
@ -890,29 +927,33 @@ fn branch<C: PhantomConstCpuConfig, SrcCount: KnownSize>(
} else {
connect(cond_br_taken_opt, HdlNone());
}
(
fallthrough_pc_value.into_trace_as_string(),
connect(
predictor_op,
#[hdl]
NextPcPredictorOp::<_> {
call_stack_op,
cond_br_taken: cond_br_taken_opt,
config,
},
cancel,
)
);
}
#[hdl]
fn read_special<C: PhantomConstCpuConfig>(
global_state: Expr<GlobalState>,
pc: Expr<UInt<64>>,
mop: Expr<ReadSpecialMOp<PRegNum<C>, PRegNum<C>>>,
src_values: Expr<Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }>>,
) -> Expr<TraceAsString<PRegValue>> {
#[hdl_module]
fn read_special<C: Type + PhantomConstCpuConfig>(config: C) {
#[hdl]
let global_state: GlobalState = m.input();
#[hdl]
let mop: TraceAsString<ReadSpecialMOp<PRegNum<C>, PRegNum<C>>> =
m.input(TraceAsString[ReadSpecialMOp[PRegNum[config]][PRegNum[config]]]);
#[hdl]
let src_values: Array<TraceAsString<PRegValue>, { COMMON_MOP_SRC_LEN }> = m.input();
#[hdl]
let output: TraceAsString<PRegValue> = m.output();
#[hdl]
let GlobalState { flags_mode } = global_state;
// TODO: finish
PRegValue::zeroed().to_trace_as_string()
connect(*output, PRegValue::zeroed());
}
#[hdl_module]
@ -975,68 +1016,193 @@ pub fn alu_branch(config: PhantomConst<CpuConfig>, unit_index: usize) {
#[hdl]
match mop {
AluBranchMOp::<_, _>::AddSub(mop) => {
connect(
dest_value,
add_sub(global_state, mop_instance.pc, mop, src_values),
);
#[hdl]
let add_sub = instance(add_sub(config));
#[hdl]
let add_sub::<_, _> {
global_state: global_state_,
pc,
mop: mop_,
src_values: src_values_,
output,
} = add_sub;
connect(global_state_, global_state);
connect(pc, mop_instance.pc);
connect(*mop_, mop);
connect(src_values_, src_values);
connect(dest_value, output);
}
AluBranchMOp::<_, _>::AddSubI(mop) => {
connect(
dest_value,
add_sub(global_state, mop_instance.pc, mop, src_values),
);
#[hdl]
let add_sub_i = instance(add_sub(config));
#[hdl]
let add_sub::<_, _> {
global_state: global_state_,
pc,
mop: mop_,
src_values: src_values_,
output,
} = add_sub_i;
connect(global_state_, global_state);
connect(pc, mop_instance.pc);
connect(*mop_, mop);
connect(src_values_, src_values);
connect(dest_value, output);
}
AluBranchMOp::<_, _>::LogicalFlags(mop) => {
connect(dest_value, logical_flags(global_state, mop, src_values));
#[hdl]
let logical_flags = instance(logical_flags(config));
#[hdl]
let logical_flags::<_> {
global_state: global_state_,
mop: mop_,
src_values: src_values_,
output,
} = logical_flags;
connect(global_state_, global_state);
connect(*mop_, mop);
connect(src_values_, src_values);
connect(dest_value, output);
}
AluBranchMOp::<_, _>::Logical(mop) => {
connect(dest_value, logical(global_state, mop, src_values));
#[hdl]
let logical = instance(logical(config));
#[hdl]
let logical::<_, _> {
global_state: global_state_,
mop: mop_,
src_values: src_values_,
output,
} = logical;
connect(global_state_, global_state);
connect(*mop_, mop);
connect(src_values_, src_values);
connect(dest_value, output);
}
AluBranchMOp::<_, _>::LogicalI(mop) => {
connect(dest_value, logical(global_state, mop, src_values));
#[hdl]
let logical_i = instance(logical(config));
#[hdl]
let logical::<_, _> {
global_state: global_state_,
mop: mop_,
src_values: src_values_,
output,
} = logical_i;
connect(global_state_, global_state);
connect(*mop_, mop);
connect(src_values_, src_values);
connect(dest_value, output);
}
AluBranchMOp::<_, _>::ShiftRotate(mop) => {
connect(dest_value, shift_rotate(global_state, mop, src_values));
#[hdl]
let shift_rotate = instance(shift_rotate(config));
#[hdl]
let shift_rotate::<_> {
global_state: global_state_,
mop: mop_,
src_values: src_values_,
output,
} = shift_rotate;
connect(global_state_, global_state);
connect(*mop_, mop);
connect(src_values_, src_values);
connect(dest_value, output);
}
AluBranchMOp::<_, _>::Compare(mop) => {
connect(dest_value, compare(global_state, mop, src_values));
#[hdl]
let compare = instance(compare(config));
#[hdl]
let compare::<_, _> {
global_state: global_state_,
mop: mop_,
src_values: src_values_,
output,
} = compare;
connect(global_state_, global_state);
connect(*mop_, mop);
connect(src_values_, src_values);
connect(dest_value, output);
}
AluBranchMOp::<_, _>::CompareI(mop) => {
connect(dest_value, compare(global_state, mop, src_values));
#[hdl]
let compare_i = instance(compare(config));
#[hdl]
let compare::<_, _> {
global_state: global_state_,
mop: mop_,
src_values: src_values_,
output,
} = compare_i;
connect(global_state_, global_state);
connect(*mop_, mop);
connect(src_values_, src_values);
connect(dest_value, output);
}
AluBranchMOp::<_, _>::Branch(mop) => {
let (dest_value_, predictor_op_, caused_cancel_) = branch(
global_state,
mop_instance.pc,
fallthrough_pc,
mop_instance.predicted_next_pc,
mop,
src_values,
config,
);
connect(dest_value, dest_value_);
#[hdl]
let branch = instance(branch(config));
#[hdl]
let branch::<_, _> {
global_state: global_state_,
pc: pc_,
fallthrough_pc: fallthrough_pc_,
predicted_next_pc,
mop: mop_,
src_values: src_values_,
output,
predictor_op: predictor_op_,
caused_cancel: caused_cancel_,
} = branch;
connect(global_state_, global_state);
connect(pc_, mop_instance.pc);
connect(fallthrough_pc_, fallthrough_pc);
connect(predicted_next_pc, mop_instance.predicted_next_pc);
connect(*mop_, mop);
connect(src_values_, src_values);
connect(dest_value, output);
connect(predictor_op, predictor_op_);
connect(caused_cancel, caused_cancel_);
}
AluBranchMOp::<_, _>::BranchI(mop) => {
let (dest_value_, predictor_op_, caused_cancel_) = branch(
global_state,
mop_instance.pc,
fallthrough_pc,
mop_instance.predicted_next_pc,
mop,
src_values,
config,
);
connect(dest_value, dest_value_);
#[hdl]
let branch_i = instance(branch(config));
#[hdl]
let branch::<_, _> {
global_state: global_state_,
pc: pc_,
fallthrough_pc: fallthrough_pc_,
predicted_next_pc,
mop: mop_,
src_values: src_values_,
output,
predictor_op: predictor_op_,
caused_cancel: caused_cancel_,
} = branch_i;
connect(global_state_, global_state);
connect(pc_, mop_instance.pc);
connect(fallthrough_pc_, fallthrough_pc);
connect(predicted_next_pc, mop_instance.predicted_next_pc);
connect(*mop_, mop);
connect(src_values_, src_values);
connect(dest_value, output);
connect(predictor_op, predictor_op_);
connect(caused_cancel, caused_cancel_);
}
AluBranchMOp::<_, _>::ReadSpecial(mop) => {
connect(
dest_value,
read_special(global_state, mop_instance.pc, mop, src_values),
);
#[hdl]
let read_special = instance(read_special(config));
#[hdl]
let read_special::<_> {
global_state: global_state_,
mop: mop_,
src_values: src_values_,
output,
} = read_special;
connect(global_state_, global_state);
connect(*mop_, mop);
connect(src_values_, src_values);
connect(dest_value, output);
}
}
connect(

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff