mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-15 15:58:41 -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.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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
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
|
||||||
*
|
*
|
||||||
|
@ -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