External-Facing Devices

These will interact with higher levels of the SKA control system (i.e. Low.CSP) All require the SKA LMC base classes, which will be installed into the Docker image as part of the build process.

LowCbfController

The sub-element controller is the primary point of control and coordination for general operations from CSP_Low.LMC.

In the future (not yet implemented): * Controller will subscribe to attributes of the internal Allocator device, and split them out into simpler attributes that can be consumed by Taranta Dashboards. * Controller will compare the state of Processors published by the Allocator to their actual state to give a measure of their “health”

LowCbfSubarray

A Low.CBF subarray represents grouping of input signal data streams (from SPS), and controls Low.CBF’s processing of those signals to generate desired visibility and beam outputs.

The subarray device implements the SKA obsstate state machine but delegates the remainder of most requests it receives to the Allocator device which coordinates access to shared hardware.

There will be 16 instances of the subarray Tango device, inclusive of any engineering subarrays.

Attribute/Command list

Subarray device Tango attributes

LowCbfSubarray.adminMode()

Read the Admin Mode of the device.

It may interpret the current device condition and condition of all managed devices to set this. Most possibly an aggregate attribute.

Return type:

AdminMode

Returns:

Admin Mode of the device

LowCbfSubarray.assigned_processors()

Get a list of processors assigned to the subarray.

Return type:

str

Returns:

JSON string, a list of processor serial numbers

LowCbfSubarray.delaysValid()

Get per-subarray delay polynomial validity value.

Legal values are:

  • 0 - INVALID

  • 1 - VALID

  • 2 - UNUSED

Returns:

delay validity status as integer

Return type:

DevUShort

LowCbfSubarray.processorsReadyPercent()

Get a percentage of processors ready for subarray scan.

The value is meaningful only when obsState is READY or SCANNING so we also return Tango attribute quality.

Return type:

tuple[int, float, AttrQuality]

Returns:

tuple

  • percentage: rounded integer in the range [0, 100], None when ATTR_INVALID

  • time: float

  • quality: AttrQuality

LowCbfSubarray.pstJonesAppliedPercent()

Get a percentage of PST Jones applied.

The value is meaningful only when obsState is READY or SCANNING so we also return Tango attribute quality.

Return type:

tuple[int, float, AttrQuality]

Returns:

tuple

  • percentage: rounded integer in the range [0, 100], None when ATTR_INVALID

  • time: float

  • quality: AttrQuality

LowCbfSubarray.pssJonesAppliedPercent()

Get a percentage of PSS Jones applied.

The value is meaningful only when obsState is READY or SCANNING so we also return Tango attribute quality.

Return type:

tuple[int, float, AttrQuality]

Returns:

tuple

  • percentage: rounded integer in the range [0, 100], None when ATTR_INVALID

  • time: float

  • quality: AttrQuality

LowCbfSubarray.pstJonesAge()

Get the age of latest PST Jones applied.

The value is meaningful only when obsState is READY or SCANNING so we also return Tango attribute quality.

Return type:

tuple[int, float, AttrQuality]

Returns:

tuple

  • age: age of the PST Jones Matrix

  • time: float

  • quality: AttrQuality

LowCbfSubarray.pssJonesAge()

Get the age of latest PSS Jones applied.

The value is meaningful only when obsState is READY or SCANNING so we also return Tango attribute quality.

Return type:

tuple[int, float, AttrQuality]

Returns:

tuple

  • age: age of the PST Jones Matrix

  • time: float

  • quality: AttrQuality

LowCbfSubarray.processorEthernetLockedPercent()

Get a percentage of Ethernet ports (processor/switch) ready for scan.

The value is meaningful only when obsState is READY or SCANNING so we also return Tango attribute quality.

Return type:

tuple[int, float, AttrQuality]

Returns:

tuple

  • percentage: rounded integer in the range [0, 100], None when ATTR_INVALID

  • time: float

  • quality: AttrQuality

LowCbfSubarray.pssBeams()

Return the pssBeams attribute.

Return type:

str

LowCbfSubarray.pstBeams()

Return the pstBeams attribute.

Return type:

str

LowCbfSubarray.sps_archive_interval()

Set/get archive interval (1 in N updates)

Return type:

int

LowCbfSubarray.sps_beam_freqs()
Return type:

str

Returns:

beam/freq order used for SPS stats

LowCbfSubarray.sps_station_substations()

Return station/substation order used for SPS stats

Return type:

str

LowCbfSubarray.sps_stats_flag_percent()

Return latest SPS flagging statistics

Returns:

2D array (stations * channels) of np.uint8; range: [0, 100]%, 255 if no data

LowCbfSubarray.sps_stats_rms_xpol()

Return latest SPS X-polarisation RMS statistics

Returns:

2D array (stations * channels) of np.uint8

LowCbfSubarray.sps_stats_rms_ypol()

Return latest SPS Y-polarisation RMS statistics

Returns:

2D array (stations * channels) of np.uint8

LowCbfSubarray.stationBeams()

Return the stationBeams attribute.

Return type:

str

LowCbfSubarray.stations()

