mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-14 15:26:52 -04:00
added a expression traversal
This commit is contained in:
parent
c8090510ff
commit
9d628be2ce
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
*
|
||||
|
@ -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);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user