five32_instruction_set/
layout.rs1use 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}