Report station & substation membership in subarray

Return type:

str

LowCbfSubarray.write_adminMode(value)[source]

Set the Admin Mode of the device. Overide of ska-tango-base to prevent being set offline while resourced

Parameters:

value (AdminMode) – Admin Mode of the device.

Raises:

ValueError – for unknown adminMode

Return type:

None

LowCbfSubarray.stationBeamDelayReadyPercent()

Get a percentage of station beam delay subscriptions ready for subarray scan.

The value is meaningful only when obsState is READY or SCANNING so we also return Tango attribute quality.

Return type:

tuple[int, float, AttrQuality]

Returns:

tuple

  • percentage: rounded integer in the range [0, 100], None when ATTR_INVALID

  • time: float

  • quality: AttrQuality

LowCbfSubarray.pssBeamDelayReadyPercent()

Get a percentage of PSS beam delay subscriptions ready for for subarray scan.

The value is meaningful only when obsState is READY or SCANNING so we also return Tango attribute quality.

Return type:

tuple[int, float, AttrQuality]

Returns:

tuple

  • percentage: rounded integer in the range [0, 100], None when ATTR_INVALID

  • time: float

  • quality: AttrQuality

LowCbfSubarray.pstBeamDelayReadyPercent()

Get a percentage of PST beam delay subscriptions ready for for subarray scan.

The value is meaningful only when obsState is READY or SCANNING so we also return Tango attribute quality.

Return type:

tuple[int, float, AttrQuality]

Returns:

tuple

  • percentage: rounded integer in the range [0, 100], None when ATTR_INVALID

  • time: float

  • quality: AttrQuality

LowCbfSubarray.sdpHostsResolvedPercent()

Return percentage of SDP hosts resolved.

LowCbfSubarray.pssHostsResolvedPercent()

Return the percentage of PSS hosts resolved.

LowCbfSubarray.pstHostsResolvedPercent()

Return the percentage of PST hosts resolved.

LowCbfSubarray.processorFpgaTemperatureMean()

Get the mean FPGA temperature across all assigned processors.

The value is meaningful only when obsState is READY or SCANNING so we also return Tango attribute quality.

Return type:

tuple[float, float, AttrQuality]

Returns:

tuple

  • value: mean temperature in degrees C

  • time: float

  • quality: AttrQuality

LowCbfSubarray.processorFpgaPowerMean()

Get the mean FPGA power across all assigned processors.

The value is meaningful only when obsState is READY or SCANNING so we also return Tango attribute quality.

Return type:

tuple[float, float, AttrQuality]

Returns:

tuple

  • value: mean power in Watts

  • time: float

  • quality: AttrQuality

Controller device Tango attributes

LowCbfController.all_alveos()

Return JSON string listing all Alveos registered with Allocator.

Return type:

str

LowCbfController.available_alveos()

Return JSON string listing all available Alveos.

Return type:

str

LowCbfController.health_connectors()

Health of all Connectors.

Return type:

List[int]

LowCbfController.health_processors()

Health of all Processors.

Return type:

List[int]

LowCbfController.health_table()

Read FQDNs and health states of all monitored devices.

Return type:

str

Returns:

JSON string

LowCbfController.read_searchBeamBandwidthMode()[source]

Search Beam Bandwidth Mode is configured at sub-element level and applies for all the instances of the Capability Search Beams in all sub-arrays.

Supported modes are listed and described in Table 9-9

TM can change the value of the parameter Search Beam Bandwidth Mode only when all the sub-arrays are IDLE.

Return type:

SearchBeamBandwidthMode

Returns:

the searchBeamBandwidthMode attribute (SINGLE, DOUBLE)

LowCbfController.subelementSubarrays()

List of Low.CBF SubArray TANGO Device names.

LowCbfController.write_searchBeamBandwidthMode(value)[source]

Set the searchBeamBandwidthMode attribute.

Parameters:

value (SearchBeamBandwidthMode) – SINGLE, DOUBLE

LowCbfController.spsLinkUpPercent()

Return the quality attribute percent SPS.

Note that this quality attribute needs to be pulled by TMC. This is not automatically updated.

Return type:

float

LowCbfController.cbfPacketCorruptionRate()

Get the CBF Packet Corruption Rate.

This packet corruption rate is calculated as PCR = corrupted packets / received SPEAD packets Note that the number of packets counters are coded over 32 bits. This might provide erroneous values from time to time when they wrap around

When there are no Alveos assigned to any subarrays set the attribute quality to ATTR_INVALID

Return type:

tuple[float, float, AttrQuality]

LowCbfController.cbfPacketLossRate()

Get the CBF Packet Loss Rate.

This packet loss rate is calculated as PLR = absent SPEAD packets / received SPEAD packets Note that the number of packets counters are coded over 32 bits. This might provide erroneous values from time to time when they wrap around

When there are no Alveos assigned to any subarrays set the attribute quality to ATTR_INVALID

Return type:

tuple[float, float, AttrQuality]

Internal Devices

These devices are not expected to directly interface with the wider control system.

LowCbfAllocator

