diff options
author | Ian Hinder <ian.hinder@aei.mpg.de> | 2012-03-21 20:02:44 +0100 |
---|---|---|
committer | Ian Hinder <ian.hinder@aei.mpg.de> | 2012-03-21 20:10:48 +0100 |
commit | 0d86bb482c7e9b2dd519ba469ff6e7bf61d81f30 (patch) | |
tree | 5bc3c276f83ce52844e08c90a1e9daaaf5ad4108 | |
parent | 016b5dc793e0f1855ccd532e258bf74f8a09d47b (diff) |
Thorn.m: Improve new Conditional
-rw-r--r-- | Tools/CodeGen/Thorn.m | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/Tools/CodeGen/Thorn.m b/Tools/CodeGen/Thorn.m index 13f7932..efe979f 100644 --- a/Tools/CodeGen/Thorn.m +++ b/Tools/CodeGen/Thorn.m @@ -456,14 +456,34 @@ scheduleFunction[spec_,params_] := y = If[mapContains[spec, NewConditional], cond = lookup[spec, NewConditional]; Module[ - {render}, - render[Equal[a_Symbol,b_String]] := {"CCTK_EQUALS(", render[a], ",", render[b],")"}; - render[Equal[a_Symbol,b_?NumberQ]] := {"(", render[a], " == ", render[b],")"}; - render[a_String] := a; (* Allow literal pass-through *) - render[a_?NumberQ] := ToString[a]; - render[a_ /; MemberQ[params,a]] := ToString[a]; - render[x_] := ThrowError["Unrecognized value in conditional expression:", x, "in", cond]; - ConditionalOnParameterTextual[render[cond], w]], + {render, renderbool, paramPattern}, + + paramPattern = Except[True | False, _Symbol | _Parameter]; + + renderbool[Equal[a:paramPattern,b_String]] := {"CCTK_EQUALS(", rendervalue[a], ",\"", b,"\")"}; + renderbool[Unequal[a:paramPattern,b_String]] := {"!CCTK_EQUALS(", rendervalue[a], ",\"", b,"\")"}; + renderbool[Equal[a:paramPattern,b_?NumberQ]] := {rendervalue[a], " == ", rendervalue[b]}; + renderbool[Unequal[a:paramPattern,b_?NumberQ]] := {rendervalue[a], " != ", rendervalue[b]}; + + renderbool[Or[a_,b_]] := {"(",renderbool[a]," || ", renderbool[b],")"}; + renderbool[And[a_,b_]] := {"(",renderbool[a]," && ", renderbool[b],")"}; + renderbool[Not[a_]] := {"(!", renderbool[a],")"}; + renderbool[a:paramPattern] := ToString[a]; (* Boolean parameter *) + + (* rendervalue[a_String] := a; -- Allow literal pass-through *) + rendervalue[a_?NumberQ] := ToString[a]; + rendervalue[Parameter[a_String]] := a; + rendervalue[a_ /; MemberQ[params,a]] := ToString[a]; + renderbool[x_] := ThrowError["Unexpected value in run-time conditional expression (boolean):", x, "in", cond]; + render[x_] := ThrowError["Unexpected value in run-time conditional expression (value):", x, "in", cond]; + + unparen[s_] := + Module[ + {s2 = FlattenBlock[s],result}, + result = StringReplace[FlattenBlock[s2],StartOfString ~~ "(" ~~ any__ ~~ ")" ~~ EndOfString :> any]; + If[result === s2, result, unparen[result]]]; + + ConditionalOnParameterTextual[unparen@renderbool[cond], w]], w]; y]; |