forked from libre-chip/cpu
switch UnitTrait to using UnitIO instead of separate methods for each IO port
This commit is contained in:
parent
fb0b07fbb2
commit
bc2bcf4434
3 changed files with 24 additions and 36 deletions
|
|
@ -387,6 +387,12 @@ impl RenamedMOpFilter for () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
|
||||||
|
pub struct UnitIO {
|
||||||
|
pub cd: Option<Expr<ClockDomain>>,
|
||||||
|
pub from_execute: Expr<ExecuteToUnitInterface<PhantomConst<CpuConfig>>>,
|
||||||
|
}
|
||||||
|
|
||||||
pub trait UnitTrait:
|
pub trait UnitTrait:
|
||||||
'static + Send + Sync + std::fmt::Debug + fayalite::intern::SupportsPtrEqWithTypeId
|
'static + Send + Sync + std::fmt::Debug + fayalite::intern::SupportsPtrEqWithTypeId
|
||||||
{
|
{
|
||||||
|
|
@ -395,11 +401,7 @@ pub trait UnitTrait:
|
||||||
fn ty(&self) -> Self::Type;
|
fn ty(&self) -> Self::Type;
|
||||||
fn unit_kind(&self) -> UnitKind;
|
fn unit_kind(&self) -> UnitKind;
|
||||||
fn module(&self) -> Interned<Module<Self::Type>>;
|
fn module(&self) -> Interned<Module<Self::Type>>;
|
||||||
fn cd(&self, this: Expr<Self::Type>) -> Option<Expr<ClockDomain>>;
|
fn io(&self, this: Expr<Self::Type>) -> UnitIO;
|
||||||
fn from_execute(
|
|
||||||
&self,
|
|
||||||
this: Expr<Self::Type>,
|
|
||||||
) -> Expr<ExecuteToUnitInterface<PhantomConst<CpuConfig>>>;
|
|
||||||
fn to_dyn(&self) -> DynUnit;
|
fn to_dyn(&self) -> DynUnit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -434,15 +436,8 @@ impl UnitTrait for DynUnit {
|
||||||
self.unit.module()
|
self.unit.module()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cd(&self, this: Expr<Self::Type>) -> Option<Expr<ClockDomain>> {
|
fn io(&self, this: Expr<Self::Type>) -> UnitIO {
|
||||||
self.unit.cd(this)
|
self.unit.io(this)
|
||||||
}
|
|
||||||
|
|
||||||
fn from_execute(
|
|
||||||
&self,
|
|
||||||
this: Expr<Self::Type>,
|
|
||||||
) -> Expr<ExecuteToUnitInterface<PhantomConst<CpuConfig>>> {
|
|
||||||
self.unit.from_execute(this)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_dyn(&self) -> DynUnit {
|
fn to_dyn(&self) -> DynUnit {
|
||||||
|
|
@ -468,15 +463,8 @@ impl<T: UnitTrait + Clone + std::hash::Hash + Eq> UnitTrait for DynUnitWrapper<T
|
||||||
self.0.module().canonical().intern_sized()
|
self.0.module().canonical().intern_sized()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cd(&self, this: Expr<Self::Type>) -> Option<Expr<ClockDomain>> {
|
fn io(&self, this: Expr<Self::Type>) -> UnitIO {
|
||||||
self.0.cd(Expr::from_bundle(this))
|
self.0.io(Expr::from_bundle(this))
|
||||||
}
|
|
||||||
|
|
||||||
fn from_execute(
|
|
||||||
&self,
|
|
||||||
this: Expr<Self::Type>,
|
|
||||||
) -> Expr<ExecuteToUnitInterface<PhantomConst<CpuConfig>>> {
|
|
||||||
self.0.from_execute(Expr::from_bundle(this))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_dyn(&self) -> DynUnit {
|
fn to_dyn(&self) -> DynUnit {
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ use crate::{
|
||||||
ExecuteToUnitInterface, GlobalState, NextPcPredictorOp, RenamedMOp, UnitCausedCancel,
|
ExecuteToUnitInterface, GlobalState, NextPcPredictorOp, RenamedMOp, UnitCausedCancel,
|
||||||
UnitFinishCauseCancel, UnitInputsReady, UnitOutputReady,
|
UnitFinishCauseCancel, UnitInputsReady, UnitOutputReady,
|
||||||
},
|
},
|
||||||
unit::{DynUnit, DynUnitWrapper, RenamedMOpFilter, UnitKind, UnitTrait},
|
unit::{DynUnit, DynUnitWrapper, RenamedMOpFilter, UnitIO, UnitKind, UnitTrait},
|
||||||
};
|
};
|
||||||
use fayalite::{
|
use fayalite::{
|
||||||
expr::CastToImpl,
|
expr::CastToImpl,
|
||||||
|
|
@ -1613,15 +1613,11 @@ impl UnitTrait for AluBranch {
|
||||||
self.module
|
self.module
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cd(&self, _this: Expr<Self::Type>) -> Option<Expr<ClockDomain>> {
|
fn io(&self, this: Expr<Self::Type>) -> UnitIO {
|
||||||
None
|
UnitIO {
|
||||||
}
|
cd: None,
|
||||||
|
from_execute: this.from_execute,
|
||||||
fn from_execute(
|
}
|
||||||
&self,
|
|
||||||
this: Expr<Self::Type>,
|
|
||||||
) -> Expr<ExecuteToUnitInterface<PhantomConst<CpuConfig>>> {
|
|
||||||
this.from_execute
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_dyn(&self) -> DynUnit {
|
fn to_dyn(&self) -> DynUnit {
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ use cpu::{
|
||||||
DecodeAndRunSingleInsnInput, DecodeAndRunSingleInsnOutput, DecodeOneInsnInput,
|
DecodeAndRunSingleInsnInput, DecodeAndRunSingleInsnOutput, DecodeOneInsnInput,
|
||||||
DecodeOneInsnMaxMOpCount, decode_and_run_single_insn,
|
DecodeOneInsnMaxMOpCount, decode_and_run_single_insn,
|
||||||
},
|
},
|
||||||
unit::{RenamedMOpFilter, UnitKind, UnitMOp, UnitTrait},
|
unit::{RenamedMOpFilter, UnitIO, UnitKind, UnitMOp, UnitTrait},
|
||||||
util::array_vec::ArrayVec,
|
util::array_vec::ArrayVec,
|
||||||
};
|
};
|
||||||
use fayalite::{
|
use fayalite::{
|
||||||
|
|
@ -91,11 +91,15 @@ fn formal_harness(
|
||||||
dyn_unit.module(),
|
dyn_unit.module(),
|
||||||
SourceLocation::caller(),
|
SourceLocation::caller(),
|
||||||
);
|
);
|
||||||
|
let UnitIO {
|
||||||
|
cd: unit_cd,
|
||||||
|
from_execute: unit_from_execute,
|
||||||
|
} = dyn_unit.io(unit);
|
||||||
connect(
|
connect(
|
||||||
dyn_unit.from_execute(unit),
|
unit_from_execute,
|
||||||
ExecuteToUnitInterfaces::unit_fields(decode_and_run.to_units)[unit_index],
|
ExecuteToUnitInterfaces::unit_fields(decode_and_run.to_units)[unit_index],
|
||||||
);
|
);
|
||||||
if let Some(unit_cd) = dyn_unit.cd(unit) {
|
if let Some(unit_cd) = unit_cd {
|
||||||
connect(unit_cd, cd);
|
connect(unit_cd, cd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue