use crate::isa::csr::CsrAddr;
use crate::isa::fp::RoundingMode;
use crate::isa::op::{AluOp, AtomicOp, CsrOp, MemWidth, SystemOp, VecSrcEncoding, VectorOp};
use crate::isa::rvv::{Sew, VRegIdx};
#[derive(Clone, Copy, Debug, Default)]
pub enum OpASrc {
#[default]
Reg1,
Pc,
Zero,
}
#[derive(Clone, Copy, Debug, Default)]
pub enum OpBSrc {
#[default]
Imm,
Reg2,
Zero,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum ControlFlow {
#[default]
Sequential,
Branch,
Jump,
}
#[derive(Clone, Copy, Debug, Default)]
#[allow(clippy::struct_excessive_bools)]
pub struct ControlSignals {
pub reg_write: bool,
pub fp_reg_write: bool,
pub mem_read: bool,
pub mem_write: bool,
pub control_flow: ControlFlow,
pub is_rv32: bool,
pub is_f16: bool,
pub width: MemWidth,
pub signed_load: bool,
pub alu: AluOp,
pub a_src: OpASrc,
pub b_src: OpBSrc,
pub system_op: SystemOp,
pub csr_addr: CsrAddr,
pub csr_op: CsrOp,
pub fp_rm: Option<RoundingMode>,
pub rs1_fp: bool,
pub rs2_fp: bool,
pub rs3_fp: bool,
pub atomic_op: Option<AtomicOp>,
pub acquire: bool,
pub release: bool,
pub vec_op: VectorOp,
pub vd: VRegIdx,
pub vs1: VRegIdx,
pub vs2: VRegIdx,
pub vs3: VRegIdx,
pub vm: bool,
pub vec_reg_write: bool,
pub vec_src_encoding: VecSrcEncoding,
pub vec_eew: Sew,
pub vec_nf: u8,
pub vec_lmul_regs: u8,
pub vec_lmul_is_fractional: bool,
pub vec_broadcast_vs2: bool,
}
impl ControlSignals {
pub const fn reads_memory(&self) -> bool {
self.mem_read || crate::exec::compute::vector::mem::is_vec_load(self.vec_op)
}
pub const fn writes_memory(&self) -> bool {
self.mem_write || crate::exec::compute::vector::mem::is_vec_store(self.vec_op)
}
#[must_use]
pub const fn performs_at_rob_head(&self) -> bool {
match self.atomic_op {
None => false,
Some(AtomicOp::Lr) => self.release,
Some(_) => true,
}
}
pub const fn splits_store(&self) -> bool {
self.mem_write
&& self.atomic_op.is_none()
&& !self.system_op.is_cbo()
&& matches!(self.vec_op, VectorOp::None)
}
#[must_use]
pub const fn uses_store_buffer(&self) -> bool {
self.mem_write || self.system_op.is_cbo()
}
pub const fn uses_memory_pipeline(&self) -> bool {
self.mem_read || self.mem_write || self.atomic_op.is_some() || self.system_op.is_cbo()
}
}