Added Signal elements to PhysicalInterface elements in TDFs

This commit is contained in:
Nav
2024-10-03 22:45:24 +01:00
parent e522261991
commit af865d09e5
265 changed files with 2696 additions and 387 deletions

View File

@@ -5,8 +5,12 @@ class PhysicalInterface
{
public ?string $value = null;
public function __construct(?string $value)
/** @var Signal[] */
public array $signals = [];
public function __construct(?string $value, array $signals)
{
$this->value = $value;
$this->signals = $signals;
}
}

View File

@@ -1,6 +1,7 @@
<?php
namespace Targets\TargetDescriptionFiles\Services;
use Targets\TargetDescriptionFiles\PhysicalInterface;
use Targets\TargetDescriptionFiles\Pin;
use Targets\TargetDescriptionFiles\TargetDescriptionFile;
use Targets\TargetDescriptionFiles\AddressSpace;
@@ -21,6 +22,7 @@ use Targets\TargetDescriptionFiles\Pinout;
use Targets\TargetDescriptionFiles\PinoutType;
use Targets\TargetDescriptionFiles\Variant;
use Targets\TargetPeripheral;
use Targets\TargetPhysicalInterface;
use Targets\TargetRegisterGroup;
require_once __DIR__ . '/../TargetDescriptionFile.php';
@@ -77,6 +79,14 @@ class ValidationService
$processedAddressSpaceKeys[] = $addressSpace->key;
}
if (empty($tdf->physicalInterfaces)) {
$failures[] = 'Missing physical interfaces';
}
foreach ($tdf->physicalInterfaces as $physicalInterface) {
$failures = array_merge($failures, $this->validatePhysicalInterface($physicalInterface, $tdf));
}
if (empty($tdf->modules)) {
$failures[] = 'Missing modules';
}
@@ -634,6 +644,104 @@ class ValidationService
);
}
protected function validatePhysicalInterface(
PhysicalInterface $physicalInterface,
TargetDescriptionFile $tdf
): array {
$failures = [];
if (empty($physicalInterface->value)) {
$failures[] = 'Missing value';
}
$containsSignal = function (string $signalName) use ($physicalInterface): bool {
foreach ($physicalInterface->signals as $signal) {
if ($signal->name === $signalName) {
return true;
}
}
return false;
};
$enumValue = TargetPhysicalInterface::tryFrom($physicalInterface->value);
/*
* We only require ISP signals for debugWire targets, as we recommend using the ISP connection when debugging
* debugWire targets.
*/
if (
$enumValue === TargetPhysicalInterface::ISP
&& in_array(TargetPhysicalInterface::DEBUG_WIRE, $tdf->getSupportedPhysicalInterfaces())
) {
if (!$containsSignal('RESET')) {
$failures[] = 'Missing RESET signal';
}
if (!$containsSignal('SCK')) {
$failures[] = 'Missing SCK signal';
}
if (!$containsSignal('MOSI')) {
$failures[] = 'Missing MOSI signal';
}
if (!$containsSignal('MISO')) {
$failures[] = 'Missing MISO signal';
}
}
if ($enumValue === TargetPhysicalInterface::DEBUG_WIRE) {
if (!$containsSignal('dW')) {
$failures[] = 'Missing dW signal';
}
}
if ($enumValue === TargetPhysicalInterface::UPDI) {
if (!$containsSignal('UPDI')) {
$failures[] = 'Missing UPDI signal';
}
}
if ($enumValue === TargetPhysicalInterface::PDI) {
if (!$containsSignal('DATA')) {
$failures[] = 'Missing DATA signal';
}
if (!$containsSignal('CLOCK')) {
$failures[] = 'Missing CLOCK signal';
}
}
if ($enumValue === TargetPhysicalInterface::JTAG) {
if (!$containsSignal('TMS')) {
$failures[] = 'Missing TMS signal';
}
if (!$containsSignal('TDI')) {
$failures[] = 'Missing TDI signal';
}
if (!$containsSignal('TCK')) {
$failures[] = 'Missing TCK signal';
}
if (!$containsSignal('TDO')) {
$failures[] = 'Missing TDO signal';
}
}
foreach ($physicalInterface->signals as $signal) {
$failures = array_merge($failures, $this->validateSignal($signal, $tdf));
}
return array_map(
fn (string $failure): string => 'Physical Interface ("' . $physicalInterface->value
. '") validation failure: ' . $failure,
$failures
);
}
protected function validateModule(Module $module, TargetDescriptionFile $tdf): array
{
$failures = [];

View File

@@ -191,7 +191,28 @@ class FromXmlService
public function physicalInterfaceFromElement(DOMElement $element): PhysicalInterface
{
$attributes = $this->getNodeAttributesByName($element);
return new PhysicalInterface($attributes['value'] ?? null);
$output = new PhysicalInterface($attributes['value'] ?? null, []);
$signalsElements = $element->getElementsByTagName('signals');
if ($signalsElements->count() > 1) {
throw new XmlParsingException('Unexpected number of "signals" elements');
}
$signalElement = $signalsElements->item(0);
if ($signalElement instanceof DOMElement) {
foreach ($signalElement->childNodes as $childNode) {
if (!$childNode instanceof DOMElement) {
continue;
}
if ($childNode->nodeName === 'signal') {
$output->signals[] = $this->signalFromElement($childNode);
}
}
}
return $output;
}
public function moduleFromElement(DOMElement $element): Module

View File

@@ -132,6 +132,15 @@ class ToXmlService
$element = $document->createElement('physical-interface');
$element->setAttribute('value', $physicalInterface->value);
if (!empty($physicalInterface->signals)) {
$signalsElement = $document->createElement('signals');
foreach ($physicalInterface->signals as $signal) {
$signalsElement->append($this->signalToXml($signal, $document));
}
$element->append($signalsElement);
}
return $element;
}

View File

@@ -22,6 +22,7 @@ enum TargetPhysicalInterface: string
self::PDI => 'PDI',
self::UPDI => 'UPDI',
self::DEBUG_WIRE => 'debugWIRE',
default => 'Other'
};
}