Skip to content

Commit ac06621

Browse files
committed
doc: deps: imgBuilder
1 parent 256bf5d commit ac06621

File tree

10 files changed

+138
-33
lines changed

10 files changed

+138
-33
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ backup*
88

99
# doc
1010
book
11-
*_dot.svg
11+
*_py.dot
12+
*_py.svg

.vimrc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
""" show existing tab with 2 spaces width
2+
set tabstop=2
3+
""" when indenting with '>', use 2 spaces width
4+
set shiftwidth=2

Makefile

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
doc: $(wildcard docs/*.md) docs/images/deps_dot.svg
1+
.NOTINTERMEDIATE:
2+
3+
PYSVGs=$(subst _dot.py,_py.svg,$(shell find docs/ -name "*_dot.py"))
4+
doc: $(wildcard docs/*.md) ${PYSVGs}
25
mdbook build
36

4-
%_dot.svg: %.dot
7+
%_py.dot: %_dot.py
8+
python3 $<
9+
%.svg: %.dot
510
dot -Tsvg $< -o $@
611
# css can only recognize intrinsic size in px
712
# https://developer.mozilla.org/en-US/docs/Glossary/Intrinsic_Size

docs/images/deps.dot

Lines changed: 0 additions & 23 deletions
This file was deleted.

docs/images/deps_dot.py

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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"))

docs/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# 简介(Intro)
22

3-
![](./images/deps_dot.svg)
3+
![](./images/deps_py.svg)

imgBuilder/linux/default.nix

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
inherit benchmark;
1515
};
1616
# TODO: use overlayfs to reduce disk usage
17-
linux-common-build = callPackage ./common-build.nix {inherit riscv64-cc;};
17+
common-build = callPackage ./common-build.nix {inherit riscv64-cc;};
1818
in stdenv.mkDerivation {
1919
name = "${benchmark.name}.linux";
20-
src = linux-common-build;
20+
src = common-build;
2121
buildInputs = [
2222
bc
2323
flex

imgBuilder/linux/initramfs/default.nix

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
}: let
1010
cpioPatched = cpio.overrideAttrs (old: { patches = [./cpio_reset_timestamp.patch]; });
1111
base = callPackage ./base {};
12-
initramfs_overlays = callPackage ./overlays {
12+
overlays = callPackage ./overlays {
1313
inherit riscv64-cc riscv64-libc-static riscv64-busybox;
1414
# TODO: check if `run` doest not exist, throw an error
1515
benchmark-run = benchmark.run;
@@ -19,6 +19,6 @@ in runCommand "${benchmark.name}.cpio" {} ''
1919
chmod +w $out
2020
cd ${benchmark}
2121
find . | sort -n | ${cpioPatched}/bin/cpio --reproducible -H newc -oAF $out
22-
cd ${initramfs_overlays}
22+
cd ${overlays}
2323
find . | sort -n | ${cpioPatched}/bin/cpio --reproducible -H newc -oAF $out
2424
''

imgBuilder/opensbi/default.nix

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
inherit benchmark;
1313
};
1414
dts = callPackage ./dts {};
15-
opensbi-common-build = callPackage ./common-build.nix {inherit riscv64-cc dts;};
15+
common-build = callPackage ./common-build.nix {inherit riscv64-cc dts;};
1616
in stdenv.mkDerivation {
1717
name = "${benchmark.name}.opensbi";
1818

19-
src = opensbi-common-build;
19+
src = common-build;
2020

2121
buildInputs = [
2222
python3

shell.nix

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
let
22
name = "deterministic_checkpoints";
33
pkgs = import <nixpkgs> {};
4+
my-python3 = pkgs.python3.withPackages (python-pkgs: [
5+
# for docs
6+
python-pkgs.pydot
7+
]);
48
h_content = builtins.toFile "h_content" ''
59
# ${pkgs.lib.toUpper "${name} usage tips"}
610
@@ -25,6 +29,7 @@ pkgs.mkShell {
2529
pkgs.nix-output-monitor
2630
pkgs.mdbook
2731
pkgs.graphviz
32+
my-python3
2833
];
2934
shellHook = ''
3035
h

0 commit comments

Comments
 (0)