Skip to content

Commit

Permalink
feat: Produce graph of internal Barretenberg dependencies (#4225)
Browse files Browse the repository at this point in the history
The graph is directed, with $A\to B$ meaning that $A$ depends on $B$.
Result:

![barretenberg_modules](https://github.com/AztecProtocol/aztec-packages/assets/26756572/5bc0745a-1b14-431f-9059-16e4b6b4a217)
A follow on could rewrite the CMakeLists.txt files to actually make use
of this minimal representation of dependencies, but that feels
unnecessary at the moment.
  • Loading branch information
codygunton authored Jan 26, 2024
1 parent 6c70548 commit 88e7923
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 0 deletions.
2 changes: 2 additions & 0 deletions barretenberg/cpp/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ CMakeUserPresets.json
acir_tests
# we may download go in scripts/collect_heap_information.sh
go*.tar.gz
barretenberg_modules.dot
barretenberg_modules.png
24 changes: 24 additions & 0 deletions barretenberg/cpp/scripts/barretenberg_module_digraph.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/usr/bin/env bash
set -eu

TMP=tmp.dot
RESULT_DOT=barretenberg_modules.dot
RESULT_PNG=barretenberg_modules.png

# initialize a directed graph for graphviz
echo digraph BarretenbergModules { > $TMP
# populate the directed graph
for file in $(find ./src/barretenberg/ -iname CMakeLists.txt); do
opening_chars=$(head -c 19 "$file")
if [ "$opening_chars" == barretenberg_module ]; then
awk -f ./scripts/barretenberg_module_digraph_edges.awk $file >> $TMP
fi
done
echo } >> $TMP

# apply transitive reduction to remove dependcies that are implied by other dependencies
cat $TMP | tred > $RESULT_DOT
rm $TMP

# produce a PNG of the graph
dot -Tpng $RESULT_DOT -o $RESULT_PNG
35 changes: 35 additions & 0 deletions barretenberg/cpp/scripts/barretenberg_module_digraph_edges.awk
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Function to extract words between parentheses
function extract_edges(line) {
match(line, /\(.*\)/); # Find the portion within parentheses
line = substr(line, RSTART + 1, RLENGTH - 2); # Extract the words
gsub(/^[ ]+/, "", line); # Remove leading spaces and tabs
gsub(/[ ]+$/, "", line); # Remove trailing spaces and tabs
gsub(/[ ]+/, " ", line); # Sub multiple spaces for a single space
split(line, modules, " "); # Split into an array of words

# If node has no dependencies, just add the node
if (length(modules)==1) {
print modules[1];
}
else { # add edges
for (i = 2; i <= length(modules); i++) {
print modules[1]" -> "modules[i];
}
}
}

# Main AWK script
{
# Concatenate lines if the opening parenthesis is not closed
while (!/\)/) {
current_line = $0;
getline;
$0 = current_line $0;
}

# Check if the line begins with "barretenberg_module". If so, extact the digraph edges
function_name = "barretenberg_module";
if ($0 ~ "^" function_name "\\(") {
extract_edges($0);
}
}

0 comments on commit 88e7923

Please sign in to comment.