aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Hinder <ian.hinder@aei.mpg.de>2012-03-21 20:02:44 +0100
committerIan Hinder <ian.hinder@aei.mpg.de>2012-03-21 20:10:48 +0100
commit0d86bb482c7e9b2dd519ba469ff6e7bf61d81f30 (patch)
tree5bc3c276f83ce52844e08c90a1e9daaaf5ad4108
parent016b5dc793e0f1855ccd532e258bf74f8a09d47b (diff)
Thorn.m: Improve new Conditional
-rw-r--r--Tools/CodeGen/Thorn.m36
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];