|
| 1 | +from pydot import Dot, Edge, Node, Graph, Cluster |
| 2 | +class CCluster(Cluster): # Connectable Cluster |
| 3 | + def __init__(self, *args, **kwargs): |
| 4 | + Cluster.__init__(self, *args, **kwargs) |
| 5 | + self._connect_node_ = addNode(self, "_connect_node_", label="", |
| 6 | + shape="none", width=0, height=0, margin=0) |
| 7 | + |
| 8 | +def addNode(g: Graph|CCluster, name, **args): |
| 9 | + if "label" not in args: args["label"] = name |
| 10 | + n = Node(g.get_name()+name, **args) |
| 11 | + g.add_node(n) |
| 12 | + return n |
| 13 | +def addEdge(g: Graph, n1: Node|CCluster, n2: Node|CCluster, **args): |
| 14 | + if isinstance(n1, CCluster): l = n1._connect_node_; args["ltail"] = n1.get_name() |
| 15 | + else: l = n1 |
| 16 | + if isinstance(n2, CCluster): r = n2._connect_node_; args["lhead"] = n2.get_name() |
| 17 | + else: r = n2 |
| 18 | + g.add_edge(Edge(l.get_name(), r.get_name(), **args)) |
| 19 | +def addCluster(g: Graph|CCluster, name, **args): |
| 20 | + if "label" not in args: args["label"] = name |
| 21 | + s=CCluster(g.get_name()+name, **args) |
| 22 | + g.add_subgraph(s) |
| 23 | + return s |
| 24 | +def add(g: Graph, item: Node|Edge|Graph): |
| 25 | + if isinstance(item, Node): g.add_node(item) |
| 26 | + elif isinstance(item, Edge): g.add_edge(item) |
| 27 | + elif isinstance(item, CCluster): g.add_subgraph(item) |
| 28 | + return item |
| 29 | +def Cluster_init(self, name, **args): |
| 30 | + # args["cluster"] = True |
| 31 | + if "label" not in args: args["label"] = name |
| 32 | + CCluster.__init__(self, name, **args) |
| 33 | + |
| 34 | +graph = Dot(label="Deterministic Checkpoint Dependency Graph", bgcolor="transparent", splines="line", compound=True) |
| 35 | +graph.set_node_defaults(shape="box") |
| 36 | +graph.set_edge_defaults(color="#00000044") |
| 37 | + |
| 38 | + |
| 39 | +riscv64_cc = addNode(graph, "riscv64-cc") |
| 40 | +riscv64_libc_static = addNode(graph, "riscv64-libc-static") |
| 41 | +riscv64_fortran = addNode(graph, "riscv64-fortran") |
| 42 | +riscv64_jemalloc = addNode(graph, "riscv64-jemalloc") |
| 43 | + |
| 44 | +spec2006 = addCluster(graph, "spec2006", cluster=True) |
| 45 | +checkpoints = addNode(graph, "checkpoints") |
| 46 | + |
| 47 | +openblas = addNode(graph, "openblas") |
| 48 | +checkpoints_openblas = addNode(graph, "checkpoints-openblas") |
| 49 | + |
| 50 | +class ImgBuilder(CCluster): |
| 51 | + class GCPT(CCluster): |
| 52 | + class OpenSBI(CCluster): |
| 53 | + class Linux(CCluster): |
| 54 | + class InitRamFs(CCluster): |
| 55 | + class Base(CCluster): |
| 56 | + def __init__(self, **args): |
| 57 | + Cluster_init(self, "base", **args) |
| 58 | + self.gen_init_cpio = addNode(self, "gen_init_cpio") |
| 59 | + self.cpio_list = addNode(self, "cpio_list") |
| 60 | + class Overlays(CCluster): |
| 61 | + def __init__(self, **args): |
| 62 | + Cluster_init(self, "overlays", **args) |
| 63 | + self.before_workload = addNode(self, "before_workload") |
| 64 | + self.qemu_trap = addNode(self, "qemu_trap") |
| 65 | + self.nemu_trap = addNode(self, "nemu_trap") |
| 66 | + self.inittab = addNode(self, "inittab") |
| 67 | + self.run_sh = addNode(self, "run_sh", label="run.sh") |
| 68 | + def __init__(self, **args): |
| 69 | + Cluster_init(self, "initramfs", **args) |
| 70 | + self.base = self.Base(); add(self, self.base) |
| 71 | + self.overlays = self.Overlays(); add(self, self.overlays) |
| 72 | + def __init__(self, **args): |
| 73 | + Cluster_init(self, "linux", **args) |
| 74 | + self.initramfs = self.InitRamFs(); add(self, self.initramfs) |
| 75 | + self.common_build = addNode(self, "common-build") |
| 76 | + def __init__(self, **args): |
| 77 | + Cluster_init(self, "opensbi", **args) |
| 78 | + self.dts = addNode(self, "dts") |
| 79 | + self.common_build = addNode(self, "common-build") |
| 80 | + addEdge(self, self.dts, self.common_build) |
| 81 | + self.linux = self.Linux(); add(self, self.linux) |
| 82 | + def __init__(self, **args): |
| 83 | + Cluster_init(self, "gcpt", **args) |
| 84 | + self.opensbi = self.OpenSBI(); add(self, self.opensbi) |
| 85 | + def __init__(self, **args): |
| 86 | + Cluster_init(self, "imgBuilder", **args) |
| 87 | + self.riscv64_cc = addNode(self, "riscv64-cc") |
| 88 | + self.riscv64_libc_static = addNode(self, "riscv64-libc-static") |
| 89 | + self.riscv64_busybox = addNode(self, "riscv64-busybox") |
| 90 | + self.gcpt = self.GCPT(); add(self, self.gcpt) |
| 91 | + addEdge(self, self.riscv64_cc, self.gcpt.opensbi.common_build) |
| 92 | + addEdge(self, self.riscv64_cc, self.gcpt.opensbi.linux.common_build) |
| 93 | + for i in (self.riscv64_cc, self.riscv64_libc_static): |
| 94 | + overlays = self.gcpt.opensbi.linux.initramfs.overlays |
| 95 | + for j in (overlays.before_workload, overlays.qemu_trap, overlays.nemu_trap): |
| 96 | + addEdge(self, i, j) |
| 97 | + addEdge(self, self.riscv64_busybox, self.gcpt.opensbi.linux.initramfs.overlays) |
| 98 | +imgBuilder = ImgBuilder(); add(graph, imgBuilder) |
| 99 | + |
| 100 | +pkgs = addNode(graph, "pkgs") |
| 101 | +addEdge(graph, pkgs, imgBuilder.riscv64_cc) |
| 102 | +addEdge(graph, pkgs, imgBuilder.riscv64_libc_static) |
| 103 | +addEdge(graph, pkgs, imgBuilder.riscv64_busybox) |
| 104 | + |
| 105 | +class Benchmark(CCluster): |
| 106 | + def __init__(self, name, **args): |
| 107 | + Cluster_init(self, name, **args) |
| 108 | + self.run = addNode(self, "run") |
| 109 | +benchmark = Benchmark("benchmark"); add(graph, benchmark) |
| 110 | +addEdge(graph, benchmark.run, imgBuilder.gcpt.opensbi.linux.initramfs.overlays.run_sh) |
| 111 | +addEdge(graph, benchmark, imgBuilder.gcpt.opensbi.linux.initramfs) |
| 112 | + |
| 113 | +graph.write(__file__.replace("_dot.py", "_py.dot")) |
0 commit comments