summaryrefslogtreecommitdiff
path: root/graph/src/main
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-09-21 22:53:49 -0700
committerCliff Click <cliffc@acm.org>2026-09-21 22:53:49 -0700
commit92e3013a4cab12747af9d5484e7caad6fc454b1e (patch)
treea3137dd95038c3487848c355a0c7053f4a518721 /graph/src/main
parente48d59474230869ba81c1712128c01fd822946f5 (diff)
downloadSimple-92e3013a4cab12747af9d5484e7caad6fc454b1e.tar.gz
Simple-92e3013a4cab12747af9d5484e7caad6fc454b1e.zip
Switch over to the new ELK driver
Interact between compiler & browser now hooks several nbew places.
Diffstat (limited to 'graph/src/main')
-rw-r--r--graph/src/main/java/com/seaofnodes/graph/GraphEvent.java10
-rw-r--r--graph/src/main/java/com/seaofnodes/graph/GraphJson.java16
-rw-r--r--graph/src/main/java/com/seaofnodes/graph/GraphObserver.java19
3 files changed, 43 insertions, 2 deletions
diff --git a/graph/src/main/java/com/seaofnodes/graph/GraphEvent.java b/graph/src/main/java/com/seaofnodes/graph/GraphEvent.java
new file mode 100644
index 00000000..7d889b21
--- /dev/null
+++ b/graph/src/main/java/com/seaofnodes/graph/GraphEvent.java
@@ -0,0 +1,10 @@
+package com.seaofnodes.graph;
+
+/** IDs refer to nodes in this compilation; near may include nodes since deleted. */
+public record GraphEvent(Kind kind, long peep, long up, String phase,
+ int node, int repl, int[] near) {
+ public enum Kind { BEFORE, RETURN, APPLY, PHASE }
+
+ public GraphEvent { near = near.clone(); }
+ @Override public int[] near() { return near.clone(); }
+}
diff --git a/graph/src/main/java/com/seaofnodes/graph/GraphJson.java b/graph/src/main/java/com/seaofnodes/graph/GraphJson.java
index 440be034..c27076d3 100644
--- a/graph/src/main/java/com/seaofnodes/graph/GraphJson.java
+++ b/graph/src/main/java/com/seaofnodes/graph/GraphJson.java
@@ -8,10 +8,22 @@ public class GraphJson {
return sb.toString();
}
- public static String frame(GraphSnapshot snap, int pos) {
+ public static String frame(GraphSnapshot snap, int pos, GraphEvent evt) {
var sb = new StringBuilder("{\"snap\":");
snap(sb, snap);
- sb.append(",\"pos\":").append(pos);
+ sb.append(",\"pos\":").append(pos).append(",\"evt\":{\"kind\":");
+ str(sb, evt.kind().name());
+ sb.append(",\"peep\":").append(evt.peep()).append(",\"up\":").append(evt.up())
+ .append(",\"phase\":");
+ str(sb, evt.phase());
+ sb.append(",\"node\":").append(evt.node()).append(",\"repl\":").append(evt.repl())
+ .append(",\"near\":[");
+ int[] near = evt.near();
+ for( int i = 0; i < near.length; i++ ) {
+ if( i > 0 ) sb.append(',');
+ sb.append(near[i]);
+ }
+ sb.append("]}");
return sb.append('}').toString();
}
diff --git a/graph/src/main/java/com/seaofnodes/graph/GraphObserver.java b/graph/src/main/java/com/seaofnodes/graph/GraphObserver.java
new file mode 100644
index 00000000..24879fe2
--- /dev/null
+++ b/graph/src/main/java/com/seaofnodes/graph/GraphObserver.java
@@ -0,0 +1,19 @@
+package com.seaofnodes.graph;
+
+/** Optional, compilation-owned observer. Callbacks read the IR without changing it. */
+public abstract class GraphObserver<N> {
+ public abstract void before(N node);
+
+ /**
+ * repl is null for no progress. applied means substitution and cleanup are
+ * complete; otherwise repl is being returned for the caller to attach.
+ * Calls nest when a rewrite invokes another peephole.
+ */
+ public abstract void after(N node, N repl, boolean applied);
+
+ /** A completed compiler phase. */
+ public abstract void phase(String phase);
+
+ /** A rule consulted a dependency, even if already registered or adjacent. */
+ public void dep(N node, N def) {}
+}