File Format¶
Types¶
Type |
Description |
Examples |
|---|---|---|
|
Decimal |
|
|
Alphanumeric or |
|
|
Relative number; specified as percentage |
|
|
Hex-color in |
|
|
A string; Must be enclosed in double-quotes |
|
|
A tuple; element-types are specified in parentheses |
|
|
A set; element-type is specified in parentheses |
|
|
A regex; Must be enclosed in |
|
|
A boolean ( |
|
Type aliases¶
Alias |
Type |
Description |
|---|---|---|
|
|
A position |
|
|
A target (i.e., a zone, an atom, or a set containing multiple targets) |
|
|
A time; can also be one of the relative times |
Machine Configuration¶
Configuration parameters for the machine are set in a .namachine-file.
The file-name will be the machine-id.
It contains multiple configuration-blocks:
Display-name¶
A human-readable name for the machine can be set in the name-field.
name: <string> // Name of the machine
Movement Speeds¶
The maximum movement speed of the machine is specified in the movement-block.
The machine will interpolate using constant jerk while respecting this max_speed.
movement {
max_speed: <number>> // Max speed
}
Times¶
The time-block allows setting the time of the operations.
time {
load: <number> // Time to load an atom
store: <number> // Time to store an atom
ry: <number> // Time for ry-operation
rz: <number> // Time for rz-operation
cz: <number> // Time for cz-operation
unit: <string> // Displayed time-unit
}
Distances¶
The distance-block allows specifying various distances.
distance {
interaction: <number> // Interaction-radius for all operations that operate on nearby atoms
unit: <string> // Displayed distance-unit
}
Zones¶
A zone can be defined with a zone-block.
It should be given a unique ID and bounds.
zone <id> {
from: <position> // First coordinate of rectangle
to: <position> // Second coordinate of rectangle
}
Static Traps¶
A static trap can be defined with the trap-block.
It should be given a position.
trap <id> {
position: <position> // Position of the trap
}
Visual Configuration¶
Visual configuration can be specified in a .nastyle-file.
It contains the following blocks:
Display-name¶
A human-readable name for the style can be set in the name-field.
name: <string> // Name of the style
Atoms¶
The atom-block allows specifying settings regarding the appearance of atoms.
atom {
trapped {
color: <color> // Color of a trapped atom
}
shuttling {
color: <color> // Color of a shuttling atom
}
legend {
name {
<regex>: <string> // Display a text over all atoms whose ID matches the key-regex; the displayed text is the replacement from the value
// Example to display all ids: `^.*$: "$0"`
}
font {
family: <string> // Font-Family of the text on the atoms
size: <number> // Size of the text on the atoms
color: <color> // Color of the text on the atoms
}
}
radius: <number> // Radius of atoms
}
Zones¶
The zone-block allows specifying settings regarding the appearance of zones.
zone {
config <regex> { // The settings below will be applied to all zones matching this regex
color: <color> // The color of the zone
line {
thickness: <number> // The line thickness of the zone
dash {
length: <number> // The length of dash-segments of the line
duty: <percentage> // How much of the dash-segment will be filled
}
}
name: <string> // What to display the zone as; the name can reference groups from the regex
}
legend {
display: <boolean> // Whether to display the zone-names in the sidebar legend
title: <string> // The heading over the zones in the sidebar
}
}
Operations¶
The operation-block allows specifying settings regarding the appearance of operations.
operation {
config {
ry {
color: <color> // Color of ry-operations
name: <string> // Name to display in the sidebar legend
radius: <number | percentage> // How big the atoms should be during ry-operations; either absolute or relative
}
rz {
color: <color> // Color of rz-operations
name: <string> // Name to display in the sidebar legend
radius: <number | percentage> // How big the atoms should be during rz-operations; either absolute or relative
}
cz {
color: <color> // Color of cz-operations
name: <string> // Name to display in the sidebar legend
radius: <number | percentage> // How big the atoms should be during cz-operations; either absolute or relative
}
}
legend {
display: <boolean> // Whether to display the operation-names in the sidebar legend
title: <string> // The heading over the operations in the sidebar
}
}
Machine¶
The machine-block allows specifying settings regarding the appearance of the machine.
machine {
trap {
color: <color> // Color of the traps
radius: <number> // Radius of the traps
line_width: <number> // Line width of the traps
name: <string> // Name to display in the sidebar legend
}
shuttle {
color: <color> // Color of the shuttle
line {
thickness: <number> // The line thickness of the shuttle
dash {
length: <number> // The length of dash-segments of the line
duty: <percentage> // How much of the dash-segment will be filled
}
}
name: <string> // Name to display in the sidebar legend
}
legend {
display: <boolean> // Whether to display the trap and shuttle names in the sidebar legend
title: <string> // The heading over the names in the sidebar
}
}
Coordinates¶
The coordinate-block allows specifying settings regarding the appearance of the coordinate system.
coordinate {
tick {
x: <number> // Distance of ticks in the x-direction
y: <number> // Distance of ticks in the y-direction
color: <color> // Color of the grid
line {
thickness: <number> // The line thickness of the grid
dash {
length: <number> // The length of dash-segments of the line
duty: <percentage> // How much of the dash-segment will be filled
}
}
display: <boolean> // Whether to display the coordinate ticks
}
number {
x {
distance: <number> // Distance between coordinate numbers in x-direction
position: <'top' | 'bottom'> // Display numbers on top or bottom
}
y {
distance: <number> // Distance between coordinate numbers in y-direction
position: <'left' | 'right'> // Display numbers on left or right side
}
display: <boolean> // Whether to display the numbers
font {
family: <string> // Font-Family of the numbers
size: <number> // Size of the numbers
color: <color> // Color of the numbers
}
}
axis {
x: <string> // Name of the x-axis
y: <string> // Name of the y-axis
display: <boolean> // Whether to display the axis-names
font {
family: <string> // Font-Family of the axis names
size: <number> // Size of the axis names
color: <color> // Color of the axis names
}
}
margin: <number> // Margins around the coordinate system; The content is automatically fitted to the smallest bounding rectangle which contains all zones and atoms at all times.
}
Time¶
The time-block allows specifying settings regarding the appearance of the time.
time {
display: <boolean> // Whether to display the current time
prefix: <string> // Text to display before the time
precision: <number> // Number of decimal places to show. Should be a natural number.
font {
family: <string> // Font-Family of the time
size: <number> // Size of the time
color: <color> // Color of the time
}
}
Viewport¶
The viewport-block allows specifying settings regarding the appearance of the animation.
viewport {
margin: <number> // Margin around the viewport
color: <color> // Background-color of the viewport
}
Visualization Input¶
Properties¶
Some properties can be set using special directives.
These directives start with the #-character.
Target machines¶
Possible target machines can be specified using the target-directive.
Multiple machines may be specified using multiple target-directives.
This allows the user to select from the supported machines, though they may still force unsupported/unspecified machines.
#target <id>
#target <id>
#target <id>
Instructions¶
Atoms¶
An atom can be defined with the atom-instruction.
It should be given a unique ID and a starting position.
atom <position> <id>
Timed Instructions¶
Some instructions are timed, meaning they start at a specified time.
This starting-time is specified after an @-character at the start of the line.
@<time> <instruction>
Loading an atom¶
An atom can be loaded at its current position using the load-command, optionally with a load target position.
@<time> load [position] <id>
Storing an atom¶
An atom can be loaded at its current position using the store-command, optionally with a load target position.
@<time> store [position] <id>
Moving an atom¶
An atom can be moved to a new position using the move-command.
@<time> move <position> <id>
rz-operation¶
The rz-operation can be applied to a target using the rz-command.
@<time> rz <number> <target>
ry-operation¶
The ry-operation can be applied to a target using the ry-command.
@<time> ry <number> <target>
cz-operation¶
The cz-operation can be applied to a target using the cz-command.
@<time> cz <target>
Syntactic Sugar¶
Automatic Time / Relative Time¶
The time may be specified relative to the start or the end of the previous operation.
@+/@+0/@-/@-0: Execute immediately after end of preceding instruction@+n: Executentime-steps after end of preceding instruction@-n: Executentime-steps before end of preceding instruction@=/@=+/@=+0/@=-/@=-0: Execute immediately at start of preceding instruction@=+n: Executentime-steps after start of preceding instruction@=-n: Executentime-steps before start of preceding instruction
Grouping¶
Instructions and times may be grouped by specifying the time/instruction and all group-members in brackets ([/]).
A group’s end-time (for the relative time of the next instruction) is the latest any of its instructions is finished.
Groups may be variable.
This is denoted by prepending a ~ to the group start symbol (~[/]).
Normal groups make all instructions take the same time.
A variable group makes all instructions take their minimum time.
The group’s ent-time is not affected by this, only the end-times of its children instructions.
@<time> [
<instruction>
<instruction>
<...>
<instruction>
]
@<time> <instruction> [
<arguments>
<arguments>
<...>
<arguments>
]
// Variable groups
@<time> ~[
<instruction>
<instruction>
<...>
<instruction>
]
@<time> <instruction> ~[
<arguments>
<arguments>
<...>
<arguments>
]
Comments¶
Comments in files are ignored. They can be used to document the code or to temporarily ignore parts of the instructions.
Single-line comments¶
Single-line comments start at
//and go to the end of the line.Multi-line comments¶
Multi-line comments start at
/*and go to the next*/.