Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 39 Next »

Version 0.13 RC1

This page is part of the SCCharts Editor 0.13 RC1 documentation. This page is still under construction. We are still in the process of creating the release candidate. Please excuse any missing or incomplete entry. We apologize for any inconvenience.


SCCharts

Each SCChart starts with the keyword scchart followed by an IDA ID can be any alpha-numerical combination, but must start with an alphabetical character or an underscore (a single underscore is prohibited). However, underscores are used to identify auto-generated constructs, so the modeler should not use them as prefix.

Simple States

One of the basic constructs of SCCharts is a simple state. A simple state does not have any inner behavior and can be connected via transitions to other states.

Initial State

To tell the program where to start, a state can be marked as initial. Exactly one state (per concurrent region, see concurrency) must be marked as initial.

Transitions


Transitions connect states. There are different kinds of Transitions, but we will restrict ourselves to the two basic types for now. (See below for more complex transitions.)

They can be guarded by a trigger that determines when this transition is enabled and they can have effects that are executed whenever this transition becomes active.

Experimental Syntax

IMPORTANT: We are testing different syntax variations for transitions in the release candidate. At the moment we prefer the following syntax as default.

[immediate] [if condition] [do effect[; effect]*] (go | abort | join) to targetstate

Please test it. We appreciate it.

However, in the RC1 you can also start with the jump and follow with the if or even use the legacy syntax with the ascii art arrow. Hence, some examples may differ slightly from each other. Feel free to experiment. Please provide us with feedback. We will streamline the syntax before the final release.

Delayed Transitions

A delayed transition cannot trigger in the instance the parent state is entered. If a state is entered, they become active in the next tick. You can see this in the Simple example. Just write go to.

Immediate Transitions

Immediate transitions are checked as soon as their parent state is entered. Hence, the state can be entered and left within the same tick. Use the keyword immediate to create an immediate transition

Implicit Delay Behavior

Final State

A state can also be marked as final. A final state marks the end of a thread. If a final state is reached on root level, the program terminates.

scchart Simple {
	
  initial state A
  go to B 
  
  state B
  go to C 
  
  state C
  go to A immediate
}
scchart Simple {
	
  initial state A
  go to B auto
  
  state B
  go to C delayed
  
  final state C
}




Declarations & Variables

Each scope (for now just the SCChart) can have a list of declarations. The SCChart code on the right gives an example. A declaration starts with the type, followed by a list of variable identifier. Each variables can be initialized with a specific value. 

Types

The following native types are supported: bool, int, double, string, signal (see below)

Additionally, you can mark a declaration as extern and give it a string that will be used in the serialization of the final code, e.g., the name of a host type. You can then add variables as before.

Arrays

If you add brackets to a variable and specify cardinalities, you declare an array.

Constants

Declarations can be marked as constant, meaning that each occurrence is then replaced by the initialization because the variable is not allowed to be changed.

scchart Variables {
  input bool second
  output bool beep
  int i, j, k
  int arr[10]
  bool alarm = false
  const bool ON = 1
  extern "rObj" rail  
  
  initial state A
  go to B
  
  state B
}


Tuples

You can assign a whole tuple at once to an array. 

scchart tuples {
  output int arr[5] = {1, 2, 3, 4, 5}

  initial state init {
    entry do arr = {6, 7, 8, 9, 10}
  }
}

To assign only certain values of an array, you can also use the ignore value placeholder. Consult the expression manual for further information.

scchart tuples {
  const int A = 1
  output int arr[3][2] = {{A,0}, {2,0}, {3,0}}

  initial state init
    --> init do arr = {{arr[0] + 1, _}, _, {arr[2] + 1, _}}
}

This would, for example, result in c code assignments as displayed on the right.

void logic(TickData* d) {
  d->_g0 = d->_GO;
  if (d->_g0) {
    d->arr[0][0] = 1;
    d->arr[0][1] = 0;
    d->arr[1][0] = 2;
    d->arr[1][1] = 0;
    d->arr[2][0] = 3;
    d->arr[2][1] = 0;
  }
  d->_g2 = d->_pg1;
  if (d->_g2) {
    d->arr[0][0] = d->arr[0] + 1;
    d->arr[2][0] = d->arr[2] + 1;
  }
  d->_g1 = d->_g0 || d->_g2;
}




Comments

You can simply use JavaDoc-style comments to comment you SCChart. The comments will appear in the synthesized diagram as comment boxes. You can toggle these boxes in your sidebar. 

