Validating resolved target peripherals in TDF validation

This commit is contained in:
Nav
2024-06-05 19:28:49 +01:00
parent 4e837218e5
commit 75c58310ad
4 changed files with 101 additions and 3 deletions

View File

@@ -19,6 +19,8 @@ use Targets\TargetDescriptionFiles\Signal;
use Targets\TargetDescriptionFiles\Pinout;
use Targets\TargetDescriptionFiles\PinoutType;
use Targets\TargetDescriptionFiles\Variant;
use Targets\TargetPeripheral;
use Targets\TargetRegisterGroup;
require_once __DIR__ . '/../TargetDescriptionFile.php';
@@ -150,6 +152,15 @@ class ValidationService
$processedVariantNames[] = $variant->name;
}
// Validate resolved peripherals
foreach ($tdf->peripherals as $peripheral) {
if (($targetPeripheral = $tdf->getTargetPeripheral($peripheral->key)) === null) {
continue;
}
$failures = array_merge($failures, $this->validateTargetPeripheral($targetPeripheral, $tdf));
}
return $failures;
}
@@ -915,4 +926,59 @@ class ValidationService
$failures
);
}
protected function validateTargetPeripheral(TargetPeripheral $targetPeripheral, TargetDescriptionFile $tdf): array
{
$failures = [];
foreach ($targetPeripheral->registerGroups as $registerGroup) {
$failures = array_merge($failures, $this->validateTargetRegisterGroup($registerGroup, $tdf));;
}
return array_map(
fn (string $failure): string => 'Resolved target peripheral "' . $targetPeripheral->name
. '" validation failure: ' . $failure,
$failures
);
}
protected function validateTargetRegisterGroup(
TargetRegisterGroup $registerGroup,
TargetDescriptionFile $tdf
): array {
$failures = [];
if (
!empty($registerGroup->addressSpaceKey)
&& ($addressSpace = $tdf->getAddressSpace($registerGroup->addressSpaceKey)) instanceof AddressSpace
) {
foreach ($registerGroup->registers as $register) {
$intersectingSegments = $addressSpace->findIntersectingMemorySegments(
$register->address,
($register->address + $register->size - 1)
);
if (empty($intersectingSegments)) {
$failures[] = 'Register "' . $register->key . '" is not contained within any memory segment';
continue;
}
if (count($intersectingSegments) > 1) {
$segmentKeys = array_map(
fn (MemorySegment $segment): string => '"' . $segment->key . '"',
$intersectingSegments
);
$failures[] = 'Register "' . $register->key . '" spans multiple memory segments ('
. implode(',', $segmentKeys) . ')';
continue;
}
}
}
return array_map(
fn (string $failure): string => 'Target register group "' . $registerGroup->name
. '" validation failure: ' . $failure,
$failures
);
}
}