ManyCore Visualiser

ManyCore Visualiser Icon

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:

OSVersionSoftware Requirements
Windows7 and above
macOS10.13 and above
GNU/LinuxN/Awebkit2gtk 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 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

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:

OSSupported editors (in order of preference by the visualiser)
WindowsVSCodium, VSCode, Atom, Sublime, Default notepad.exe
macOSVSCodium, VSCode, Atom, Sublime
LinuxVSCodium, VSCode, Atom, Sublime