Additionally, for documentation reason, you can annotate different elements to give them a user-defined style. E.g. colorize a state or comment box for visual effect. Use html-like color codes for different colors. Please read more on annotations in the section below.

/**
 * Getting there!
 */
scchart Root {
  /** Test */
  input bool second 
  output bool speaker 

  /**
    * Main region!
    */
  region main:

  /**	
    * The initial state
    * This is entered as soon as the program starts.
    */    
  @foreground f0f024
  @background ffffcc
  @backgroundTarget fff9ba
  initial state Superstate {
    initial state R1
  } 
  /** Transition */
  /** Transition 2 */
  join to S

  /**
    * The final state!
    * @foreground f00
    * @background a00
    */
  final state S
}






Hierarchy & Concurrency

Superstates

Superstates model hierarchy. Each nested superstate creates a new scope. The syntax is easy: just start a new scope via curly brackets after your initial state declaration.

A superstate can be exited by any transition preemption type. However, especially the termination (or join) is of interest as it is taken as soon as the superstate finishes (meaning a final state is reached.)

Regions

Regions model concurrency. They follow the initialize-update-read protocol if scheduling between different regions becomes necessary.

A termination transition is taken if all regions of the superstate have reached a final state.


scchart superstates {
  input bool F
	
  initial state init {
    initial state init
    if F go to done 
		
    final state done 	
  }
  join to done
	
  final state done
}
scchart concurrencies {
  input bool E, F 

  initial state EF {
    
    region handleF {
      initial state init
      if F go to done
	
      final state done
    }
		
    region handleE {
      initial state init
      if E go to done
	
      final state done
    }
	
  }
  join to done
	
  final state done
}

For Regions

You can automatically duplicate regions and access a region counter variable.

scchart IIIRO {
  input int I
  input bool R
  output bool O

  initial state IIO {
    entry do O = false

    initial state II {
      region main for i : 1 .. 3 {
        initial state IWait
        go to IDone if I == i
	
        final state IDone
      }
    }
    join to Done do O = true
		
    state Done
  }
  go to IIO if R
}

This is also possible for a complete array.

scchart IIIRO {
  input int I
  input bool R
  output bool O
  input bool ACTIVE[10]

  initial state IIO {
    entry do O = false

    initial state II {
      region for i : ACTIVE {
        initial state IWait
        go to IDone if ACTIVE[i]
	
        final state IDone
      }
    }
    join to Done do O = true
	
    state Done
  }
  go to IIO if R
}


Complex Final States

Complex Final states are final states that comprise inner behavior. Besides being a superstate, also actions and outgoing transitions count. Basically, any not simple final state without outgoing transitions is a complex final state.


Actions

Entry Action

During Action

Exit Action


Complex Transitions

Count Delay

Shallow History

Deep History

Deferred

Signals


References

We will use the beep.sctx as example for referenced SCCharts.

scchart Beep {
	input bool second
	output bool beep = false
	
	initial state A
	if second do beep = true go to B 
	
	state B
	if second do beep = false go to A 
}

If you want to use another SCChart inside your model, you must first include it with an import pragma. For example, if you want to include beep into the comment example "root" from above, you can add #import "beep" and include a state that references beep. We will learn more about pragmas later on.

#import "beep"

/**
 * Getting there!
 */
scchart Root {
	/** Test */
	input bool second 
	output bool speaker 
	
	/**
 	 * Main region!
     */
	region main:
	
	/**	
	 * The initial state
	 * This is entered as soon as the program starts.
	 * @foreground f0f024
	 * @background ffffcc
     * @backgroundTarget fff9ba
	 */    
	initial state R is Beep(second to second, speaker to beep) 
	/** Transition */
	/** Transition 2 */
	join to S
	
	/**
	 * The final state!
	 * @foreground f0f0240
     * @background ffc
     */
	final state S
}

The keyword is indicates that R is a reference. When you are referencing, you have to bind the interface of the referenced SCChart model to variables of the actual on. You must do this in the parentheses after the referenced state. In the example second is bound to second, and the local speaker boolean is bound to the beep from beep's interface. You can read more about variable bindings in the next paragraph. Also, the content assist will help you with your bindings and inform you about missing bindings.

Details about Bindings

There are three different kinds of bindings: explicit bindings, order bindings, and implicit bindings. In the example we used explicit bindings, which are the safest way of bindings.

