Skip to content

Commit a269e20

Browse files
committed
add DeleteRegisters, FixRegisterBitSizes.
1 parent b9f6475 commit a269e20

File tree

3 files changed

+85
-0
lines changed

3 files changed

+85
-0
lines changed

src/transform/delete_registers.rs

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
use serde::{Deserialize, Serialize};
2+
3+
use super::common::*;
4+
use crate::ir::*;
5+
6+
#[derive(Debug, Serialize, Deserialize)]
7+
pub struct DeleteRegisters {
8+
pub block: String,
9+
pub from: String,
10+
}
11+
12+
impl DeleteRegisters {
13+
pub fn run(&self, ir: &mut IR) -> anyhow::Result<()> {
14+
let path_re = make_regex(&self.block)?;
15+
let re = make_regex(&self.from)?;
16+
for id in match_all(ir.blocks.keys().cloned(), &path_re) {
17+
let b = ir.blocks.get_mut(&id).unwrap();
18+
b.items.retain(|i| !re.is_match(&i.name));
19+
}
20+
Ok(())
21+
}
22+
}
+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
use serde::{Deserialize, Serialize};
2+
3+
use crate::ir::*;
4+
5+
#[derive(Debug, Serialize, Deserialize)]
6+
pub struct FixRegisterBitSizes {}
7+
8+
impl FixRegisterBitSizes {
9+
pub fn run(&self, ir: &mut IR) -> anyhow::Result<()> {
10+
for (_, b) in &mut ir.blocks {
11+
for i in &mut b.items {
12+
if let BlockItemInner::Register(r) = &mut i.inner {
13+
let orig_bit_size = r.bit_size;
14+
let good_bit_size = match r.bit_size {
15+
..=8 => 8,
16+
..=16 => 16,
17+
..=32 => 32,
18+
..=64 => 64,
19+
_ => panic!("Invalid register bit size {}", r.bit_size),
20+
};
21+
if r.bit_size != good_bit_size {
22+
r.bit_size = good_bit_size;
23+
match &r.fieldset {
24+
None => {
25+
// create a new fieldset, with a single field with the original bit size.
26+
r.fieldset = Some(i.name.clone());
27+
let fs = FieldSet {
28+
bit_size: good_bit_size,
29+
fields: vec![Field {
30+
name: "val".to_string(),
31+
bit_offset: BitOffset::Regular(0),
32+
bit_size: orig_bit_size,
33+
description: None,
34+
enumm: None,
35+
array: None,
36+
}],
37+
description: None,
38+
extends: None,
39+
};
40+
if ir.fieldsets.insert(i.name.clone(), fs).is_some() {
41+
panic!("dup fieldset {}", i.name);
42+
}
43+
}
44+
Some(fs) => {
45+
// expand the size of the existing fieldset.
46+
let fs = ir.fieldsets.get_mut(fs).unwrap();
47+
fs.bit_size = good_bit_size;
48+
}
49+
}
50+
}
51+
}
52+
}
53+
}
54+
55+
Ok(())
56+
}
57+
}

src/transform/mod.rs

+6
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,9 @@ pub mod delete_enums_used_in;
256256
pub mod delete_fieldsets;
257257
//pub mod find_duplicate_enums;
258258
//pub mod find_duplicate_fieldsets;
259+
pub mod delete_registers;
259260
pub mod expand_extends;
261+
pub mod fix_register_bit_sizes;
260262
pub mod make_block;
261263
pub mod make_field_array;
262264
pub mod make_register_array;
@@ -278,6 +280,7 @@ pub enum Transform {
278280
DeleteEnums(delete_enums::DeleteEnums),
279281
DeleteEnumsUsedIn(delete_enums_used_in::DeleteEnumsUsedIn),
280282
DeleteFieldsets(delete_fieldsets::DeleteFieldsets),
283+
DeleteRegisters(delete_registers::DeleteRegisters),
281284
MergeBlocks(merge_blocks::MergeBlocks),
282285
MergeEnums(merge_enums::MergeEnums),
283286
MergeFieldsets(merge_fieldsets::MergeFieldsets),
@@ -289,6 +292,7 @@ pub enum Transform {
289292
MakeFieldArray(make_field_array::MakeFieldArray),
290293
MakeBlock(make_block::MakeBlock),
291294
ModifyByteOffset(modify_byte_offset::ModifyByteOffset),
295+
FixRegisterBitSizes(fix_register_bit_sizes::FixRegisterBitSizes),
292296
//FindDuplicateEnums(find_duplicate_enums::FindDuplicateEnums),
293297
//FindDuplicateFieldsets(find_duplicate_fieldsets::FindDuplicateFieldsets),
294298
}
@@ -302,6 +306,7 @@ impl Transform {
302306
Self::DeleteEnums(t) => t.run(ir),
303307
Self::DeleteEnumsUsedIn(t) => t.run(ir),
304308
Self::DeleteFieldsets(t) => t.run(ir),
309+
Self::DeleteRegisters(t) => t.run(ir),
305310
Self::MergeBlocks(t) => t.run(ir),
306311
Self::MergeEnums(t) => t.run(ir),
307312
Self::MergeFieldsets(t) => t.run(ir),
@@ -313,6 +318,7 @@ impl Transform {
313318
Self::MakeFieldArray(t) => t.run(ir),
314319
Self::MakeBlock(t) => t.run(ir),
315320
Self::ModifyByteOffset(t) => t.run(ir),
321+
Self::FixRegisterBitSizes(t) => t.run(ir),
316322
//Self::FindDuplicateEnums(t) => t.run(ir),
317323
//Self::FindDuplicateFieldsets(t) => t.run(ir),
318324
}

0 commit comments

Comments
 (0)