Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
language:expressions [2024/03/20 07:18] rajit [Operator Precedence] |
language:expressions [2024/07/19 10:26] (current) rajit [Bit-width rules] |
||
---|---|---|---|
Line 48: | Line 48: | ||
===== Expressions in CHP ===== | ===== Expressions in CHP ===== | ||
- | The same expression syntax is also used in the '' | + | The same expression syntax is also used in the '' |
+ | |||
+ | ==== Bit-width rules ==== | ||
+ | |||
+ | The rules that are used to determine the bit-width of an expression involving circuit variables | ||
* Each variable has the bit-width specified by its type. | * Each variable has the bit-width specified by its type. | ||
- | * A constant uses the minimum number of bits needed to represent it. Note that a negative constant is assumed to be a two's complement value, an its bit-width is determined in the same way. | + | * A constant uses the minimum number of bits needed to represent it. Note that a negative constant is assumed to be a two's complement value, an its bit-width is determined in the same way. If you are unsure about what is going to happen and want to control the bit-width of a constant, '' |
* For unary operators, the bit-width of the result is the same as the bit-width of the argument | * For unary operators, the bit-width of the result is the same as the bit-width of the argument | ||
* For binary operators and ternary operators where the result is an integer, let //left// be the bit-width of the left-hand side of the operator, and //right// be the bit-width of the right hand side. There are six categories of result bit-widths: | * For binary operators and ternary operators where the result is an integer, let //left// be the bit-width of the left-hand side of the operator, and //right// be the bit-width of the right hand side. There are six categories of result bit-widths: | ||
Line 72: | Line 76: | ||
- //left// + 2^//right// - 1 | - //left// + 2^//right// - 1 | ||
* left shift ''<<'' | * left shift ''<<'' | ||
- | * For concatenation, | + | * For concatenation, |
+ | * For bitfield extraction, the bitwidth is determined by the number of bits extracted. | ||
While these bit-width rules are nice because you never lose bits, they can have some unexpected consequences. One of the not-so-nice effects of these rules is that, technically, | While these bit-width rules are nice because you never lose bits, they can have some unexpected consequences. One of the not-so-nice effects of these rules is that, technically, | ||
Line 105: | Line 110: | ||
Now the right hand side of the first assignment takes '' | Now the right hand side of the first assignment takes '' | ||
+ | ==== Conversion from/to integer to/from pure structures ==== | ||
+ | |||
+ | A [[language: | ||
+ | <code act> | ||
+ | mystructname s; | ||
+ | int< | ||
+ | ... | ||
+ | chp { | ||
+ | ... | ||
+ | x := int(s); | ||
+ | s := mystructname(x) | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | In this example, '' | ||
+ | The expression " | ||
+ | |||
+ | When a structure has multiple fields, ACT packs them into an integer in left-to-right field order. So, for example, the structure | ||
+ | |||
+ | <code act> | ||
+ | deftype mystruct (int< | ||
+ | </ | ||
+ | would have the '' | ||
===== Functions ===== | ===== Functions ===== | ||
Line 249: | Line 277: | ||
An example of file I/O implemented with external functions can be found in the '' | An example of file I/O implemented with external functions can be found in the '' | ||
- | ==== Operator Precedence ==== | + | ===== Operator Precedence |
The operators have the following precedence, from the highest to lowest: | The operators have the following precedence, from the highest to lowest: | ||
Line 255: | Line 283: | ||
- '' | - '' | ||
- '' | - '' | ||
- | - ''<<'', | + | - ''<<'', |
- ''&'' | - ''&'' | ||
- '' | - '' |