Added Signal elements to PhysicalInterface elements in TDFs
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 = [];
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ enum TargetPhysicalInterface: string
|
||||
self::PDI => 'PDI',
|
||||
self::UPDI => 'UPDI',
|
||||
self::DEBUG_WIRE => 'debugWIRE',
|
||||
default => 'Other'
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user