5.8 The ConPro Programming Language 175
Registers are single storage elements either used as a shared global object
or as a local object inside a process. In the case of a global object, the register
provides concurrent read access (not requiring a Mutex guarded scheduler)
and exclusive Mutex guarded write access. If there is more than one process
trying to write to the register, a Mutex guarded scheduler serializes the write
accesses. There are two different schedulers available with static priority and
dynamic FIFO scheduling policies.
Variables are storage elements inside a memory block either used as a
shared global object (the memory block itself) or as a local object inside a pro-
cess. A variable always provides exclusive Mutex guarded read and write
access by the memory block to which it belongs.
Different variables concerning both data type and data width can be stored
in one or different memory blocks, which are mapped to generic RAM blocks.
Address management is done automatically during synthesis and is transpar-
ent to the programmer. Direct address references or manipulation (aka
pointers) are not supported.
The memory data width, always having a physical type logic/bit-vector, is
scaled to the largest variable stored in memory. To reduce memory data
width, variables can be fragmented, that means a variable is scattered over
several memory cells.
Different memory blocks can be created explicitly, and variables can be
assigned to different blocks.
Queues are storage elements with FIFO data transfer order and synchro-
nized inter-process communication objects, too. They are always used as
shared global objects. Queues and channels can be read directly in expres-
sions and can be used on the left-hand side of assignments like any other
storage object.
Channels are similar to queues. But they can be buffered (behaviour like a
queue with one cell, depth is 1) or unbuffered (providing only a handshake
data transfer).
Def. 5.13 ConPro data storage and signal object definitions and data types with
optional parametrization (DT: Data type, width: bit width including sign bit,
[..]: optional)
regname:DT[withparameter=value];
varname:DT[inblockname];
blockname;
signame:DT;
queuename:DT[withdepth=value];
channelname:DT[withdepth=value];
TYPEDT={logic,logic[width],int[width],bool,char
}
TYPEOT={reg,var,sig,queue,channel}
S. Bosse, Unified Distributed Sensor and Environmental Information Processing with Multi-Agent Systems
epubli, ISBN 9783746752228 (2018)