ManyCore Visualiser
ManyCore Visualiser is a Graphical User Interface program to generate renders of 2D matrix mesh NoC many-core systems.
It allows exporting the renders in SVG
and PNG
formats.
System requirements
ManyCore Visualiser requires the following system requirements to run:
OS | Version | Software Requirements |
---|---|---|
Windows | 7 and above | |
macOS | 10.13 and above | |
GNU/Linux | N/A | webkit2gtk 4.0 |
Input format
The visualiser takes an XML
file as input. The input file must follow the below schema.
Schema
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
targetNamespace="https://www.york.ac.uk/physics-engineering-technology/ManycoreSystems"
xmlns="https://www.york.ac.uk/physics-engineering-technology/ManycoreSystems"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<!-- Types -->
<xs:simpleType name="nonZeroUnsignedByte">
<xs:annotation>
<xs:documentation>A number between 1 and 255, both inclusive.</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:unsignedByte">
<xs:minInclusive value="1" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="computationStepsRange">
<xs:annotation>
<xs:documentation>Valid range of steps for a Task's computation cost.</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:unsignedByte">
<xs:minInclusive value="10" />
<xs:maxInclusive value="200" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="communicationCostRange">
<xs:annotation>
<xs:documentation>Valid range of number of times a packet can be transmitted across an
edge of the task graph.</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:unsignedShort">
<xs:minInclusive value="10" />
<!-- RegExp pattern for effectively geeting a multiple of 10 -->
<!-- xs:pattern always anchored at start and end: ^[1-9][0-9]*0$ -->
<xs:pattern value="[1-9][0-9]*0" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="direction">
<xs:annotation>
<xs:documentation>Enum values for an router channel's direction.</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="North" />
<xs:enumeration value="South" />
<xs:enumeration value="East" />
<xs:enumeration value="West" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="SinkSourceType">
<xs:attribute name="coreID" type="xs:unsignedShort" use="required">
<xs:annotation>
<xs:documentation>The ID of the core (router) connected to this edge router.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="direction" type="direction" use="required">
<xs:annotation>
<xs:documentation>The link used to communicate with the router.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="taskid" type="xs:unsignedShort" use="required">
<xs:annotation>
<xs:documentation>The ID of the task allocated to this edge router.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
<!-- Structure -->
<xs:element name="ManycoreSystem">
<xs:annotation>
<xs:documentation>Encloses the required information to describe a manycore system at a
given instant.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="TaskGraph" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>GraphML-like representation of the system's task graph.
Each Task is a node and each Edge symbolises interdependencies between
tasks.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Task" minOccurs="1" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>A node in the system's task graph.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="id" type="xs:unsignedShort" use="required">
<xs:annotation>
<xs:documentation>A unique number identifier assigned to
each task.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="computationCost"
type="computationStepsRange" use="required">
<xs:annotation>
<xs:documentation>The computational cost associated with
this task.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="Edge" minOccurs="1" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>An Edge represents a directional connection
between two nodes in the graph.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="from" type="xs:unsignedShort" use="required">
<xs:annotation>
<xs:documentation>The unique numerical identifier of the
starting node (Task) this Edge departs from.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="to" type="xs:unsignedShort" use="required">
<xs:annotation>
<xs:documentation>The unique numerical identifier of the
destination node (Task) this Edge arrives to.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="communicationCost"
type="communicationCostRange"
use="required">
<xs:annotation>
<xs:documentation>The number of times packets will be
transmitted across this Edge.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Cores" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>The Cores element is a container for each core in the
system.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Core" minOccurs="1" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>A physical core.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Router" minOccurs="1" maxOccurs="1">
<xs:annotation>
<xs:documentation>The Router associated with this
physical core.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:anyAttribute processContents="lax" />
</xs:complexType>
</xs:element>
<xs:element name="Channels" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:documentation>The Channels element wraps each
Channel associated with this core's router.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Channel" minOccurs="4"
maxOccurs="4">
<xs:annotation>
<xs:documentation>A specific Channel. A
Core might have a maximum of 4
channels, one for each possible
communication direction.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="direction"
type="direction"
use="required">
<xs:annotation>
<xs:documentation>The direction
of this channel.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="actualComCost"
type="xs:unsignedLong"
use="required">
<xs:annotation>
<xs:documentation>The actual
communication cost.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="bandwidth"
type="xs:unsignedLong"
use="required">
<xs:annotation>
<xs:documentation>The bandwidth
of this channel.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:anyAttribute processContents="lax" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:unsignedShort" use="required">
<xs:annotation>
<xs:documentation>A unique number identifier assigned to
each Core.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="allocatedTask" type="xs:unsignedShort"
use="optional">
<xs:annotation>
<xs:documentation>The Task currently being processed by
the Core.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:anyAttribute processContents="lax" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Borders" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:documentation>The Borders element is a container for each Sink/Source
(border or edge routers) in the system.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Source" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:annotation>
<xs:documentation>A source.</xs:documentation>
</xs:annotation>
<xs:complexContent>
<xs:extension base="SinkSourceType">
<xs:attribute name="actualComCost"
type="xs:unsignedLong"
use="optional">
<xs:annotation>
<xs:documentation>The actual communication cost.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="Sink" minOccurs="0" maxOccurs="unbounded"
type="SinkSourceType">
<xs:annotation>
<xs:documentation>A sink.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="rows" type="nonZeroUnsignedByte" use="required">
<xs:annotation>
<xs:documentation>The manycore system's number of rows.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="columns" type="nonZeroUnsignedByte" use="required">
<xs:annotation>
<xs:documentation>The manycore system's number of columns.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="routingAlgo" type="xs:string" use="optional">
<xs:annotation>
<xs:documentation>The routing algorithm currently in use by the system.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>
File exporting and loading
The visualiser can export and load all the data it handles.
- Loading input files
- Loading a visualisation configuration
- Exporting input files
- Exporting configuration files
- Exporting renders
Loading input files
Loading an input file upon opening the program
Input files can be loaded by clicking the load button in the centre of the screen:
Loading a different system after a system has been loaded
To load a different system when a system is already loaded in the visualiser use
the Load > Load new system
toolbar menu:
Loading configuration files
Loading configuration files is accomplished via the Load > Load configuration
toolbar menu:
Exporting input files
Exporting input files is accomplished via the Export > Export XML
toolbar menu:
Exporting configuration files
Exporting configuration files is accomplished via the Export > Export configuration
toolbar menu:
Exporting renders
Renders can be exported in PNG and SVG formats.
FreeForm exporting can be used with both formats.
SVG rendering
PNG rendering
PNGs can be scaled upon rendering to obtain a more detailed image. Bigger images require more memory and more rendering time:
FreeForm exporting
FreeForm exporting allows selecting the area of interest within the render to
export. Guide lines can be enabled by holding the Shift
key and they are
drawn with respect to the last point added. If the Shift+Alt
keys are
held the guide lines are drawn from the first point added:
Configuring a Render
State attributes configuration
State attributes can be configured from the Settings
menu, accessible via the gear icon in the bottom left. The menu allows
to select which attributes to display and how they should be displayed.
The following modalities are available for state attributes:
Attribute type | Target Element | ||
---|---|---|---|
Core | Router | Channel | |
Numerical | 🟪 🟦 🟧 🟩 | 🟪 🟦 🟧 🟩 | 🟦 🟧 🟩 |
String | 🟧 🟩 | 🟧 🟩 | 🟧 🟩 |
Table legend:
- 🟪 Element's body fill colour.
- 🟦 Coloured text.
- 🟧 Text.
- 🟩 Statically coloured text (does not adapt to numerical value, if any).
Configuration how-tos
Further configuration
Other than the elements' attributes, other visualisation parameters can be customised. These are:
- Text used to represent an attribute (showed in Coloured text by clicking on the icon)
- Attributes and Tasks font size
- Whether to include border routers
- Routing algorithm and its representation modality
- Whether to include Task computation cost
- Override fill colour
Text
Statically coloured text
Element's body fill Colour
Coloured text
Attribute and Task font size
Border routers
Routing algorithm
Task computation cost
Overriding fill colour
Router and Core fill colours can individually be overridden by right clicking on the elements' body:
Editing a System
A system can be edited via the Settings > Edit System
menu.
This action opens an external text editor. See Additional Software requirements
for a list of supported editors.
Retrieving elements' information
Hover on cores and routers to retrieve all their state parameters:
Additional Software requirements
System editing
To edit the currently loaded system, users must install one of the following text editors:
OS | Supported editors (in order of preference by the visualiser) |
---|---|
Windows | VSCodium, VSCode, Atom, Sublime, Default notepad.exe |
macOS | VSCodium, VSCode, Atom, Sublime |
Linux | VSCodium, VSCode, Atom, Sublime |