pim-simulator now support usize addresses
Validate Operations / validate-operations (push) Has been cancelled
Validate Operations / validate-operations (push) Has been cancelled
This commit is contained in:
@@ -43,7 +43,7 @@ struct Args {
|
|||||||
|
|
||||||
/// Comma separated list of (address,size) for memory output dump
|
/// Comma separated list of (address,size) for memory output dump
|
||||||
#[arg(short, long, value_delimiter = ',', num_args = 1.., value_name = "ADDR,SIZE")]
|
#[arg(short, long, value_delimiter = ',', num_args = 1.., value_name = "ADDR,SIZE")]
|
||||||
dump: Vec<i32>,
|
dump: Vec<usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
@@ -168,7 +168,7 @@ fn get_crossbars(config: &Value, args: &Args) -> anyhow::Result<HashMap<String,
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn dump_memory(mut executor: pimcore::Executable, args: &Args) -> Result<()> {
|
fn dump_memory(mut executor: pimcore::Executable, args: &Args) -> Result<()> {
|
||||||
let dumps: Vec<(i32, i32)> = args
|
let dumps: Vec<(usize, usize)> = args
|
||||||
.dump
|
.dump
|
||||||
.chunks_exact(2)
|
.chunks_exact(2)
|
||||||
.map(|chunk| (chunk[0], chunk[1]))
|
.map(|chunk| (chunk[0], chunk[1]))
|
||||||
|
|||||||
@@ -91,30 +91,26 @@ impl<'a> Core<'a> {
|
|||||||
self.memory.execute_load()
|
self.memory.execute_load()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn execute_store<T>(&mut self, address: impl TryToUsize, element: &[T]) -> Result<()>
|
pub fn execute_store<T>(&mut self, address: impl AddressArg, element: &[T]) -> Result<()>
|
||||||
where
|
where
|
||||||
T: MemoryStorable,
|
T: MemoryStorable,
|
||||||
{
|
{
|
||||||
let address = address.try_into().context("address can not be negative")?;
|
let address = address.to_address_usize()?;
|
||||||
self.memory.execute_store(address, element)
|
self.memory.execute_store(address, element)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn reserve_load(
|
pub fn reserve_load(
|
||||||
&mut self,
|
&mut self,
|
||||||
address: impl TryToUsize,
|
address: impl AddressArg,
|
||||||
size: impl TryToUsize,
|
size: impl TryToUsize,
|
||||||
) -> Result<&mut CoreMemory> {
|
) -> Result<&mut CoreMemory> {
|
||||||
let address = address.try_into().context("address can not be negative")?;
|
let address = address.to_address_usize()?;
|
||||||
let size = size.try_into().context("size can not be negative")?;
|
let size = size.try_into().context("size can not be negative")?;
|
||||||
self.memory.reserve_load(address, size)
|
self.memory.reserve_load(address, size)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_register(&mut self, index: impl TryToUsize, value: i32) {
|
pub fn set_register(&mut self, index: impl TryToUsize, value: i32) {
|
||||||
let index = index.try_into().expect("index can not be negative");
|
let index = index.try_into().expect("index can not be negative");
|
||||||
assert!(
|
|
||||||
value >= 0,
|
|
||||||
"Register cannot be negative if happens remove this and go check where it's used as usize"
|
|
||||||
);
|
|
||||||
self.registers[index] = value;
|
self.registers[index] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,11 +119,11 @@ impl<'a> Core<'a> {
|
|||||||
self.registers[index]
|
self.registers[index]
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load<T>(&mut self, address: impl TryToUsize, size: impl TryToUsize) -> Result<Vec<&[T]>>
|
pub fn load<T>(&mut self, address: impl AddressArg, size: impl TryToUsize) -> Result<Vec<&[T]>>
|
||||||
where
|
where
|
||||||
T: MemoryStorable,
|
T: MemoryStorable,
|
||||||
{
|
{
|
||||||
let address = address.try_into().context("address can not be negative")?;
|
let address = address.to_address_usize()?;
|
||||||
let size = size.try_into().context("size can not be negative")?;
|
let size = size.try_into().context("size can not be negative")?;
|
||||||
self.memory.load(address, size)
|
self.memory.load(address, size)
|
||||||
}
|
}
|
||||||
@@ -141,8 +137,8 @@ impl<'a> Core<'a> {
|
|||||||
(memory, crossbars)
|
(memory, crossbars)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn memset(&mut self, address: impl TryToUsize, size: impl TryToUsize, val: u8) -> Result<()> {
|
pub fn memset(&mut self, address: impl AddressArg, size: impl TryToUsize, val: u8) -> Result<()> {
|
||||||
let address = address.try_into().context("address can not be negative")?;
|
let address = address.to_address_usize()?;
|
||||||
let size = size.try_into().context("size can not be negative")?;
|
let size = size.try_into().context("size can not be negative")?;
|
||||||
self.memory.memset(address, size, val)
|
self.memory.memset(address, size, val)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,44 @@
|
|||||||
use std::{fmt::Debug, mem::transmute};
|
use std::{fmt::Debug, mem::transmute};
|
||||||
|
|
||||||
use crate::memory_manager::type_traits::TryToUsize;
|
|
||||||
|
|
||||||
|
pub trait AddressArg {
|
||||||
|
fn to_address_usize(self) -> Result<usize>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AddressArg for usize {
|
||||||
|
fn to_address_usize(self) -> Result<usize> {
|
||||||
|
Ok(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AddressArg for u32 {
|
||||||
|
fn to_address_usize(self) -> Result<usize> {
|
||||||
|
Ok(self as usize)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AddressArg for u64 {
|
||||||
|
fn to_address_usize(self) -> Result<usize> {
|
||||||
|
usize::try_from(self).context("address does not fit in usize")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AddressArg for i32 {
|
||||||
|
fn to_address_usize(self) -> Result<usize> {
|
||||||
|
Ok(self as u32 as usize)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AddressArg for i64 {
|
||||||
|
fn to_address_usize(self) -> Result<usize> {
|
||||||
|
usize::try_from(self).context("address can not be negative")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn address_to_usize(address: i32) -> usize {
|
||||||
|
address as u32 as usize
|
||||||
|
}
|
||||||
|
|
||||||
fn add_offset_impl(address: usize, offset_select : i32, offset_value : i32, id:i32) -> usize{
|
fn add_offset_impl(address: usize, offset_select : i32, offset_value : i32, id:i32) -> usize{
|
||||||
assert!(offset_select == 1 || offset_select == 2 || offset_select == 4 || offset_value == 0, "offset_select not a bit field");
|
assert!(offset_select == 1 || offset_select == 2 || offset_select == 4 || offset_value == 0, "offset_select not a bit field");
|
||||||
@@ -14,21 +51,21 @@ fn add_offset_impl(address: usize, offset_select : i32, offset_value : i32, id:i
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub fn add_offset_rd(address: impl TryToUsize, offset_select : i32, offset_value : i32) -> usize
|
pub fn add_offset_rd(address: i32, offset_select : i32, offset_value : i32) -> usize
|
||||||
{
|
{
|
||||||
let address = address.try_into().expect("address can not be negative");
|
let address = address_to_usize(address);
|
||||||
add_offset_impl(address, offset_select, offset_value, 4)
|
add_offset_impl(address, offset_select, offset_value, 4)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_offset_r1(address: impl TryToUsize, offset_select : i32, offset_value : i32) -> usize
|
pub fn add_offset_r1(address: i32, offset_select : i32, offset_value : i32) -> usize
|
||||||
{
|
{
|
||||||
let address = address.try_into().expect("address can not be negative");
|
let address = address_to_usize(address);
|
||||||
add_offset_impl(address, offset_select, offset_value, 1)
|
add_offset_impl(address, offset_select, offset_value, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_offset_r2(address: impl TryToUsize, offset_select : i32, offset_value : i32) -> usize
|
pub fn add_offset_r2(address: i32, offset_select : i32, offset_value : i32) -> usize
|
||||||
{
|
{
|
||||||
let address = address.try_into().expect("address can not be negative");
|
let address = address_to_usize(address);
|
||||||
add_offset_impl(address, offset_select, offset_value, 2)
|
add_offset_impl(address, offset_select, offset_value, 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user