In this Chapter, we will explain some of the Cyclone language features in detail. This may help you to understand Cyclone better for building your models.
The value of a variable in Cyclone can be changed from state to state. In the current version of Cyclone, there are five types of variable a user can use.
An integer type variable is declared using keyword int. The range of an integer is the same as the those integers in a general purpose programming language such as Java and C++. That is from -2147483648 to 2147483647. For example, the following piece of code creates an integer type variable called x, and this x is initialized with value of 0.
int x=0;
A real type variable is declared using keyword real. The range of a real number is from about 3.40282347x1038 to 1.40239846x10-45. For example, the following piece of code simply creates a real number of x,
real x=-2.32;
When Cyclone produces a trace that has real numbers, by default two digits after a decimal point are preserved. However, one can set a different precision through an option. For example, the following option tells the compiler to preserve 4 digits (after a decimal point) during trace generation.
option-precision=4;
A bool type variable is declared using keyword bool. Only boolean-typed values (true and false) can be assigned to a bool type variable. For example, the following initialization of a boolean variable is illegal.
bool b=x+3; //illegal
An enum type variable is used for a set of predefined constants. This is done through using enum. An enum variable must be equal to one of the predefined constants. You can use a # to assign an enum variable to one of its predefined constants. For example, the following piece of code assigns a constant ON to the variable switch.
enum {ON, OFF} switch=#ON;
A constant in Cyclone is very much the same as constants in other programming languages. That is once a constant is defined its value cannot be changed from state to state. To declare a constant data type, one can use the keyword constant. For example, the following code declares 3 different kinds of constants.
const int A = 3;
const real PI = 3.1415926;
const bool B = true;
An enum type is a special constant. Thus, it cannot be declared using the keyword constant.
A record type in Cyclone is a complex data type. It allows users to use a mix of different data field in a single data type. Currently, a user can declare the integer, real, bool and enum data fields within a record. For example, the following record creates a point that contains two integer fields:
record point {
int x;
int y;
};
We use a dot operator (.) to access its field just like other programming languages. Thus, the following code assigns a 0 to the field x in point.
point.x = 0;
Each data field declared inside a record type can be associated with a where clause. A field is associated with a where clause is a conditional field (variable). See below.
In Cyclone, users can use a special type of variable called conditional variable to build their models. So what is a conditional variable ?
In short, a conditional variable is a variable that is attached to a boolean condition. During computation, a conditional variable must meet the attached condition. Conditional variables are quite useful for limiting the range of a variable. To create a conditional variable, users can create a normal variable first and then use a where clause to specify a condition. For example, the following piece of code creates a conditional variable x
int x = 1 where x <= 0 && x >= 3;
This variable x is a conditional variable. It is initialized with a value of 1 and attached to a condition: it must stay between 0 and 3 during the computation.
There are some rules when creating a conditional variable:
For example, the following conditional variables are illegal in Cyclone.
int x where x = x+1; //not a boolean condition
int y where y > x;//refer to another variable x
const int z where z > 2;//z is a constant
Semantically speaking, the condition specified by a conditional variable must hold in any computation. This includes each computation in every node/state including initial node/state.
The following piece of code shows a valid conditional variable in use of computing an area of a circle.
const real PI=3.14159;
const int MAX=15;
const int MIN=7;
int r where r >= MIN && r <= MAX;
real area = PI * r * r;
During any computation, the variable r must stay between 7 and 15.
To keep the design of Cyclone simple, all variables declared in Cyclone are visible to every node/state. Thus, every node/state can use a variable for its own computation. However, sometime we would like to use a variable that does not depend on other states. In other words, this variable is state independent. A user can use fresh variables for state independent variables.
@2020-2022 Hao Wu. All rights reserved. Last update: May 30, 2022