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.hdl.model2.expression.Expression;
import de.neemann.digital.hdl.model2.expression.Visitor;
import de.neemann.digital.hdl.printer.CodePrinter;
import java.io.IOException;
@ -185,4 +186,13 @@ public abstract class HDLNode {
* @param expression the expression to use instead
*/
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.hdl.model2.expression.ExprVar;
import de.neemann.digital.hdl.model2.expression.Expression;
import de.neemann.digital.hdl.model2.expression.Visitor;
import de.neemann.digital.hdl.printer.CodePrinter;
import java.io.IOException;
@ -61,6 +62,12 @@ public class HDLNodeAssignment extends HDLNode {
expression.replace(oldNet, new ExprVar(newNet));
}
@Override
public <V extends Visitor> V traverseExpressions(V visitor) {
expression.traverse(visitor);
return visitor;
}
@Override
public void replaceNetByExpression(HDLNet net, Expression 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.hdl.model2.expression.ExprVar;
import de.neemann.digital.hdl.model2.expression.Expression;
import de.neemann.digital.hdl.model2.expression.Visitor;
import java.util.ArrayList;
import java.util.Iterator;
@ -36,6 +37,13 @@ public class HDLNodeBuildIn extends HDLNode implements Iterable<HDLNodeBuildIn.I
ia.replaceNetByExpression(net, expression);
}
@Override
public <V extends Visitor> V traverseExpressions(V visitor) {
for (InputAssignment ia : this)
ia.traverseExpressions(visitor);
return visitor;
}
HDLNode createExpressions() {
for (HDLPort in : getInputs())
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) {
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.hdl.model2.expression.ExprVar;
import de.neemann.digital.hdl.model2.expression.Expression;
import de.neemann.digital.hdl.model2.expression.Visitor;
import de.neemann.digital.hdl.printer.CodePrinter;
import java.io.IOException;
@ -71,6 +72,13 @@ public class HDLNodeSplitterManyToOne extends HDLNode implements Iterable<HDLNod
p.replace(net, expression);
}
@Override
public <V extends Visitor> V traverseExpressions(V visitor) {
for (SplitterAssignment p : this)
p.traverseExpressions(visitor);
return visitor;
}
@Override
public Iterator<SplitterAssignment> iterator() {
return outputs.iterator();
@ -123,5 +131,9 @@ public class HDLNodeSplitterManyToOne extends HDLNode implements Iterable<HDLNod
else
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.hdl.model2.expression.Expression;
import de.neemann.digital.hdl.model2.expression.Visitor;
import de.neemann.digital.hdl.printer.CodePrinter;
import java.io.IOException;
@ -56,6 +57,11 @@ public class HDLNodeSplitterOneToMany extends HDLNode {
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
*/

View File

@ -48,4 +48,9 @@ public class ExprNot implements 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);
/**
* 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
*

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);
}