added a expression traversal

This commit is contained in:
hneemann 2018-03-29 12:46:40 +02:00
parent c8090510ff
commit 9d628be2ce
9 changed files with 85 additions and 0 deletions

View File

@ -7,6 +7,7 @@ package de.neemann.digital.hdl.model2;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.hdl.model2.expression.Expression; import de.neemann.digital.hdl.model2.expression.Expression;
import de.neemann.digital.hdl.model2.expression.Visitor;
import de.neemann.digital.hdl.printer.CodePrinter; import de.neemann.digital.hdl.printer.CodePrinter;
import java.io.IOException; import java.io.IOException;
@ -185,4 +186,13 @@ public abstract class HDLNode {
* @param expression the expression to use instead * @param expression the expression to use instead
*/ */
public abstract void replaceNetByExpression(HDLNet net, Expression expression); public abstract void replaceNetByExpression(HDLNet net, Expression expression);
/**
* Traverses all expressions
*
* @param visitor the visitor
* @param <V> the type of the visitor
* @return the visitor for chained calls
*/
public abstract <V extends Visitor> V traverseExpressions(V visitor);
} }

View File

@ -9,6 +9,7 @@ package de.neemann.digital.hdl.model2;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.hdl.model2.expression.ExprVar; import de.neemann.digital.hdl.model2.expression.ExprVar;
import de.neemann.digital.hdl.model2.expression.Expression; import de.neemann.digital.hdl.model2.expression.Expression;
import de.neemann.digital.hdl.model2.expression.Visitor;
import de.neemann.digital.hdl.printer.CodePrinter; import de.neemann.digital.hdl.printer.CodePrinter;
import java.io.IOException; import java.io.IOException;
@ -61,6 +62,12 @@ public class HDLNodeAssignment extends HDLNode {
expression.replace(oldNet, new ExprVar(newNet)); expression.replace(oldNet, new ExprVar(newNet));
} }
@Override
public <V extends Visitor> V traverseExpressions(V visitor) {
expression.traverse(visitor);
return visitor;
}
@Override @Override
public void replaceNetByExpression(HDLNet net, Expression expression) { public void replaceNetByExpression(HDLNet net, Expression expression) {
expression.replace(net, expression); expression.replace(net, expression);

View File

@ -8,6 +8,7 @@ package de.neemann.digital.hdl.model2;
import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.hdl.model2.expression.ExprVar; import de.neemann.digital.hdl.model2.expression.ExprVar;
import de.neemann.digital.hdl.model2.expression.Expression; import de.neemann.digital.hdl.model2.expression.Expression;
import de.neemann.digital.hdl.model2.expression.Visitor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
@ -36,6 +37,13 @@ public class HDLNodeBuildIn extends HDLNode implements Iterable<HDLNodeBuildIn.I
ia.replaceNetByExpression(net, expression); ia.replaceNetByExpression(net, expression);
} }
@Override
public <V extends Visitor> V traverseExpressions(V visitor) {
for (InputAssignment ia : this)
ia.traverseExpressions(visitor);
return visitor;
}
HDLNode createExpressions() { HDLNode createExpressions() {
for (HDLPort in : getInputs()) for (HDLPort in : getInputs())
inputAssignement.add(new InputAssignment(in.getName(), new ExprVar(in.getNet()))); inputAssignement.add(new InputAssignment(in.getName(), new ExprVar(in.getNet())));
@ -95,5 +103,9 @@ public class HDLNodeBuildIn extends HDLNode implements Iterable<HDLNodeBuildIn.I
private void rename(HDLModel.Renaming renaming) { private void rename(HDLModel.Renaming renaming) {
name = renaming.checkName(name); name = renaming.checkName(name);
} }
private <V extends Visitor> void traverseExpressions(V visitor) {
expression.traverse(visitor);
}
} }
} }

View File

@ -8,6 +8,7 @@ package de.neemann.digital.hdl.model2;
import de.neemann.digital.core.wiring.Splitter; import de.neemann.digital.core.wiring.Splitter;
import de.neemann.digital.hdl.model2.expression.ExprVar; import de.neemann.digital.hdl.model2.expression.ExprVar;
import de.neemann.digital.hdl.model2.expression.Expression; import de.neemann.digital.hdl.model2.expression.Expression;
import de.neemann.digital.hdl.model2.expression.Visitor;
import de.neemann.digital.hdl.printer.CodePrinter; import de.neemann.digital.hdl.printer.CodePrinter;
import java.io.IOException; import java.io.IOException;
@ -71,6 +72,13 @@ public class HDLNodeSplitterManyToOne extends HDLNode implements Iterable<HDLNod
p.replace(net, expression); p.replace(net, expression);
} }
@Override
public <V extends Visitor> V traverseExpressions(V visitor) {
for (SplitterAssignment p : this)
p.traverseExpressions(visitor);
return visitor;
}
@Override @Override
public Iterator<SplitterAssignment> iterator() { public Iterator<SplitterAssignment> iterator() {
return outputs.iterator(); return outputs.iterator();
@ -123,5 +131,9 @@ public class HDLNodeSplitterManyToOne extends HDLNode implements Iterable<HDLNod
else else
expression.replace(net, expr); expression.replace(net, expr);
} }
private void traverseExpressions(Visitor visitor) {
expression.traverse(visitor);
}
} }
} }

View File

@ -7,6 +7,7 @@ package de.neemann.digital.hdl.model2;
import de.neemann.digital.core.wiring.Splitter; import de.neemann.digital.core.wiring.Splitter;
import de.neemann.digital.hdl.model2.expression.Expression; import de.neemann.digital.hdl.model2.expression.Expression;
import de.neemann.digital.hdl.model2.expression.Visitor;
import de.neemann.digital.hdl.printer.CodePrinter; import de.neemann.digital.hdl.printer.CodePrinter;
import java.io.IOException; import java.io.IOException;
@ -56,6 +57,11 @@ public class HDLNodeSplitterOneToMany extends HDLNode {
public void replaceNetByExpression(HDLNet net, Expression expression) { public void replaceNetByExpression(HDLNet net, Expression expression) {
} }
@Override
public <V extends Visitor> V traverseExpressions(V visitor) {
throw new RuntimeException("HDLNodeSplitterOneToMany is not expression based!");
}
/** /**
* @return the source signals name * @return the source signals name
*/ */

View File

@ -48,4 +48,9 @@ public class ExprNot implements Expression {
expr.replace(net, expression); expr.replace(net, expression);
} }
@Override
public void traverse(Visitor visitor) {
visitor.visit(this);
expr.traverse(visitor);
}
} }

View File

@ -87,4 +87,10 @@ public class ExprOperate implements Expression {
} }
} }
@Override
public void traverse(Visitor visitor) {
visitor.visit(this);
for (Expression o : operands)
o.traverse(visitor);
}
} }

View File

@ -21,6 +21,15 @@ public interface Expression extends Printable {
*/ */
void replace(HDLNet net, Expression expression); void replace(HDLNet net, Expression expression);
/**
* Traverses all expressions
*
* @param visitor the visitor
*/
default void traverse(Visitor visitor) {
visitor.visit(this);
}
/** /**
* Help er to check if a expression is a net reference * Help er to check if a expression is a net reference
* *

View File

@ -0,0 +1,18 @@
/*
* Copyright (c) 2018 Helmut Neemann.
* Use of this source code is governed by the GPL v3 license
* that can be found in the LICENSE file.
*/
package de.neemann.digital.hdl.model2.expression;
/**
* Visitor to visit all expressions
*/
public interface Visitor {
/**
* Visited by all expressions
*
* @param expression the expression
*/
void visit(Expression expression);
}