The Allocator coordinates how hardware processing resources are shared between subarrays. Subarrays delegate most of the processing involved in their ConfigureScan requests to the Allocator. Allocator publishes two key attributes that other devices subscribe to: * internal_subarray provides information about every configured subarray. This info is needed by all processors to e.g determine destination addresses for beams or visibilties * internal_alveo is a JSON dictionary with Alveo serial numbers as keys, and values describing the desired internal state of every in-use Alveo All processor devices subscribe to the attributes and make best effort to conform themselves to the published state

Attribute/Command list

Allocator device Tango attributes

LowCbfAllocator.alveo_firmware_image_names()

Read the firmware to run on each alveo.

Return type:

str

Returns:

JSON string - dict of alveo firmware entries

INTERNAL use only

LowCbfAllocator.internalAlveoLimits()

Read the current override limits

Return type:

str

LowCbfAllocator.internal_alveo()

Get representation of internal state of all Processor devices that are configured with firmware (no firmware, no entry here)

Return type:

str

Returns:

JSON string containing a dictionary

  • key = alveo serial number;

  • value = dict containing keys fw, regs.

fw value is a dict with personality and url keys (each strings).

INTERNAL use only

LowCbfAllocator.internal_subarray()

Get representation of internal state of all configured subarrays (no configuration, no entry in dict)

Return type:

str

Returns:

JSON string containing a dictionary

  • key = subarray_id number

  • value = subarray definition (also a dict)

INTERNAL use only

LowCbfAllocator.p4_stn_routes()

Get route info needed by P4 switches to route SPS packets

Return type:

str

Returns:

JSON string

LowCbfAllocator.procDevFqdn()

Return a JSON string representation of dictionary mapping Alveo serial numbers to Tango device fqdn, e.g.

{
   "XFL1XCRTUC22": "low-cbf/processor/0.0.0",
   "XFL1TJCHM3ON": "low-cbf/processor/0.0.1"
}
Return type:

str

LowCbfAllocator.resourceTableP4()

Return the P4 resource table attribute.

Return type:

str

Returns:

JSON string

LowCbfAllocator.sdp_routes()

Get list of SDP routes for each switch

Return type:

str

Returns:

JSON string dictionary

  • key = switch_id or “arp_rq”

  • value = routes or arp_list

LowCbfAllocator.stats_alveo()

Get list of alveo statistics.

Return Alveo details, its usage by subarrays and any unused capacities that it may have.

Return type:

str

Returns:

JSON string containing a list of Alveo details

INTERNAL use only

LowCbfAllocator.write_alveo_firmware_image_names(value)[source]

Set up or clear a firmware renaming for test

Parameters:

value (str) –

JSON string encoding a Dictionary with

  • key=alveo_id

  • value=firmware_name

Return type:

None

Returns:

None

INTERNAL use only

LowCbfAllocator.write_internalAlveoLimits(limit_json)[source]

Expert level attribute: Change per-alveo allocation limits

Use empty dictionary to reset to defaults. EG current FPGA maximums are

{
    "pst": {
        "vch": 900,   # Virtual chans per pipeline (bf clock freq)
        "sps_ch": 1024,  # SPS chan per pipeline (packetizer limit)
    },
    "pss": {
        "vch": 960,  # VCH per pipeline (intermittent fails @ 1020)
        "sps_ch": 128  # SPS chans per pipeline (packetizer limit)
    },
    "vis": {
        "vch": 1024,  # Virtual Channels into FPGA
        "hbm": 606,  # VChans in one matrix correlator's (MxC) HBM
        "bli": 131328  # Baselines (=512*513/2) in one MxC
    }
}
Parameters:

limit_json

limit dictionary as JSON.

INTERNAL use only

Allocator device Tango commands

LowCbfAllocator.InternalRegisterAlveo(argin)

Called by Processors to register their presence.

argin Serial numbers and FQDN to register, JSON string, e.g.

{
   "serial": "A123",
   "fqdn":  " "low-cbf/processor/0.1.0",
   "hardware": "u55c"  # unused at present
}

Return None

INTERNAL use only

LowCbfAllocator.ReleaseAllCapabilities(argin)

Called by Subarrays to release all current “Capabilities”

argin string ignored at present.

Return informational text string.

LowCbfAllocator.ReserveCapabilities(argin)

Called by Subarrays to request “Capabilities” (stations, PST/PSS beams, visibilities)

argin Allocation request, JSON string

Return success/fail as JSON string

LowCbfAllocator.RunScan(argin)

Called by Subarrays to start/stop their processors scanning.

argin JSON string, presently ignored

Return informational text string.

LowCbfAllocator.SubscribeToConnector()

Temporary method called to cause Allocator to subscribe to events from a Tango device that has attributes providing ARP reply info

argin A JSON string containing Tango device name and attribute name e.g.

'{"dev": "low-cbf/connector/0", "attr": "sdp_arp_reply"}'
LowCbfAllocator.UnsubscribeFromConnector()

Temporary method called to cause Allocator to unsubscribe from ARP events sent by connector

INTERNAL use only