diff --git a/CompilerGeneration.jrag b/CompilerGeneration.jrag index 73cd76c148cc21d6ac31dca84d8af7676a53edb7..d007355fb82d4b4e2ab0652dda50213725e988a2 100644 --- a/CompilerGeneration.jrag +++ b/CompilerGeneration.jrag @@ -512,16 +512,18 @@ aspect GenPrettyPrinter { } public void XsAttribute.genPrettyPrinter(PrintStream pStream) { - String name = fixName(name()); - pStream.println(" public void "+name+".prettyPrint(String indent, PrintStream pStream) {"); +// String name = fixName(name()); + String name = name(); + pStream.println(" public void "+fixName(name)+".prettyPrint(String indent, PrintStream pStream) {"); pStream.println(" pStream.print(\" "+name()+"=\");"); pStream.println(" getAttrValue().prettyPrint(indent,pStream);"); pStream.println(" }\n"); } public void XsElement.genPrettyPrinter(PrintStream pStream) { - String name = fixName(name()); - pStream.println(" public void "+name+".prettyPrint(String ind, PrintStream pStream) {"); +// String name = fixName(name()); + String name = name(); + pStream.println(" public void "+fixName(name)+".prettyPrint(String ind, PrintStream pStream) {"); pStream.println(" pStream.print(ind+\"<"+name+" \");"); pStream.println(" for (int i=0; i<getNumAttribute(); i++) {"); pStream.println(" getAttribute(i).prettyPrint(ind,pStream);"); diff --git a/examples/actors/sdftest.xdf b/examples/actors/sdftest.xdf index f24f6214a5612d8c97826217fa63cc8a7c0ffdd2..84f44a09e79247e2bcd547f918092af8a3cb217c 100644 --- a/examples/actors/sdftest.xdf +++ b/examples/actors/sdftest.xdf @@ -122,7 +122,19 @@ <Port kind="Output" name="Out"> <Type name="int"/> </Port> - <Action text-begin-col="7" text-begin-line="3" text-end-col="28" text-end-line="3"> + <Decl assignable="Yes" kind="Variable" name="tmp" text-begin-col="" + text-begin-line="" + text-end-col="15" + text-end-line="2"> + <Type name="int"/> + <Expr kind="Let"> + <Expr kind="Literal" literal-kind="Integer" text-begin-col="15" text-begin-line="2" + text-end-col="15" + text-end-line="2" + value="0"/> + </Expr> + </Decl> + <Action text-begin-col="7" text-begin-line="3" text-end-col="4" text-end-line="6"> <Input kind="Elements" port="In" text-begin-col="14" text-begin-line="3" text-end-col="16" text-end-line="3"> @@ -130,7 +142,7 @@ <Type name="int"/> </Decl> </Input> - <Output port="Out" text-begin-col="22" text-begin-line="3" text-end-col="26" + <Output port="Out" text-begin-col="22" text-begin-line="3" text-end-col="28" text-end-line="3"> <Expr kind="Let"> <Expr kind="BinOpSeq" text-begin-col="23" text-begin-line="3" text-end-col="25" @@ -139,13 +151,26 @@ text-end-col="23" text-end-line="3"/> <Op name="+"/> - <Expr kind="Literal" literal-kind="Integer" text-begin-col="25" text-begin-line="3" - text-end-col="25" - text-end-line="3" - value="1"/> + <Expr kind="Var" name="tmp" text-begin-col="25" text-begin-line="3" text-end-col="25" + text-end-line="3"/> </Expr> </Expr> </Output> + <Stmt kind="Assign" name="tmp" text-begin-col="3" text-begin-line="5" + text-end-col="17" + text-end-line="5"> + <Expr kind="Let"> + <Expr kind="BinOpSeq" text-begin-col="10" text-begin-line="5" text-end-col="16" + text-end-line="5"> + <Expr kind="Var" name="tmp" text-begin-col="10" text-begin-line="5" text-end-col="10" + text-end-line="5"/> + <Op name="+"/> + <Expr kind="Var" name="$local$x" text-begin-col="16" text-begin-line="5" + text-end-col="16" + text-end-line="5"/> + </Expr> + </Expr> + </Stmt> </Action> <Note kind="filepath" value="/work/csandersn/actors/example//AddOne.cal"/> </Actor> @@ -198,139 +223,6 @@ </Attribute> </Instance> <Instance id="$id_n$3"> - <Note kind="UID" value="SubOne_0"/> - <Note kind="instanceHierarchy"/> - <Class name="SubOne"/> - <Note kind="sourceLoaded" value="true"/> - <Note kind="className" value="SubOne"/> - <Actor name="SubOne"> - <Port kind="Input" name="In"> - <Type name="int"/> - </Port> - <Port kind="Output" name="Out"> - <Type name="int"/> - </Port> - <Action text-begin-col="7" text-begin-line="3" text-end-col="28" text-end-line="3"> - <Input kind="Elements" port="In" text-begin-col="14" text-begin-line="3" - text-end-col="16" - text-end-line="3"> - <Decl kind="Input" name="$local$x"> - <Type name="int"/> - </Decl> - </Input> - <Output port="Out" text-begin-col="22" text-begin-line="3" text-end-col="26" - text-end-line="3"> - <Expr kind="Let"> - <Expr kind="BinOpSeq" text-begin-col="23" text-begin-line="3" text-end-col="25" - text-end-line="3"> - <Expr kind="Var" name="$local$x" text-begin-col="23" text-begin-line="3" - text-end-col="23" - text-end-line="3"/> - <Op name="-"/> - <Expr kind="Literal" literal-kind="Integer" text-begin-col="25" text-begin-line="3" - text-end-col="25" - text-end-line="3" - value="1"/> - </Expr> - </Expr> - </Output> - </Action> - <Note kind="filepath" value="/work/csandersn/actors/example//SubOne.cal"/> - </Actor> - <Attribute kind="Value" name="clockDomain"> - <Expr kind="Literal" literal-kind="String" value="CLK"/> - </Attribute> - </Instance> - <Instance id="$id_n$4"> - <Note kind="UID" value="AddFiveOnce_0"/> - <Note kind="instanceHierarchy"/> - <Class name="AddFiveOnce"/> - <Note kind="sourceLoaded" value="true"/> - <Note kind="className" value="AddFiveOnce"/> - <Actor name="AddFiveOnce"> - <Port kind="Input" name="In"> - <Type name="int"/> - </Port> - <Port kind="Output" name="Out"> - <Type name="int"/> - </Port> - <Action text-begin-col="9" text-begin-line="3" text-end-col="30" text-end-line="3"> - <QID name="init"> - <ID name="init"/> - </QID> - <Input kind="Elements" port="In" text-begin-col="16" text-begin-line="3" - text-end-col="18" - text-end-line="3"> - <Decl kind="Input" name="$local$x"> - <Type name="int"/> - </Decl> - </Input> - <Output port="Out" text-begin-col="24" text-begin-line="3" text-end-col="28" - text-end-line="3"> - <Expr kind="Let"> - <Expr kind="BinOpSeq" text-begin-col="25" text-begin-line="3" text-end-col="27" - text-end-line="3"> - <Expr kind="Var" name="$local$x" text-begin-col="25" text-begin-line="3" - text-end-col="25" - text-end-line="3"/> - <Op name="+"/> - <Expr kind="Literal" literal-kind="Integer" text-begin-col="27" text-begin-line="3" - text-end-col="27" - text-end-line="3" - value="5"/> - </Expr> - </Expr> - </Output> - </Action> - <Action text-begin-col="8" text-begin-line="5" text-end-col="27" text-end-line="5"> - <QID name="run"> - <ID name="run"/> - </QID> - <Input kind="Elements" port="In" text-begin-col="15" text-begin-line="5" - text-end-col="17" - text-end-line="5"> - <Decl kind="Input" name="$local$x"> - <Type name="int"/> - </Decl> - </Input> - <Output port="Out" text-begin-col="23" text-begin-line="5" text-end-col="25" - text-end-line="5"> - <Expr kind="Let"> - <Expr kind="Var" name="$local$x" text-begin-col="24" text-begin-line="5" - text-end-col="24" - text-end-line="5"/> - </Expr> - </Output> - </Action> - <Note kind="filepath" value="/work/csandersn/actors/example//AddFiveOnce.cal"/> - <Schedule initial-state="init" kind="fsm" text-begin-col="3" text-begin-line="7" - text-end-col="3" - text-end-line="10"> - <Transition from="init" text-begin-col="4" text-begin-line="8" text-end-col="23" - text-end-line="8" - to="run"> - <ActionTags text-begin-col="" text-begin-line="" text-end-col="" text-end-line=""> - <QID name="init"> - <ID name="init"/> - </QID> - </ActionTags> - </Transition> - <Transition from="run" text-begin-col="2" text-begin-line="9" text-end-col="19" - text-end-line="9" - to="run"> - <ActionTags text-begin-col="" text-begin-line="" text-end-col="" text-end-line=""> - <QID name="run"> - <ID name="run"/> - </QID> - </ActionTags> - </Transition> - </Schedule> - </Actor> - <Attribute kind="Value" name="clockDomain"> - <Expr kind="Literal" literal-kind="String" value="CLK"/> - </Attribute> - </Instance> - <Instance id="$id_n$5"> <Note kind="UID" value="art_Sink_txt_0"/> <Note kind="instanceHierarchy"/> <Class name="art_Sink_txt"/> @@ -410,8 +302,6 @@ <Connection dst="$id_n$1" dst-port="In" src="$id_n$0" src-port="Out"/> <Connection dst="$id_n$2" dst-port="In" src="$id_n$1" src-port="Out"/> <Connection dst="$id_n$3" dst-port="In" src="$id_n$2" src-port="Out"/> - <Connection dst="$id_n$4" dst-port="In" src="$id_n$3" src-port="Out"/> - <Connection dst="$id_n$5" dst-port="In" src="$id_n$4" src-port="Out"/> <Note kind="Directive" name="default-type-name"> <Expr kind="Literal" literal-kind="String" value="int"/> </Note> diff --git a/examples/actors/xdf/MergeActors.jrag b/examples/actors/xdf/MergeActors.jrag index 4763296c34e933a3808a8c2760d523de441c7f37..88be4dac9b5b71f5674bd5c19b29b4323310502f 100644 --- a/examples/actors/xdf/MergeActors.jrag +++ b/examples/actors/xdf/MergeActors.jrag @@ -27,6 +27,7 @@ aspect MergeActors { for (Instance i : schedule) { while (i.next != null) { System.out.println("Searching connections for: "+i.name()+" "+i.next.name()); + String srcPort="",dstPort=""; for (Connection c : cons) { System.out.println(" "+c.getSource().name()+" "+c.getDest().name()); if (c.getSource() == i && c.getDest() == i.next) { @@ -35,6 +36,8 @@ aspect MergeActors { // merge. Then set remove_me flag so that this // connection will be removed from the actor // network. + srcPort = c.srcPort(); + dstPort = c.dstPort(); c.remove_me = true; c.is$Final(false); } else if (c.getSource() == i.next) { @@ -43,7 +46,7 @@ aspect MergeActors { } System.out.println("Merging "+i.name()+":"+i.next.name()); i.isMerged(true); - i.merge(i.next); + i.merge(i.next,srcPort,dstPort); i.setName(i.name()+"_"+i.next.name()); i.next.disabled = true; i.next = i.next.next; @@ -56,9 +59,9 @@ aspect MergeActors { } } - void Instance.merge(Instance inst) { + void Instance.merge(Instance inst,String srcPort, String dstPort) { if (isMerged()) { - xlimInstance().merge(inst.xlimInstance()); + xlimInstance().merge(inst.xlimInstance(),srcPort,dstPort); } } @@ -116,6 +119,7 @@ aspect Misc { inst.add(this); return inst; } + } aspect Rewrites { diff --git a/examples/actors/xdf/SSR.jrag b/examples/actors/xdf/SSR.jrag index 3407e2671db98d65a89134c896c9213c89d36979..72d30b76922a90e68d902e7cd2785ac63c9416a0 100644 --- a/examples/actors/xdf/SSR.jrag +++ b/examples/actors/xdf/SSR.jrag @@ -112,6 +112,23 @@ aspect ActorLookup { } return ""; } + + String Connection.dstPort() { + for (Attribute a : getAttributes()) { + if (a instanceof dst_port) { + return fix(a.getAttrValue().getLITERAL()); + } + } + return ""; + } + String Connection.srcPort() { + for (Attribute a : getAttributes()) { + if (a instanceof src_port) { + return fix(a.getAttrValue().getLITERAL()); + } + } + return ""; + } } aspect misc { diff --git a/examples/actors/xlim/GeneratedAspects.jrag b/examples/actors/xlim/GeneratedAspects.jrag index 3a65692990a353ff8c32c809b2e89e5d3f680508..3091ec7d8e5a91be1a6fed51ce84f937415da02c 100644 --- a/examples/actors/xlim/GeneratedAspects.jrag +++ b/examples/actors/xlim/GeneratedAspects.jrag @@ -232,7 +232,7 @@ aspect PrettyPrinter { } public void actor_port.prettyPrint(String ind, PrintStream pStream) { - pStream.print(ind+"<actor_port "); + pStream.print(ind+"<actor-port "); for (int i=0; i<getNumAttribute(); i++) { getAttribute(i).prettyPrint(ind,pStream); } @@ -244,7 +244,7 @@ aspect PrettyPrinter { for (int i=0; i<getNumElement(); i++) { getElement(i).prettyPrint(newInd,pStream); } - pStream.println(ind+"</actor_port> "); + pStream.println(ind+"</actor-port> "); } } diff --git a/examples/actors/xlim/Merge.jrag b/examples/actors/xlim/Merge.jrag index 87f11218c6d9d54df1a70fc223e5ed80ea606228..096b859de8237d8de38ace9533e6276a18b0556d 100644 --- a/examples/actors/xlim/Merge.jrag +++ b/examples/actors/xlim/Merge.jrag @@ -9,17 +9,28 @@ import java.util.HashSet; aspect Merge { - public void Start.merge(Start dest) { - getSpecification().getDesign().merge(dest.getSpecification().getDesign()); + public void Start.merge(Start dest, String srcPort, String dstPort) { + getSpecification().getDesign().merge(dest.getSpecification().getDesign(),srcPort,dstPort); } - public void EmptyStart.merge(Start dest) {} + public void EmptyStart.merge(Start dest, String srcPort, String dstPort) {} - public void design.merge(design dest) { + public void design.merge(design dest, String srcPort, String dstPort) { HashSet<module> ops = dest.getActions(new HashSet<module>()); System.out.println("Adding actions from: "+dest.name()+" to: "+name()); + String varName = "\""+name()+"_out\""; setName(name()+"_"+dest.name()); List<Element> eList = getElements(); + stateVar var = new stateVar(); + initValue init = new initValue(); + var.setAttributeList(new List().add(new name(new AttrValue(varName))). + add(new sourceName(new AttrValue(varName)))); + eList.insertChild(var,0); + // Re-set pinWrite with shared variable + for (module m : getActions(new HashSet<module>())) { + m.setOutVar(varName,srcPort); + } for (module o : ops) { + o.setInVar(varName,dstPort); o.setName(dest.name()+"_"+o.name()); System.out.println(" Adding "+o.name()); eList.insertChild(o,eList.getNumChild()-2); @@ -51,6 +62,37 @@ aspect Actions { } return ops; } + + void module.setOutVar(String varName,String srcPort) { + for (Element e : getElements()) { + e.setOutVar(varName, srcPort); + } + } + void Element.setOutVar(String varName, String srcPort){} + void operation.setOutVar(String varName, String srcPort) { + if (kind().equals("pinWrite")) { + setAttributeList(new List().add(new kind(new AttrValue("\"assign\""))). + add(new target(new AttrValue(varName)))); + } + } + + void module.setInVar(String varName,String srcPort) { + for (Element e : getElements()) { + e.setInVar(varName, srcPort); + } + } + void Element.setInVar(String varName, String srcPort){} + void operation.setInVar(String varName, String srcPort) { + if (kind().equals("pinRead")) { + String src = getElement(0).source(); + setAttributeList(new List().add(new kind(new AttrValue("\"assign\""))). + add(new target(new AttrValue(unfix(src))))); + port newPort = new port(); + newPort.setAttributeList(new List().add(new dir(new AttrValue("\"in\""))). + add(new source(new AttrValue(varName)))); + setElementList(new List().add(newPort)); + } + } } aspect ActionScheduler { @@ -74,7 +116,32 @@ aspect ActionScheduler { return kind().equals("action-scheduler"); } + void Element.addTaskCall(module m) {} void module.addTaskCall(module m) { + System.out.println("Looking in: "+kind()); + if (hasTaskCall()) { + operation o = new operation(); + o.setAttributeList(new List().add(new kind(new AttrValue("\"taskCall\""))). + add(new target(new AttrValue(unfix(m.name()))))); + addElement(o); + } else { + for (Element e : getElements()) { + e.addTaskCall(m); + } + } + } + syn boolean Element.hasTaskCall() = false; + eq module.hasTaskCall() { + for (Element e : getElements()) { + if (e instanceof operation) { + System.out.println(" "+e.kind()); + } + if (e instanceof operation && e.kind().equals("taskCall")) { + return true; + } + } + return false; } -} \ No newline at end of file +} + diff --git a/examples/actors/xlim/SDF.jrag b/examples/actors/xlim/SDF.jrag index 5b3164b6fd5eeab1f0b547a69117e39240f49d18..353d64d156acb18811e84d47bf1b06608e1dde4c 100644 --- a/examples/actors/xlim/SDF.jrag +++ b/examples/actors/xlim/SDF.jrag @@ -64,7 +64,7 @@ aspect Misc { } void Attribute.setName(String name) {} void name.setName(String name) { - getAttrValue().setLITERAL(fix(name)); + getAttrValue().setLITERAL(unfix(name)); } @@ -75,6 +75,13 @@ aspect Misc { return s; } + static String ASTNode.unfix(String s) { + if (s.indexOf('"') != 0) { + return "\""+s+"\""; + } + return s; + } + syn design Specification.getDesign() { for (Element e : getElements()) { if (e instanceof design) { @@ -83,6 +90,29 @@ aspect Misc { } return null; } + + syn String Element.kind() = ""; + eq ComplexElement.kind() { + for (Attribute a : getAttributes()) { + if (a.isKind()) { + return fix(a.getAttrValue().getLITERAL()); + } + } + return ""; + } + + syn boolean Attribute.isKind() = false; + eq kind.isKind() = true; + + syn String Element.source() = ""; + eq ComplexElement.source() { + for (Attribute a : getAttributes()) { + if (a instanceof source) { + return fix(a.getAttrValue().getLITERAL()); + } + } + return ""; + } } aspect Fixes { diff --git a/examples/actors/xlim/xlim.ast b/examples/actors/xlim/xlim.ast index 56c680e89cae77df1806592a3f7833758111b251..1130b4dfdae9e2965e56059b4d763d99aa126760 100644 --- a/examples/actors/xlim/xlim.ast +++ b/examples/actors/xlim/xlim.ast @@ -10,11 +10,13 @@ abstract Thing : ComplexElement ::=; abstract Element; ComplexElement : Element ::= Attribute* Element*; ValueElement : ComplexElement; +__DefaultElement__ : ComplexElement ::= <TAG>; abstract SimpleElement : Element; StringElement : SimpleElement ::= <LITERAL>; IntElement : SimpleElement ::= <LITERAL>; FloatElement : SimpleElement ::= <LITERAL>; Attribute ::= AttrValue; +__DefaultAttribute__ : Attribute ::= <NAME>; AttrValue ::= <LITERAL>; Encoding : Attribute ::=; Version : Attribute ::=; diff --git a/examples/actors/xlim/xlim.jjt b/examples/actors/xlim/xlim.jjt index e4db8493c9b0e868558cac5a778dd451f554f0a4..bec468a1df45e895abffecaf73c1b32567a10bc0 100644 --- a/examples/actors/xlim/xlim.jjt +++ b/examples/actors/xlim/xlim.jjt @@ -246,7 +246,7 @@ void ElementList() #List : {} void AttributeList() #List : {} { - (Attribute())* + (LOOKAHEAD(2) Attribute())* } void AttrValue() #AttrValue : { Token t; } @@ -287,6 +287,7 @@ void Element() : {} | stateVar() | note() | initValue() + | __DefaultElement__() )) | SimpleElement() } @@ -321,6 +322,18 @@ void StringElement() #StringElement : { Token t;String s; } } {jjtThis.setLITERAL(s);} } +void __DefaultElement__() #__DefaultElement__ : { Token t;String s; } +{ + t = <IDENTIFIER> AttributeList() + (">" ElementList() "</" <IDENTIFIER> ">" | ElementList() "/>") + { + s = t.image; + if (getToken(1).kind != GT ) { + s += getData(); + } + } + {jjtThis.setTAG(s);} +} void Attribute() : {} { Encoding() @@ -342,9 +355,15 @@ void Attribute() : {} | value() | autostart() | size() + | __DefaultAttribute__() } +void __DefaultAttribute__() # __DefaultAttribute__ : {Token t;} +{ + t=<IDENTIFIER> "=" AttrValue() + {jjtThis.setNAME(t.image);} +} void portName() #portName : {} { <portName> "=" AttrValue()