1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use num_traits::Num;
use crate::processor::exceptions::ProcessorResult;
use crate::processor::decode::{Opcode, InstructionBits};
use crate::processor::elements::memory::Memory;
use crate::processor::elements::registers::RegisterFile;
pub trait IsaMod<TConn> {
type Pc;
fn will_handle(&self, opcode: Opcode, inst: InstructionBits) -> bool;
fn execute(&mut self, opcode: Opcode, inst: InstructionBits, inst_bits: u32, conn: TConn) -> ProcessorResult<Option<Self::Pc>>;
}
pub trait PossibleXlen:
Num
+ std::fmt::LowerHex
+ Copy
+ Into<u64>
+ From<u32>
{}
impl PossibleXlen for u32 {}
impl PossibleXlen for u64 {}
#[allow(non_camel_case_types)]
pub struct RvimConn<'a, uXLEN: PossibleXlen> {
pub pc: uXLEN,
pub sreg: &'a mut dyn RegisterFile<uXLEN>,
pub memory: &'a mut dyn Memory,
}
pub type Rv32imConn<'a> = RvimConn<'a, u32>;
pub type Rv64imConn<'a> = RvimConn<'a, u64>;
mod rv32im;
pub use rv32im::Rv32im;
mod rv64im;
pub use rv64im::Rv64im;
mod csrs;
pub use csrs::{Zicsr32, Zicsr32Conn, Zicsr64, Zicsr64Conn, CSRProvider};
pub mod vector;
pub use vector::{Rv32v,Rv64v,Rv64Cheriv,IntVectorRegisterFile,CheriVectorRegisterFile};
mod cheri;
pub use cheri::{XCheri64,Rv64imCapabilityMode,XCheri64Conn};