initial state R is Beep(second to second, speaker to beep) 

They state explicitly which local variable gets bound to which remote. The content assist will help you with errors.

If you now the order of the variables (and/or listen to the content assist), you can also use order bindings and simply state the list of local variables.

initial state R is Beep(second, speaker) 

They will be bound to the interface in the order of declaration in the remote SCChart. However, be aware of the fact that the bindings will change, when the declarations of the referenced SCChart change.

In the example, the names of the local and referenced second variables are identical. Hence, you can also omit the binding completely.

initial state R is Beep(speaker to beep) 

SCCharts will then bind the variable implicitly. However, we also consider this kind of binding unsafe and the editor will warn you about any implicit bindings. They can be handy though when dealing with large interfaces.

Continuation

As any state, referenced states are allowed to own transitions. However, if you are using terminations, you must make sure that the referenced SCChart terminates. Otherwise, the transition will never trigger. The content assist will help you with this issue.

Legacy

You do not need to activate the Xtext nature as in previous versions of SCCharts. In fact, we recommend to deactivate the Xtext nature for SCCharts projects.



Example warnings from the content assist:


Dataflow

You can convert a region into a dataflow region by replacing the region keyword with the keyword dataflow. Within a dataflow scope, you can simply write down your equations.

On the right you see several examples and their synthesized diagrams.

Equations (df#0007)

You can use all expressions in the kexpressions language. This includes standard operations such as arithmetics and binary/logical logic. A full set of operations can be found at the end of this page (in the future).

References (df#0461)

Just as before, you can declare references to other SCCharts. As before, use the ref keyword in your declaration section. Each variable represents an instance. Inputs and outputs are separated by a dot (.). Same wires are merged automatically in the diagram.

Input/Output Loops (df#0521)

Of course you can model loops in your wiring. However, depending on the consecutive compilation/scheduling the program may or may not be executable/schedulable.

Tuples (df#0603)

You can use the aforementioned tuple syntax to assign all/some inputs at once. Hence, it is possible to construct complex models with only a few lines of code.

Skins (df#1000, df#1100)

You can use customized skins instead of the standard referenced SCCharts actor diagram. Since we are using Klighd, you have to specify your actor in Klighd's Graph Syntax (.kgt). Once you have created a custom .kgt, you can add it to an SCChart with the @figure annotation. The annotation combined with a skinpath relative to the calling model points to the target .kgt.

For example: Imaging df#0007 is annotated with @figure "and2AN.kgt". Now df#1000 can set a skinpath pragma. Together they point to the .kgt that should be used as actor diagram. In this case, we get an and with a negated input.

Even if df#0007 was not annotated, you can archive the same result if you annotate the ref declaration in df#1000.:

  @figure "and2AN.kgt" 
  ref df#0008 A, A2
scchart df#0007 {
  input bool in1, in2
  output bool out
	
  dataflow:
  out = in1 + in2
}
#import "DF-0002"

scchart df#0461 {
  output int O, O2, O3, O4
  ref df#0002 A, A2, A3, A4

  dataflow:
  O = A.O || A2.O || A3.O 
  O2 = A.O || A2.O || A3.O 
  O3 = A.O || A2.O || A3.O 
  O4 = A.O || A2.O || A3.O 
}
#import "DF-0000"

scchart df#0521 {
  input bool I
  output int O
  ref df#0000 A

  dataflow:
  A.I = I + A.O
  O = A.O
}
#import "DF-0006"

scchart df#0603 {
  input int I, I2
  output int O
  ref df#0006 A, A2

  dataflow:
  A = {0, 1, _, I}
  A2 = {0, A.O, I + 1, I - 1}
  A.I3 = 100
  O = A2.O
}
#import "DF-0007"
#skinpath "skin"

scchart df#1000 {
  input int I, I2
  output int O
  ref df#0007 A, A2

  dataflow:
  A = {true, false}
  A2 = {true, A.out}
  O = A2.out
}

Hostcode

There are several ways to add hostcode to your models.

External References

You can declare a new object as external reference like before with (internal) references. Use the keyword extern to mark it as extern.

Function Calls

Legacy Hostcode

scchart hostcode#10 {
  output float r
  extern @C "rand", 
         @Java "Math.random" 	rand
	
    entry do call rand(0)
		
    initial state init 
    do r = rand() go to init
}


Annotations

Pragmas

Expressions


Overview

Here you can see an SCCharts graphical notation overview.



  • No labels