summaryrefslogtreecommitdiff
path: root/chapter01
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-10-01 12:01:57 -0700
committerCliff Click <cliffc@acm.org>2026-10-01 12:01:57 -0700
commit5ea32e69433d0c850d02bbc1e6c4a260bc095fec (patch)
treeba4917ded278097332ee8f9f33227be74d3ac104 /chapter01
parentbf7f603dd4e8ec781fe578243cdc18180322420b (diff)
downloadSimple-5ea32e69433d0c850d02bbc1e6c4a260bc095fec.tar.gz
Simple-5ea32e69433d0c850d02bbc1e6c4a260bc095fec.zip
Move debug printing into shared space
Same as the graph viewer, moves a lot of code out of all Nodes
Diffstat (limited to 'chapter01')
-rw-r--r--chapter01/pom.xml1
-rw-r--r--chapter01/src/main/java/com/seaofnodes/simple/node/ConstantNode.java4
-rw-r--r--chapter01/src/main/java/com/seaofnodes/simple/node/Node.java18
-rw-r--r--chapter01/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java28
4 files changed, 13 insertions, 38 deletions
diff --git a/chapter01/pom.xml b/chapter01/pom.xml
index 5151e8c4..567f221f 100644
--- a/chapter01/pom.xml
+++ b/chapter01/pom.xml
@@ -13,5 +13,6 @@
<name>Chapter 1</name>
<properties>
<simple.graph.directory>${project.basedir}/../graph</simple.graph.directory>
+ <simple.print.directory>${project.basedir}/../print</simple.print.directory>
</properties>
</project>
diff --git a/chapter01/src/main/java/com/seaofnodes/simple/node/ConstantNode.java b/chapter01/src/main/java/com/seaofnodes/simple/node/ConstantNode.java
index 21f65084..01d9cbe1 100644
--- a/chapter01/src/main/java/com/seaofnodes/simple/node/ConstantNode.java
+++ b/chapter01/src/main/java/com/seaofnodes/simple/node/ConstantNode.java
@@ -16,6 +16,10 @@ import com.seaofnodes.simple.Parser;
*/
public class ConstantNode extends Node {
+ @Override public String label() { return "Con"; }
+ @Override protected String format() { return Long.toString(_value); }
+ @Override protected String repeatName() { return null; }
+
public final long _value;
public ConstantNode(long value) {
diff --git a/chapter01/src/main/java/com/seaofnodes/simple/node/Node.java b/chapter01/src/main/java/com/seaofnodes/simple/node/Node.java
index 5d74e206..ed88e86e 100644
--- a/chapter01/src/main/java/com/seaofnodes/simple/node/Node.java
+++ b/chapter01/src/main/java/com/seaofnodes/simple/node/Node.java
@@ -1,5 +1,7 @@
package com.seaofnodes.simple.node;
+import com.seaofnodes.print.BaseNode;
+
import java.util.*;
/**
@@ -7,14 +9,7 @@ import java.util.*;
* The Node class provides common functionality used by all subtypes.
* Subtypes of Node specialize by overriding methods.
*/
-public abstract class Node {
-
- /**
- * Each node has a unique dense Node ID within a compilation context
- * The ID is useful for debugging, for using as an offset in a bitvector,
- * as well as for computing equality of nodes (to be implemented later).
- */
- public final int _nid;
+public abstract class Node extends BaseNode<Node> {
/**
* Inputs to the node. These are use-def references to Nodes.
@@ -44,7 +39,7 @@ public abstract class Node {
private static int UNIQUE_ID = 1;
protected Node(Node... inputs) {
- _nid = UNIQUE_ID++; // allocate unique dense ID
+ super(UNIQUE_ID++); // allocate unique dense ID
_inputs = new ArrayList<>();
Collections.addAll(_inputs,inputs);
_outputs = new ArrayList<>();
@@ -62,13 +57,12 @@ public abstract class Node {
public int nIns() { return _inputs.size(); }
+ public Node out(int i) { return _outputs.get(i); }
+
public int nOuts() { return _outputs.size(); }
public boolean isUnused() { return nOuts() == 0; }
- public boolean isCFG() { return false; }
-
-
/**
* Used to allow repeating tests in the same JVM. This just resets the
* Node unique id generator, and is done as part of making a new Parser.
diff --git a/chapter01/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java b/chapter01/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
index 59275832..20ee6aed 100644
--- a/chapter01/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
+++ b/chapter01/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
@@ -1,43 +1,19 @@
package com.seaofnodes.simple.print;
import com.seaofnodes.graph.GraphAdapter;
-import com.seaofnodes.graph.GraphSnapshot;
import com.seaofnodes.graph.GraphSnapshot.*;
import com.seaofnodes.simple.node.*;
import com.seaofnodes.simple.node.Node;
-import java.util.ArrayList;
/** Chapter 1's view of the IR; browser, transport and layout are shared. */
public class SimpleGraphAdapter extends GraphAdapter<Node> {
- @Override protected boolean dead(Node n) { return false; }
- @Override protected int id(Node n) { return n._nid; }
- @Override protected int nIns(Node n) { return n.nIns(); }
- @Override protected Node in(Node n, int idx) { return n.in(idx); }
- @Override protected int nOuts(Node n) { return n.nOuts(); }
- @Override protected Node out(Node n, int idx) { return n._outputs.get(idx); }
- private ArrayList<Edge> edges(Node n) {
- var edges = new ArrayList<Edge>();
- for( int i = 0; i < n.nIns(); i++ ) {
- String name = null;
- edges.add(new Edge(i, ref(n.in(i)), role(n, i), name));
- }
- return edges;
- }
-
- @Override protected GraphSnapshot.Node desc(Node n) {
- Projection proj = null;
- String label = n instanceof ConstantNode c ? Long.toString(c._value) : n.getClass().getSimpleName();
- return new GraphSnapshot.Node(n._nid, label == null ? n.getClass().getSimpleName() : label,
- null, kind(n), edges(n), proj);
- }
-
- private Kind kind(Node n) {
+ @Override protected Kind kind(Node n) {
if( n instanceof StartNode ) return Kind.CTRL;
return n.isCFG() ? Kind.CTRL : Kind.DATA;
}
- private Role role(Node n, int i) {
+ @Override protected Role role(Node n, int i) {
if( n instanceof ConstantNode ) return Role.ASSOC;
if( i == 0 ) return Role.CTRL;
return Role.DATA;