Added address space unit size to MemorySegment and MemorySegmentSection

Some recfactoring
This commit is contained in:
Nav
2024-12-27 01:53:02 +00:00
parent 7aeb2ddf08
commit 00c4cee6c2
11 changed files with 202 additions and 186 deletions

View File

@@ -1,13 +1,13 @@
<?php
namespace Targets\TargetDescriptionFiles;
require_once __DIR__ . "/AddressRange.php";
require_once __DIR__ . "/MemorySegment.php";
class AddressSpace
{
public ?string $key = null;
public ?int $startAddress = null;
public ?int $size = null;
public ?AddressRange $addressRange = null;
public ?int $unitSize = null;
public ?string $endianness = null;
@@ -17,12 +17,23 @@ class AddressSpace
public function __construct(?string $key, ?int $startAddress, ?int $size, ?int $unitSize, ?string $endianness)
{
$this->key = $key;
$this->startAddress = $startAddress;
$this->size = $size;
$this->addressRange = is_numeric($startAddress) && is_numeric($size)
? new AddressRange(
$startAddress,
$startAddress + ($size / ($unitSize ?? 1)) - 1
)
: null;
$this->unitSize = $unitSize;
$this->endianness = $endianness;
}
public function size(): ?int
{
return $this->addressRange instanceof AddressRange
? $this->addressRange->size() * ($this->unitSize ?? 1)
: null;
}
public function getMemorySegment(string $key): ?MemorySegment
{
foreach ($this->memorySegments as $segment) {
@@ -38,27 +49,7 @@ class AddressSpace
{
return array_sum(
array_map(
fn (MemorySegment $segment): int => (int) $segment->size,
$this->memorySegments
)
);
}
public function segmentStartAddress(): int
{
return min(
array_map(
fn (MemorySegment $segment): int => (int) $segment->startAddress,
$this->memorySegments
)
);
}
public function segmentEndAddress(): int
{
return max(
array_map(
fn (MemorySegment $segment): int => (int) $segment->startAddress + $segment->size - 1,
fn (MemorySegment $segment): int => (int) $segment->size(),
$this->memorySegments
)
);
@@ -77,9 +68,9 @@ class AddressSpace
return array_filter(
$this->memorySegments,
function (MemorySegment $segment) use ($startAddress, $endAddress) : bool {
$segmentEndAddress = $segment->startAddress + $segment->size - 1;
return ($startAddress <= $segment->startAddress && $endAddress >= $segment->startAddress)
|| ($startAddress >= $segment->startAddress && $startAddress <= $segmentEndAddress);
$segmentEndAddress = $segment->addressRange->startAddress + $segment->size() - 1;
return ($startAddress <= $segment->addressRange->startAddress && $endAddress >= $segment->addressRange->startAddress)
|| ($startAddress >= $segment->addressRange->startAddress && $startAddress <= $segmentEndAddress);
}
);
}