From 447815099527a2db93957bd6cc56f6cf6ecf832c Mon Sep 17 00:00:00 2001 From: Nav Date: Sat, 18 Jan 2025 18:28:14 +0000 Subject: [PATCH] Corrected overlapping register detection in TDF validation script --- .../Services/ValidationService.php | 29 ++++++++++--------- .../TargetDescriptionFile.php | 1 + build/scripts/Targets/TargetRegister.php | 15 ++++++++++ 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/build/scripts/Targets/TargetDescriptionFiles/Services/ValidationService.php b/build/scripts/Targets/TargetDescriptionFiles/Services/ValidationService.php index ea31a0ba..80b12e85 100644 --- a/build/scripts/Targets/TargetDescriptionFiles/Services/ValidationService.php +++ b/build/scripts/Targets/TargetDescriptionFiles/Services/ValidationService.php @@ -488,19 +488,6 @@ class ValidationService $failures[] = 'Duplicate register key ("' . $register->key . '") detected'; } - if ($register->alternative !== true) { - foreach ($registerGroup->registers as $registerOther) { - if ($register->key === $registerOther->key || $registerOther->alternative === true) { - continue; - } - - if ($register->intersectsWith($registerOther)) { - $failures[] = 'Register "' . $register->key . '" overlaps with register "' - . $registerOther->key . '"'; - } - } - } - $processedChildKeys[] = $register->key; } @@ -1118,6 +1105,22 @@ class ValidationService . implode(',', $segmentKeys) . ')'; continue; } + + $registerAddressRange = $register->addressRange($addressSpace->unitSize); + if ($register->alternative !== true) { + foreach ($registerGroup->registers as $registerOther) { + if ($register->key === $registerOther->key || $registerOther->alternative === true) { + continue; + } + + $registerOtherAddressRange = $registerOther->addressRange($addressSpace->unitSize); + if ($registerAddressRange->intersectsWith($registerOtherAddressRange)) { + $failures[] = 'Register "' . $register->key . '" overlaps with register "' + . $registerOther->key . '"'; + } + } + } + } } diff --git a/build/scripts/Targets/TargetDescriptionFiles/TargetDescriptionFile.php b/build/scripts/Targets/TargetDescriptionFiles/TargetDescriptionFile.php index 4ab60a34..34d86c0c 100644 --- a/build/scripts/Targets/TargetDescriptionFiles/TargetDescriptionFile.php +++ b/build/scripts/Targets/TargetDescriptionFiles/TargetDescriptionFile.php @@ -412,6 +412,7 @@ class TargetDescriptionFile $register->initialValue, $register->description, $register->access, + $register->alternative, array_map( fn (BitField $bitField): TargetRegisterBitField => $this->targetRegisterBitFieldFromBitField($bitField), $register->bitFields diff --git a/build/scripts/Targets/TargetRegister.php b/build/scripts/Targets/TargetRegister.php index c4619843..12e9cc50 100644 --- a/build/scripts/Targets/TargetRegister.php +++ b/build/scripts/Targets/TargetRegister.php @@ -1,9 +1,11 @@ element in a TDF, @@ -25,6 +27,7 @@ class TargetRegister public ?int $initialValue = null; public ?string $description = null; public ?string $access = null; + public ?bool $alternative = null; /** @var TargetRegisterBitField[] */ public array $bitFields; @@ -38,6 +41,7 @@ class TargetRegister ?int $initialValue, ?string $description, ?string $access, + ?bool $alternative, array $bitFields ) { $this->key = $key; @@ -48,6 +52,17 @@ class TargetRegister $this->initialValue = $initialValue; $this->description = $description; $this->access = $access; + $this->alternative = $alternative; $this->bitFields = $bitFields; } + + public function addressRange(?int $addressSpaceUnitSize): ?AddressRange + { + return $this->address !== null + ? new AddressRange( + $this->address, + $this->address + ($this->size / ($addressSpaceUnitSize ?? 1)) - 1 + ) + : null; + } }