five32_instruction_set/
layout.rs

1use bitvec::prelude::*;
2
3use crate::fields::*;
4
5#[derive(Default, Debug, Eq, PartialEq)]
6pub struct Raw(pub u32);
7
8#[derive(Default, Debug, Eq, PartialEq)]
9pub struct R {
10    pub opcode: Opcode,
11    pub func3: Func3,
12    pub func7: Func7,
13    pub rd: Rd,
14    pub rs1: Rs1,
15    pub rs2: Rs2
16}
17
18#[derive(Default, Debug, Eq, PartialEq)]
19pub struct I {
20    pub opcode: Opcode,
21    pub func3: Func3,
22    pub rd: Rd,
23    pub rs1: Rs1,
24    pub immediate: ImmediateI
25}
26
27#[derive(Default, Debug, Eq, PartialEq)]
28pub struct S {
29    pub opcode: Opcode,
30    pub func3: Func3,
31    pub rs1: Rs1,
32    pub rs2: Rs2,
33    pub immediate: ImmediateS
34}
35
36#[derive(Default, Debug, Eq, PartialEq)]
37pub struct B {
38    pub opcode: Opcode,
39    pub func3: Func3,
40    pub rs1: Rs1,
41    pub rs2: Rs2,
42    pub immediate: ImmediateB
43}
44
45#[derive(Default, Debug, Eq, PartialEq)]
46pub struct U {
47    pub opcode: Opcode,
48    pub rd: Rd,
49    pub immediate: ImmediateU
50}
51
52#[derive(Default, Debug, Eq, PartialEq)]
53pub struct J {
54    pub opcode: Opcode,
55    pub rd: Rd,
56    pub immediate: ImmediateJ
57}
58
59impl From<Word> for Raw {
60    fn from(w: Word) -> Self {
61        Self(w)
62    }
63}
64
65impl From<Word> for U {
66    fn from(w: Word) -> Self {
67        let view = BitSlice::<_, Lsb0>::from_element(&w);
68        Self {
69            opcode:    Opcode::from(&view[0..=6]),
70            rd:            Rd::from(&view[7..=11]),
71            immediate:  ImmediateU::from(w),
72        }
73    }
74}
75
76impl From<Word> for S {
77    fn from(w: Word) -> Self {
78        let view = BitSlice::<_, Lsb0>::from_element(&w);
79        Self {
80            opcode:         Opcode::from(&view[0..=6]),
81            func3:           Func3::from(&view[12..=14]),
82            rs1:               Rs1::from(&view[15..=19]),
83            rs2:               Rs2::from(&view[20..=24]),
84            immediate:  ImmediateS::from(w)
85        }
86    }
87}
88
89impl From<Word> for R {
90    fn from(w: Word) -> Self {
91        let view = BitSlice::<_, Lsb0>::from_element(&w);
92        Self {
93            opcode: Opcode::from(&view[0..=6]),
94            rd:         Rd::from(&view[7..=11]),
95            func3:   Func3::from(&view[12..=14]),
96            func7:   Func7::from(&view[25..=31]),
97            rs1:       Rs1::from(&view[15..=19]),
98            rs2:       Rs2::from(&view[20..=24]),
99        }
100    }
101}
102
103impl From<Word> for I {
104    fn from(w: Word) -> Self {
105        let view = BitSlice::<_, Lsb0>::from_element(&w);
106        Self {
107            opcode:          Opcode::from(&view[0..=6]),
108            rd:                  Rd::from(&view[7..=11]),
109            func3:            Func3::from(&view[12..=14]),
110            rs1:                Rs1::from(&view[15..=19]),
111            immediate:   ImmediateI::from(w),
112        }
113    }
114}
115
116impl From<Word> for B {
117    fn from(w: Word) -> Self {
118        let view = BitSlice::<_, Lsb0>::from_element(&w);
119        Self {
120            opcode:         Opcode::from(&view[0..=6]),
121            func3:           Func3::from(&view[12..=14]),
122            rs1:               Rs1::from(&view[15..=19]),
123            rs2:               Rs2::from(&view[20..=24]),
124            immediate:  ImmediateB::from(w),
125        }
126    }
127}