Skip to content
Snippets Groups Projects
Commit c40678aa authored by Jan Gruteser's avatar Jan Gruteser
Browse files

simplify ModuleOverrider

parent ec566a5f
No related branches found
No related tags found
No related merge requests found
Pipeline #148473 passed
...@@ -5,18 +5,20 @@ import tlc2.tool.BuiltInOPs; ...@@ -5,18 +5,20 @@ import tlc2.tool.BuiltInOPs;
import java.util.Map; import java.util.Map;
public class ModuleOverrider extends BuiltInOPs implements ASTConstants { /**
* Apply overrides specified in the configuration file.
*/
public class ModuleOverrider extends BuiltInOPs {
private final ModuleNode moduleNode; private final ModuleNode moduleNode;
private final Map<OpDeclNode, OpDefNode> constantOverrideTable; private final ConfigfileEvaluator conEval;
private final Map<OpDefNode, OpDefNode> operatorOverrideTable;
private final Map<OpDefNode, TLCValueNode> operatorAssignments;
private ModuleOverrider(ModuleNode moduleNode, ConfigfileEvaluator conEval) { private ModuleOverrider(ModuleNode moduleNode, ConfigfileEvaluator conEval) {
this.moduleNode = moduleNode; this.moduleNode = moduleNode;
this.constantOverrideTable = conEval.getConstantOverrides(); if (conEval == null) {
this.operatorOverrideTable = conEval.getOperatorOverrides(); throw new IllegalArgumentException("ConfigfileEvaluator cannot be null");
this.operatorAssignments = conEval.getOperatorAssignments(); }
this.conEval = conEval;
} }
public static void run(ModuleNode moduleNode, ConfigfileEvaluator conEval) { public static void run(ModuleNode moduleNode, ConfigfileEvaluator conEval) {
...@@ -24,17 +26,16 @@ public class ModuleOverrider extends BuiltInOPs implements ASTConstants { ...@@ -24,17 +26,16 @@ public class ModuleOverrider extends BuiltInOPs implements ASTConstants {
} }
private void start() { private void start() {
OpDefNode[] defs = moduleNode.getOpDefs(); Map<OpDefNode, TLCValueNode> operatorAssignments = conEval.getOperatorAssignments();
for (OpDefNode def : defs) { for (OpDefNode def : moduleNode.getOpDefs()) {
if (operatorAssignments.containsKey(def)) { if (operatorAssignments.containsKey(def)) {
def.setBody(operatorAssignments.get(def)); def.setBody(operatorAssignments.get(def));
} else if (operatorAssignments.containsKey(def.getSource())) { } else if (operatorAssignments.containsKey(def.getSource())) {
def.setBody(operatorAssignments.get(def.getSource())); def.setBody(operatorAssignments.get(def.getSource()));
} }
} }
for (OpDefNode def : defs) { for (OpDefNode def : moduleNode.getOpDefs()) {
OpApplNode res = visitExprNode(def.getBody()); OpApplNode res = visitExprNode(def.getBody());
if (res != null) { if (res != null) {
def.setBody(res); def.setBody(res);
...@@ -43,43 +44,34 @@ public class ModuleOverrider extends BuiltInOPs implements ASTConstants { ...@@ -43,43 +44,34 @@ public class ModuleOverrider extends BuiltInOPs implements ASTConstants {
AssumeNode[] assumes = moduleNode.getAssumptions(); AssumeNode[] assumes = moduleNode.getAssumptions();
for (int i = 0; i < assumes.length; i++) { for (int i = 0; i < assumes.length; i++) {
AssumeNode assume = assumes[i]; OpApplNode res = visitExprNode(assumes[i].getAssume());
OpApplNode res = visitExprNode(assume.getAssume());
if (res != null) { if (res != null) {
assumes[i] = new AssumeNode(assumes[i].stn, res, null, null);
AssumeNode newAssume = new AssumeNode(assume.stn, res, null,
null);
assumes[i] = newAssume;
} }
} }
} }
private OpApplNode visitExprOrOpArgNode(ExprOrOpArgNode n) { private OpApplNode visitExprOrOpArgNode(ExprOrOpArgNode n) {
if (n instanceof ExprNode) { if (n instanceof ExprNode) {
return visitExprNode((ExprNode) n); return visitExprNode((ExprNode) n);
} else { } else {
throw new RuntimeException("OpArgNode not implemented jet"); throw new RuntimeException("OpArgNode not implemented yet");
} }
} }
private OpApplNode visitExprNode(ExprNode n) { private OpApplNode visitExprNode(ExprNode n) {
switch (n.getKind()) { switch (n.getKind()) {
case OpApplKind: case OpApplKind:
return visitOpApplNode((OpApplNode) n); return visitOpApplNode((OpApplNode) n);
case StringKind: case StringKind:
case AtNodeKind: // @ case AtNodeKind: // @
case NumeralKind: case NumeralKind:
case DecimalKind: { case DecimalKind:
return null; return null;
}
case LetInKind: { case LetInKind: {
LetInNode l = (LetInNode) n; LetInNode l = (LetInNode) n;
for (int i = 0; i < l.getLets().length; i++) { for (OpDefNode let : l.getLets()) {
visitExprNode(l.getLets()[i].getBody()); visitExprOrOpArgNode(let.getBody());
} }
OpApplNode res = visitExprNode(l.getBody()); OpApplNode res = visitExprNode(l.getBody());
...@@ -96,98 +88,68 @@ public class ModuleOverrider extends BuiltInOPs implements ASTConstants { ...@@ -96,98 +88,68 @@ public class ModuleOverrider extends BuiltInOPs implements ASTConstants {
SymbolNode s = n.getOperator(); SymbolNode s = n.getOperator();
switch (s.getKind()) { switch (s.getKind()) {
case ConstantDeclKind: { case ConstantDeclKind: {
if (constantOverrideTable.containsKey(s) && s.getArity() > 0) { if (conEval.getConstantOverrides().containsKey((OpDeclNode) s) && s.getArity() > 0) {
SymbolNode newOperator = constantOverrideTable.get(s); SymbolNode newOperator = conEval.getConstantOverrides().get((OpDeclNode) s);
OpApplNode newNode; OpApplNode newNode;
try { try {
newNode = new OpApplNode(newOperator, n.getArgs(), newNode = new OpApplNode(newOperator, n.getArgs(), n.getTreeNode(), null);
n.getTreeNode(), null);
} catch (AbortException e) { } catch (AbortException e) {
throw new RuntimeException(); throw new RuntimeException(e);
}
for (int i = 0; i < n.getArgs().length; i++) {
if (n.getArgs()[i] != null) {
OpApplNode res = visitExprOrOpArgNode(n.getArgs()[i]);
if (res != null) {
n.getArgs()[i] = res;
}
}
} }
// n.setOperator(constantOverrideTable.get(s)); // n.setOperator(constantOverrideTable.get(s));
return newNode; return newNode;
} }
break; break;
} }
case FormalParamKind: // Params are not global in the module case FormalParamKind: // Params are not global in the module
case VariableDeclKind: // TODO try to override variable case VariableDeclKind: // TODO try to override variable
break; break;
case BuiltInKind:// Buildin operator can not be overridden by in the case BuiltInKind: // Buildin operator can not be overridden by in the configuration file
// configuration file replaceArgs(n.getBdedQuantBounds()); // ins
ExprNode[] ins = n.getBdedQuantBounds();
if (ins != null) {
for (int i = 0; i < ins.length; i++) {
OpApplNode res = visitExprOrOpArgNode(ins[i]);
if (res != null) {
ins[i] = res;
}
}
}
break; break;
case UserDefinedOpKind: { case UserDefinedOpKind: {
Map<OpDefNode, OpDefNode> operatorOverrides = conEval.getOperatorOverrides();
OpDefNode operator = (OpDefNode) n.getOperator(); OpDefNode operator = (OpDefNode) n.getOperator();
if (!operatorOverrideTable.containsKey(operator.getSource()) if (!operatorOverrides.containsKey(operator.getSource()) && !operatorOverrides.containsKey(operator))
&& !operatorOverrideTable.containsKey(operator))
break; break;
SymbolNode newOperator; SymbolNode newOperator;
// IF there are two override statements in the configuration file // IF there are two override statements in the configuration file
//(a: Add <- (Rule) Add2, b: R1!Add <- Add3) //(a: Add <- (Rule) Add2, b: R1!Add <- Add3)
// TLC uses variant a) overriding the source definition // TLC uses variant a) overriding the source definition
if (operatorOverrideTable.containsKey(operator.getSource())) { if (operatorOverrides.containsKey(operator.getSource())) {
newOperator = operatorOverrideTable.get(operator.getSource()); newOperator = operatorOverrides.get(operator.getSource());
} else { } else {
newOperator = operatorOverrideTable.get(operator); newOperator = operatorOverrides.get(operator);
} }
OpApplNode newNode = null; OpApplNode newNode;
OpDefNode def = (OpDefNode) n.getOperator();
try { try {
newNode = new OpApplNode(newOperator, n.getArgs(), newNode = new OpApplNode(newOperator, n.getArgs(), n.getTreeNode(),
n.getTreeNode(), def.getOriginallyDefinedInModuleNode()); ((OpDefNode) n.getOperator()).getOriginallyDefinedInModuleNode());
} catch (AbortException e) { } catch (AbortException e) {
e.printStackTrace(); throw new RuntimeException(e);
}
for (int i = 0; i < n.getArgs().length; i++) {
if (n.getArgs()[i] != null) {
OpApplNode res = visitExprOrOpArgNode(n.getArgs()[i]);
if (res != null) {
n.getArgs()[i] = res;
}
}
} }
// n.setOperator(constantOverrideTable.get(s)); // n.setOperator(constantOverrideTable.get(s));
return newNode; return newNode;
} }
} }
replaceArgs(n.getArgs());
return null;
}
for (int i = 0; i < n.getArgs().length; i++) { private void replaceArgs(ExprOrOpArgNode[] args) {
if (n.getArgs()[i] != null) { if (args != null) {
ExprOrOpArgNode arg = n.getArgs()[i]; for (int i = 0; i < args.length; i++) {
if (arg != null) { if (args[i] != null) {
OpApplNode res = visitExprOrOpArgNode(n.getArgs()[i]); OpApplNode res = visitExprOrOpArgNode(args[i]);
if (res != null) { if (res != null) {
n.getArgs()[i] = res; args[i] = res;
} }
} }
} }
} }
return null;
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment