Skip to content
Open
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions docs/syrec_language_semantics.md
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,39 @@ The parser will not report an overlap in the assignment due to the index of the

- The value of the step size of a ForStatement cannot be defined as or evaluate to 0 to prevent an infinite loop.

````{warning}
Copy link
Copy Markdown

@Geremia Geremia Feb 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TooMuchDakka This seems to cause Markdown formatting issues:

Suggested change
````{warning}

(At least it doesn't render correctly here on GitHub.)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not see any markdown formatting issues (see screenshot below) when performing a local build of the docs via nox -s docs.

grafik

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, this is fine and typical nesting syntax


Uncalling modules containing a _ForStatement_ could lead to unexpected index-out-of-range errors if one is not familiar with the semantics of how a _ForStatement_ or more specifically its value range is inverted, with the inversion semantics being inherited by SyReC from its reversible programming language predecessor Janus {cite:p}`yokoyama2007janus`.

A loop (_ForStatement_) defined as {math}`for \ e_1 \ to \ e_2 \ step \ s \ do \ s_1, s_2, \dots, s_n \ rof`
is inverted by inverting not only the sequence of statements in its loop body but also by inverting its value range thus the inversion of the given loop is equal to
{math}`for \ e_2 \ to \ e_1 \ step \ s \ do \ {s_n}^{-1}, \dots, {s_2}^{-1}, {s_1}^{-1} \ rof`.

The inversion result of the _ForStatement_ as well as its enclosing module `basicBitwiseIncr` is equal to the module `invrBasicBitwiseIncr` with both modules being shown in the example below:

```text
module basicBitwiseIncr(inout a(4), inout b(4))
for $i = 0 to #a do
++= a.$i;
--= b.$i
rof

// Inversion of basicBitwiseIncr equal to "uncall basicBitwiseIncr(a, b)"
module invrBasicBitwiseIncr(inout a(4), inout b(4))
for $i = #a to 0 do
++= b.$i;
--= a.$i
rof

module main(inout a(4), inout b(4))
// An index-out-of-range error would be reported here due to the value range of the ForStatement of the uncalled module
// being inverted with the loop variable $i being initialized with #a instead of 0 in the inverted ForStatement thus the assignments
// ++= b.$i and --= a.$i would both result in an index-out-of-range error.
uncall basicBitwiseIncr(a, b)
```
Comment on lines +280 to +307
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this really true? This seems like more of a bug to me.
shouldn't the reversed loop be from #a-1 to -1?
If the regular loop contains only valid indexing operations, then the inverse of that loop should as well.


````

### IfStatement

- The components of an IfStatement will be referred to as _if <GUARD_CONDITION> then <TRUE_BRANCH> else <FALSE_BRANCH> fi <CLOSING_GUARD_CONDITION_. To be able to identify the matching guard condition for a closing guard condition, the expressions used to define both of these components must consist of the same characters (with an expression evaluating to the same value while consisting of different or additional characters not being considered equal). An example of an IfStatement violating this rule is the following:
Expand Down
Loading