package jazz.circuit.esterel;
//////////////////////////////////////////////////////////////////////////////
//
// Pretty-printing of Pure Esterel programs
//
//////////////////////////////////////////////////////////////////////////////
import jazz.util.List;
// Indentation
class I {
static dynamic newline: String = "\n";
static indent(): String;
}
I.indent() = format("%s ", newline);
// Module
toString@Module() = format("module %s:%s%s%s %a%s.", name, I.newline,
i, o, s, I.newline)
{
dynamic (List.lparen = "") {
dynamic (List.rparen = "") {
dynamic (List.separator = ", ") {
i = inputs.length() == 0 ? "" : format(" input %a;\n", inputs);
o = outputs.length() == 0 ? "" : format(" output %a;\n", outputs);
}
}
}
dynamic (I.newline = I.indent()) {
s = stmt.toString();
}
}
// Statement
toString@NothingStmt() = "nothing";
toString@HaltStmt() = "halt";
toString@EmitStmt() = format("emit %s", sig);
toString@SequenceStmt() = format("%a;%s%a", stmt1, I.newline, stmt2);
toString@LoopStmt() = format("loop%s %s%send", I.newline, s, I.newline)
{
dynamic (I.newline = I.indent()) {
s = stmt.toString();
}
}
toString@PresentStmt() = format("present %s then%s %a%selse%s %a%send",
sig, I.newline, s1, I.newline,
I.newline, s2, I.newline)
{
dynamic (I.newline = I.indent()) {
s1 = stmt1.toString();
s2 = stmt2.toString();
}
}
toString@WatchStmt() = format("do%s %a%swatching %s",
I.newline, s, I.newline, sig)
{
dynamic (I.newline = I.indent()) {
s = stmt.toString();
}
}
toString@ParallelStmt() = format("[%s %a%s||%s %a%s]",
I.newline, s1, I.newline,
I.newline, s2, I.newline)
{
dynamic (I.newline = I.indent()) {
s1 = stmt1.toString();
s2 = stmt2.toString();
}
}
toString@TrapStmt() = format("trap %s in%s %a%send", sig,
I.newline, s, I.newline)
{
dynamic (I.newline = I.indent()) {
s = stmt.toString();
}
}
toString@ExitStmt() = format("exit %s", sig);
toString@SignalStmt() = format("signal %s in%s %a%send", sig,
I.newline, s, I.newline)
{
dynamic (I.newline = I.indent()) {
s = stmt.toString();
}
}